デバイス向けのコンテンツを開発するときは、少なくとも当面の間はデスクトップ向けのコンテンツよりも軽くする努力が必要になりそうです。その際、例えば:
- フレームレートを出来るだけ遅くする
- タイマーの多重利用を避ける
- コールバックの処理は軽く
- 可能なものは MovieClip ではなく Graphics にする
などは分かりやすい最適化かもしれませんが、
- ベクター描画よりもビットマップ
は、今までの感覚とは違うところかもしれません。
(将来の Flash Player では新しい最適化機能 & API が提供されて、ベクターでも大丈夫ってことになるかもしれませんけれど)
DisplayObject.cacheAsBitmap を使った最適化
cacheAsBitmap に true を設定すると実行時に DisplayObject をビットマップ化することが出来ます。複雑なベクターデータの描画を纏められるため、複雑な図形ほど描画パフォーマンスを向上させることが出来ます。
デバイス上ではこれによる高速化は特に効いてくるところなのですが、
- もし DisplayObject がそもそも変化しないものであれば、ビットマップデータを使用したほうがより効果的
- 頻繁に変化する DisplayObject に対して cacheAsBitmap = true をセットすると、ビットマップ化のオーバーヘッドにより逆効果になることも
という点もあります。ご参考まで。
ビットマップの使用とミップマッピング
改めて書くほどのことでもないですけれど、ビットマップを使うときは、予め小さく軽くしたものを使用して、出来るだけ実行時に縮小するといったことの無いようにします。
もし、実行時にビットマップを縮小する必要がある場合は、可能であればビットマップの大きさをミットマッピングが出来る大きさにすることが望ましいとされています。ミットマッピングは Flash Player 9 から追加されている機能で、ビットマップを描画する際の品質とパフォーマンスを向上するものです。品質に関してはこちらのデモが分かりやすいかもです。
Flash Player に搭載されているミップマッピングは box filtering と言われる一番単純なものです。PNG, JPEG 等の静的なビットマップにのみ適用され、実行時に cacheAsBitmap の指定により作られるビットマップには適用されません。詳しくは ActionScript のヘルプをご覧ください。(Adobe ActionScript 3.0 * ミップマッピングの利用)
Mip マップを有効に活用するには、画像の幅と高さを 2 で何回も割れる数値にします。例えば、512 × 256 は非常にミップマッピング向きですが、510 × 256 はそうでもありません (一度しか割れないので)。
デバイスは機種により PPI が大きく異なります。例えば Experia X10 のインチあたりのピクセル数は iPhone 3GS のほぼ倍、そのため同じ画像でも Experia X10 では iPhone 3GS の半分程度の大きさで表示されることになります。
デバイス向けコンテンツでは、同じ画像を縮小率を変えながら使いまわすケースも多くなるかもしれません。心に留めておくと少しは役に立つことがあるかもです。
コメントする