Strippersの社内ライブラリのTweenが遅くて、結局TweenerとかTweensyとかを使うことになったりするので、こう現状の使い勝手を担保しつつできるだけ高速化しようと、いろいろ調整中。社内ライブラリは結構前に作ったもので、ちなみに純正のTweenクラスを使っていました。今回の高速化作業の過程で気がついたことのメモ。

以下、新しく作っているクラスをTweenStとします。

* できるだけTimerとかのインスタンスの生成を減らすべき。new TweenSt()とかするたびに、内部でTimerを生成すると遅いので、static変数としてTimerのインスタンスを作って、それにaddEventListenerをしていったほうが高速。
* 上のようなことをする場合、TimerよりもSpriteのインスタンスを作って、ENTER_FRAMEイベントをaddEventListenerする方が速い。6000個の関数をaddEventListenerで呼ばせたときに、3fps程度違った。
* 時間の差分を取得するためのミリセコンドは、new Date().getTime()を毎回するよりは、import flash.utils.getTimer; をインポートして、getTimer()を実行した方が、気持ち早い。と思っていたら、Kayacさんがすでにテストしていた。ただ、上の2つほど明確な差はない感じです。
* 特にたくさんのオブジェクトを動かすとき、関数などを大量に含んだ重たいクラスをnewしまくるのではなく、必要なデータだけを持ったクラスをnewするようにして、それらをコントロールするstatic、あるいはシングルトンなクラスを用意して、そこから全てを制御するようにする。こうして、TweenStはstaticな関数を定義したクラスで、Tweenで変化する値の保持はTweenStParamというクラスに定義するようになった。TweenSt.add(new TweenStParam(mc, “x”, start_x, end_x, sec, easing, delay, feedback)); のような感じで使う。
* Tweenの最中、終了・中間などで、dispatchEvent(new Event())みたいにイベントを発生させても何千という単位で動かすと確実にフレームレートが落ちる。

結果的にできたものが、TweensyZeroとほとんど同じ構成になった。スピードもあまり変わらないが、個人的には自分で作った方が使いやすいのでまぁ、満足。定義したTweenを一個ずつ逆回転にできたりとかなんかするし。Tweenerよりは全然速いし。

あと、上のでTweenStParamもやめて全部TweenSt内の配列で管理したらより速くなるんじゃないかと思いはじめ、書きなおしてみたけど、明らかに遅くなってしまった。

具体的には、TweenStParamクラス内のプロパティであったdurationだとかeasingだとかといった要素を全部TweenSt2.I_durations[tween_id]みたいな感じで置き換えていった。もしかしたら、数字の配列ならもう少し早いかもしれないけど、たくさんのHashからidでアイテムを引き出すよりは、ある程度はクラスにまとめた方が速いということかしら。

とりあえず1500個 MovieClipで移動・拡大のTweenで45~50fps程度出るようになったのでひと段落。あとはどこをいじったら早くなるのかな。TweensyZeroよりは早いが、TweensyやTweenMaxよりは5fps程度遅い。でも不便になるのもいやだしなぁ。

— (via w41)