ActionScript 3では、ベクターグラフィックスを使用すると、プロジェクトのパフォーマンスに大きな損害を与えることが保証されます。
すべてのグラフィックスに単一のBitmap
を使用して、すべてのベクターグラフィックスの代わりにBitmapData
オブジェクトで .copyPixels()
を使用すると、とんでもないパフォーマンスの向上が得られます。私のようなFlash内でゲームを開発する人々にとって不可欠です。
これを超えて、私がターゲットにし、最適化を試みるべきである次の主要なものが何であるかは本当にわかりません。私は多くの組み込み三角関数を使用していますが、それらはそれほど影響を与えないようです。近似法などで数学を最適化するライブラリがいくつかあることは知っていますが、これまでのところこれらが必要だとは思いませんでした。
他に注目すべき大規模な既知のポイントはありますか?私は自分のコーディングスタイルを改善する方法よりも、(ベクトルレンダリングを避けるなど)注意すべき組み込みのことをより言及しています。
参考になったドキュメントは次のとおりです。
いくつかのハイライト:
メモリ使用量を制限する最も簡単な最適化のヒントの1つは、適切なタイプの display object を使用することです。インタラクティブではない単純な形状の場合は、 Shape オブジェクトを使用します。タイムラインを必要としない interactive objects には、 Sprite オブジェクトを使用します。タイムラインを使用するアニメーションでは、 MovieClip オブジェクトを使用します。
getSize()
を使用
getSize()
は、指定されたオブジェクトのメモリ内のサイズを返します。
String を除くすべてのプリミティブタイプは、メモリで4〜8バイトを使用します。 64ビット値を表す Number は、値が割り当てられていない場合、ActionScript仮想マシン(AVM)によって8バイトが割り当てられます。動作は、文字列型によって異なります。コードをベンチマークし、タスクに最も効率的なオブジェクトを決定します。
オブジェクトを再利用してメモリを最適化し、可能な限り再作成を避けます。
オブジェクトを再利用すると、オブジェクトをインスタンス化する必要性が減ります。また、ガベージコレクタが実行される可能性が低くなり、アプリケーションの速度が低下する可能性があります。
オブジェクトが garbage collected であることを確認するには、オブジェクトへのすべての参照を削除します。オブジェクトの削除ではなく、メモリの割り当てがガベージコレクションをトリガーします。可能な限りオブジェクトを再利用して、ガベージコレクションパスを制限してください。また、可能な場合は参照をnullに設定して、ガベージコレクターがオブジェクトの検索に費やす時間を短縮します。ガベージコレクションを保険と考え、可能な場合は常にオブジェクトのライフタイムを明示的に管理します。
表示オブジェクトへの参照をnullに設定しても、オブジェクトが凍結されることは保証されません。オブジェクトは、ガベージコレクションされるまでCPUサイクルを消費し続けます。
BitmapData クラスには
dispose()
/- メソッドが含まれますが、disposeメソッドはメモリからピクセルを削除します、完全に解放するには、参照をnullに設定する必要があります。
特に多数のベクトルを使用すると、CPUまたはGPUリソースの必要性が劇的に増加します。 bitmaps を使用すると、レンダリングが最適化されます。これは、ランタイムがベクターコンテンツをレンダリングするよりも画面にピクセルを描画するために必要な処理リソースが少ないためです。
フィルターが表示オブジェクトに適用されると、ランタイムはメモリ内に2つのビットマップを作成します。外部で作成されたビットマップを使用すると、ランタイムがCPUまたはGPUの負荷を減らすのに役立ちます。
ミップマッピングは控えめに使用してください。ダウンスケールされたビットマップの品質は向上しますが、帯域幅、メモリ、速度に影響があります。
TextField
を使用読み取り専用テキストの場合、 Flash Text Engine を使用するのが最適です。これにより、メモリ使用量が少なくなり、レンダリングが改善されます。入力テキストの場合、 TextField オブジェクトの方が適しています。入力処理やワードラップなどの一般的な動作を作成するために必要なActionScriptコードが少ないためです。
ネイティブイベントモデルを使用すると、従来のコールバック関数を使用する場合よりも遅くなり、より多くのメモリを消費します。イベントオブジェクトを作成してメモリに割り当てる必要があるため、パフォーマンスが低下します。たとえば、 _
Event.ENTER_FRAME
_ イベントをリッスンすると、イベントハンドラーの各フレームに新しいイベントオブジェクトが作成されます。キャプチャおよびバブリングフェーズのために、表示オブジェクトのパフォーマンスは特に遅くなる可能性があります。これは、表示リストが複雑な場合は高価になる可能性があります。
表示オブジェクトが表示リストになく、ガベージコレクトされるのを待っている場合でも、CPUを集中的に使用するコードを使用している可能性があります。
凍結の概念は、Loaderクラスでリモートコンテンツをロードする場合にも重要です。
unloadAndStop()
メソッドを使用すると、SWFファイルをアンロードし、ロードしたSWFファイル内のすべてのオブジェクトを自動的にフリーズし、ガベージコレクターを強制的に実行できます。
Event.ACTIVATE
_および_Event.DEACTIVATE
_イベントを使用して、バックグラウンドの非アクティブを検出します_
Event.ACTIVATE
_ および _Event.DEACTIVATE
_ イベントを使用すると、ランタイムの獲得または喪失を検出できますフォーカス。その結果、コンテキストの変更に対応するようにコードを最適化できます。アクティブ化イベントと非アクティブ化イベントを使用すると、モバイルデバイスやネットブックで時々見られる「一時停止と再開」機能と同様のメカニズムを実装できます。
多くのインタラクティブなオブジェクトが画面上に表示されている場合、特にそれらが重なっている場合、マウスの操作を検出するとCPUに負荷がかかる場合があります。可能な場合は、マウス操作を無効にすることを検討してください。これにより、アプリケーションで使用するCPU処理が少なくなり、その結果、モバイルデバイスのバッテリー使用量が削減されます。
タイマーは、長時間実行されるアニメーション化されていないコンテンツの_
Event.ENTER_FRAME
_イベントよりも優先されます。タイマーは_
Event.ENTER_FRAME
_イベントと同様に動作できますが、イベントはフレームレートに関係なくディスパッチできます。この動作により、大幅な最適化が可能になります。例としてビデオプレーヤーアプリケーションを考えてみましょう。この場合、アプリケーションコントロールのみが移動するため、高いフレームレートを使用する必要はありません。
トゥイーンの使用を制限します。これにより、CPU処理、メモリ、およびバッテリー寿命が節約され、低層デバイスでのコンテンツの実行が高速化されます。
Vector
とArray
を使用Vector クラスは、 Array クラスよりも高速な読み取りおよび書き込みアクセスを許可します。
配列要素のアクセスと反復は、配列を使用する場合よりもベクターインスタンスを使用する場合の方がはるかに高速です。
厳格モードでは、コンパイラはデータ型エラーを識別できます。
実行時の範囲チェック(または固定長チェック)は、アレイよりも信頼性を大幅に向上させます。
drawPath()
、drawGraphicsData()
を使用して、コードの実行量を減らします。drawTriangles()
コードの数が少ないほど、ActionScriptの実行パフォーマンスが向上します。
イベントのバブリングを利用すると、ActionScriptコードの実行時間を最適化するのに役立ちます。パフォーマンスを向上させるために、複数のオブジェクトではなく、1つのオブジェクトにイベントハンドラーを登録できます。
setVector()
メソッドを使用したピクセルのペイントピクセルをペイントするとき、BitmapDataクラスの適切なメソッドを使用するだけで、いくつかの簡単な最適化を行うことができます。ピクセルをすばやくペイントするには、
setVector()
メソッドを使用します。
lock()
およびunlock()
BitmapData
setPixel()
やsetPixel32()
などの低速メソッドを使用する場合
lock()
およびunlock()
を呼び出すと、画面が更新されなくなります。不必要に。getPixel()
、getPixel32()
など、ピクセルを反復処理するメソッド/、setPixel()
、およびsetPixel32()
特にモバイルデバイスでは遅くなります。可能であれば、1回の呼び出しですべてのピクセルを取得するメソッドを使用します。ピクセルの読み取りには、getVector()
メソッドを使用します。これは、getPixels()
よりも高速です。 方法。また、可能であれば高速に実行される可能性が高いため、ベクターオブジェクトに依存するAPIを使用することを忘れないでください。
String
クラスメソッドを使用するString クラスメソッドが利用可能な場合、同等の正規表現よりも高速に実行され、別のオブジェクトを作成する必要はありません。
+=
_演算子の代わりにapendText()
を使用します
appendText()
メソッドを使用すると、パフォーマンスが向上します。
[]
_はパフォーマンスを低下させる可能性があります-ローカル変数に参照を保存します角括弧演算子を使用すると、パフォーマンスが低下する可能性があります。参照をローカル変数に保存することにより、使用を避けることができます。
関数の呼び出しは高価になる可能性があります。コードをインラインに移動して、関数呼び出しの数を減らしてください。
関数呼び出しをインラインに移動すると、コードが4倍以上高速になります。
ステージ外の要素が画面に表示されず、レンダリングされない場合でも、それらは表示リストに存在します。ランタイムは引き続きこれらの要素に対して内部テストを実行し、それらがまだステージ外にあり、ユーザーが要素と対話していないことを確認します。
alpha
プロパティの使用を避ける表示オブジェクトが alpha ブレンドを使用する場合、ランタイムは、積み重ねられたすべての表示オブジェクトの色の値と背景色を組み合わせて、最終的な色を決定する必要があります。したがって、アルファブレンディングは、不透明色を描画するよりもプロセッサを集中的に使用できます。この余分な計算は、低速のデバイスでパフォーマンスを低下させる可能性があります。
フレームレートが高いと、低いレートよりも多くのCPUサイクルとバッテリーからのエネルギーが消費されます。
この機能は、ベクトルオブジェクトをキャッシュし、内部でビットマップとしてレンダリングし、そのビットマップをレンダリングに使用します。キャッシュされたコンテンツが各フレームで回転、拡大縮小、または変更されない場合、ビットマップキャッシュによりレンダリングが向上します。 x軸とy軸の変換以外の変換、レンダリングは改善されません。
cacheAsBitmapMatrix
プロパティを設定します
cacheAsBitmapMatrix
AIRモバイルプロファイルでは、キャッシュされたビットマップを再生成することなく、オブジェクトに2次元変換を適用できます。キャッシュされたビットマップを再生成せずにalphaプロパティを変更することもできます。
BitmapData
クラスを使用して、カスタムビットマップキャッシュ動作を作成します単一のキャッシュビットマップのみを使用すると、メモリで使用され、すべてのインスタンスで共有されます。
Event.ENTER_FRAME
_などのイベントを分離するこの手法により、CPUリソースが節約されます。
opaqueBackground
プロパティを使用して、テキストレンダリングのパフォーマンスを改善しますビットマップキャッシュ機能を使用すると、ベクターコンテンツをビットマップとしてキャッシュして、レンダリングパフォーマンスを向上させることができます。この機能は、複雑なベクターコンテンツや、処理をレンダリングする必要があるテキストコンテンツで使用する場合に役立ちます。
アルファ透明度は、透明ビットマップ画像を描画するときにランタイムに追加の負荷をかけます。
opaqueBackground
プロパティを使用して、色を背景として指定することでこれをバイパスできます。
モバイルプラットフォーム用のAIRでFlashコンテンツのGPUアクセラレーションを活用するには、renderMode = "ではなく renderMode =" direct " (つまり、Stage3D)を使用することをお勧めします。 gpu」。アドビは、次の Stage3D ベースのフレームワークを公式にサポートおよび推奨しています。 Starling(2D) および Away3D(3D) 。
HTML埋め込みパラメーターで wmode = transparentまたはwmode = opaque を使用しないでください。これらのモードでは、パフォーマンスが低下する可能性があります。また、ソフトウェアとハードウェアの両方のレンダリングで、オーディオとビデオの同期がわずかに失われる可能性があります。さらに、これらのモードが有効な場合、多くのプラットフォームはGPUレンダリングをサポートしないため、パフォーマンスが大幅に低下します。
現在の実行スレッドのアプリケーションコードは実行を継続します。
非同期操作は、レンダリングの問題を回避するためにスケジュールおよび分割されます。そのため、操作の非同期バージョンを使用するレスポンシブアプリケーションを作成する方がはるかに簡単です。詳細については、知覚パフォーマンスと実際のパフォーマンスを参照してください。
ビットマップとは異なり、ベクターコンテンツのレンダリングには、特にグラデーションや多くのコントロールポイントを含む複雑なパスの場合、多くの計算が必要です。デザイナーまたは開発者として、形状が十分に最適化されていることを確認してください。
アプリケーションがメディアやデータなどのアセットをロードする場合、アセットをローカルデバイスに保存してキャッシュします。頻繁に変更されないアセットの場合、キャッシュを定期的に更新することを検討してください。
StageVideo
クラスを使用して、ハードウェアアクセラレーションを活用しますStageVideo クラスを使用して、ハードウェアアクセラレーションを利用してビデオを表示します。
このアプローチは、基礎となるビデオハードウェアを最大限に活用します。その結果、CPUの負荷が大幅に低下し、性能の低いデバイスではフレームレートが高くなり、メモリ使用量も少なくなります。
ビデオのデコードと同様に、オーディオのデコードには高いCPUサイクルが必要であり、デバイスで利用可能なハードウェアを活用して最適化できます。
AAC形式は、同等のビットレートのmp3形式よりも優れた品質と小さなファイルサイズを提供します。
constructors などの初期化関数は解釈され、それ以外はすべてJITです。