アファメーションで独立・起業・夢実現。「いきなり!社長宣言!!」-“夢は口に出すことで実現する!”というアファメーション:ライブラリー

2009年10月21日

「ビットマップとしてキャッシュ」する。(cacheAsBitmap)

夢実現のアファメーションを実践する起業家にもっとも読まれているブログは?

フラッシュアニメーションが…遅い。

フラッシュのいいところは、基本ベクターデータなので、ファイルサイズが小さくて、動作が軽いということ。

んが。

それは描画されるオブジェクトのアニメーションの量とかによって変わるみたい。

たとえば、複雑なベクターデータを含むオブジェクトを50個とか100個とか…それ以上を動かそうとすると、とたんに動きが悪くなる。

っつか、尋常じゃないくらい動きが遅くなるので、実用に耐えられない。
(特に、フルスクリーンモードで顕著に影響が出る模様。)

魔法のおまじない。cacheAsBitMap

そこで、一度描画したものをビットマップとしてメモリにキャッシュして動かすと…あら不思議。サクサクとうごくじゃありませんか!w
※実際の処理速度(fps)はマシンのスペックに依存します。

例:
_mc.cacheAsBitmap = true;

読んで字のごとく「ビットマップとしてキャッシュ」でっす!

参考:
http://casualplay.net/blog/2005/11/_cacheasbitmap_1.html


んじゃ、何でもかんでも「ビットマップとしてキャッシュ」すりゃいいのかっつーとそうでもなくて、xとかyとかが変化する…つまり移動させるアニメーションには効果的だけど、拡大とかアルファを変化させるようなアニメーションだと、逆に遅くなるみたい。


参考サイトがAS2だったので、AS3で実験する場合はこちら↓。
※ライブラリにあるMCに、リンケージでクラス名「croudMc」を指定。
ステージ上にはキャッシュONOFF用のボタン「_btn」とFPS表示用の「fps_txt」を配置。

var croudArray:Array = new Array();

var sWidth:uint = stage.stageWidth;
var sHeight:uint = stage.stageHeight;
var maxNum:uint = 200;

for(var i:uint=0; i<maxNum; i++) {
var croud_mc:croudMc = new croudMc();
croudArray[i] = croud_mc;
croudArray[i].x = sWidth*Math.random();
croudArray[i].y = sHeight*Math.random();
var scaleNum = 1.5*Math.random()+0.5;
croudArray[i].scaleX = croudArray[i].scaleY = scaleNum;
croudArray[i].speed = 20*Math.random()-10;
stage.addChild(croudArray[i]);
croudArray[i].addEventListener(Event.ENTER_FRAME,mcMove);
}

stage.addChild(_btn);
_btn.addEventListener(MouseEvent.CLICK,switchCache);

function mcMove(evt:Event):void {
var targetMc = evt.target as MovieClip;
if(evt.target.speed >= 0) {
if(targetMc.x >= 550) {
targetMc.x = -targetMc.width;
}
} else {
if(targetMc.x <-targetMc.width) {
targetMc.x = sWidth;
}
}
targetMc.x += targetMc.speed;
}

function switchCache(evt:MouseEvent):void {
for (var i:uint = 0; i < maxNum; i++) {
croudArray[i].cacheAsBitmap = !croudArray[i].cacheAsBitmap;
}
}

var countNum:uint = 0;
var oldTimer:uint = getTimer();

stage.addChild(fps_txt);
stage.addEventListener(Event.ENTER_FRAME ,countFps);

function countFps(evt:Event) {
countNum += 1;
if (getTimer()-oldTimer >= 1000) {
fps_txt.text = String(countNum) + "fps";
oldTimer = getTimer();
countNum = 0;
}
}

サンプルはこちら

(うげぇーきもちわりぃw)

ってことで、一応備忘録のためにメモ。

この記事に関連する(かもしれない)書籍

 

投稿者 kuro : 2009年10月21日 12:44 | ID:804

ページトップ△

ページトップ△