web-dev-qa-db-ja.com

レンダリングベクトル以外のAS3の主要なパフォーマンスヒッターは何ですか?

ActionScript 3では、ベクターグラフィックスを使用すると、プロジェクトのパフォーマンスに大きな損害を与えることが保証されます。

すべてのグラフィックスに単一のBitmapを使用して、すべてのベクターグラフィックスの代わりにBitmapDataオブジェクトで .copyPixels() を使用すると、とんでもないパフォーマンスの向上が得られます。私のようなFlash内でゲームを開発する人々にとって不可欠です。

これを超えて、私がターゲットにし、最適化を試みるべきである次の主要なものが何であるかは本当にわかりません。私は多くの組み込み三角関数を使用していますが、それらはそれほど影響を与えないようです。近似法などで数学を最適化するライブラリがいくつかあることは知っていますが、これまでのところこれらが必要だとは思いませんでした。

他に注目すべき大規模な既知のポイントはありますか?私は自分のコーディングスタイルを改善する方法よりも、(ベクトルレンダリングを避けるなど)注意すべき組み込みのことをより言及しています。

59
Marty

参考になったドキュメントは次のとおりです。

いくつかのハイライト:

適切な表示オブジェクトの選択

メモリ使用量を制限する最も簡単な最適化のヒントの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 を使用すると、レンダリングが最適化されます。これは、ランタイムがベクターコンテンツをレンダリングするよりも画面にピクセルを描画するために必要な処理リソースが少ないためです。

Pixel Benderで処理されたフィルターを含むフィルターを使用しない

フィルターが表示オブジェクトに適用されると、ランタイムはメモリ内に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処理、メモリ、およびバッテリー寿命が節約され、低層デバイスでのコンテンツの実行が高速化されます。

VectorArray を使用

Vector クラスは、 Array クラスよりも高速な読み取りおよび書き込みアクセスを許可します。

配列要素のアクセスと反復は、配列を使用する場合よりもベクターインスタンスを使用する場合の方がはるかに高速です。

厳格モードでは、コンパイラはデータ型エラーを識別できます。

実行時の範囲チェック(または固定長チェック)は、アレイよりも信頼性を大幅に向上させます。

描画APIを使用してコードを高速に実行する

drawPath()drawGraphicsData() を使用して、コードの実行量を減らします。 drawTriangles() コードの数が少ないほど、ActionScriptの実行パフォーマンスが向上します。

イベントキャプチャとバブリングを使用して、イベントハンドラを最小限に抑えます

イベントのバブリングを利用すると、ActionScriptコードの実行時間を最適化するのに役立ちます。パフォーマンスを向上させるために、複数のオブジェクトではなく、1つのオブジェクトにイベントハンドラーを登録できます。

setVector()メソッドを使用したピクセルのペイント

ピクセルをペイントするとき、BitmapDataクラスの適切なメソッドを使用するだけで、いくつかの簡単な最適化を行うことができます。ピクセルをすばやくペイントするには、 setVector() メソッドを使用します。

lock()およびunlock()BitmapDatasetPixel()setPixel32() などの低速メソッドを使用する場合

lock() および unlock() を呼び出すと、画面が更新されなくなります。不必要に。 getPixel()getPixel32() など、ピクセルを反復処理するメソッド/、 setPixel() 、および setPixel32() 特にモバイルデバイスでは遅くなります。可能であれば、1回の呼び出しですべてのピクセルを取得するメソッドを使用します。ピクセルの読み取りには、 getVector() メソッドを使用します。これは、 getPixels()よりも高速です。 方法。また、可能であれば高速に実行される可能性が高いため、ベクターオブジェクトに依存するAPIを使用することを忘れないでください。

正規表現の代わりにStringクラスメソッドを使用する

String クラスメソッドが利用可能な場合、同等の正規表現よりも高速に実行され、別のオブジェクトを作成する必要はありません。

TextFieldsには、_+=_演算子の代わりにapendText()を使用します

appendText() メソッドを使用すると、パフォーマンスが向上します。

四角括弧演算子_[]_はパフォーマンスを低下させる可能性があります-ローカル変数に参照を保存します

角括弧演算子を使用すると、パフォーマンスが低下する可能性があります。参照をローカル変数に保存することにより、使用を避けることができます。

コードをインラインに移動して関数呼び出しの数を減らす

関数の呼び出しは高価になる可能性があります。コードをインラインに移動して、関数呼び出しの数を減らしてください。

関数呼び出しをインラインに移動すると、コードが4倍以上高速になります。

コンテンツをステージ外に配置しない

ステージ外の要素が画面に表示されず、レンダリングされない場合でも、それらは表示リストに存在します。ランタイムは引き続きこれらの要素に対して内部テストを実行し、それらがまだステージ外にあり、ユーザーが要素と対話していないことを確認します。

alphaプロパティの使用を避ける

表示オブジェクトが alpha ブレンドを使用する場合、ランタイムは、積み重ねられたすべての表示オブジェクトの色の値と背景色を組み合わせて、最終的な色を決定する必要があります。したがって、アルファブレンディングは、不透明色を描画するよりもプロセッサを集中的に使用できます。この余分な計算は、低速のデバイスでパフォーマンスを低下させる可能性があります。

最低のフレームレートを使用する

フレームレートが高いと、低いレートよりも多くのCPUサイクルとバッテリーからのエネルギーが消費されます。

ランタイムコード実行の基礎 elastic-racetrack

複雑なベクターコンテンツにビットマップキャッシュを使用する

この機能は、ベクトルオブジェクトをキャッシュし、内部でビットマップとしてレンダリングし、そのビットマップをレンダリングに使用します。キャッシュされたコンテンツが各フレームで回転、拡大縮小、または変更されない場合、ビットマップキャッシュによりレンダリングが向上します。 x軸とy軸の変換以外の変換、レンダリングは改善されません。

モバイルAIRアプリでキャッシュされたビットマップを使用するときにcacheAsBitmapMatrixプロパティを設定します

cacheAsBitmapMatrix AIRモバイルプロファイルでは、キャッシュされたビットマップを再生成することなく、オブジェクトに2次元変換を適用できます。キャッシュされたビットマップを再生成せずにalphaプロパティを変更することもできます。

BitmapDataクラスを使用して、カスタムビットマップキャッシュ動作を作成します

単一のキャッシュビットマップのみを使用すると、メモリで使用され、すべてのインスタンスで共有されます。

単一ハンドラーで_Event.ENTER_FRAME_などのイベントを分離する

この手法により、CPUリソースが節約されます。

ビットマップキャッシング機能とopaqueBackgroundプロパティを使用して、テキストレンダリングのパフォーマンスを改善します

ビットマップキャッシュ機能を使用すると、ベクターコンテンツをビットマップとしてキャッシュして、レンダリングパフォーマンスを向上させることができます。この機能は、複雑なベクターコンテンツや、処理をレンダリングする必要があるテキストコンテンツで使用する場合に役立ちます。

アルファ透明度は、透明ビットマップ画像を描画するときにランタイムに追加の負荷をかけます。 opaqueBackground プロパティを使用して、色を背景として指定することでこれをバイパスできます。

GPUハードウェアグラフィックスアクセラレーションを有効にする

モバイルプラットフォーム用のAIRでFlashコンテンツのGPUアクセラレーションを活用するには、renderMode = "ではなく renderMode =" direct " (つまり、Stage3D)を使用することをお勧めします。 gpu」。アドビは、次の Stage3D ベースのフレームワークを公式にサポートおよび推奨しています。 Starling(2D) および Away3D(3D)

HTML埋め込みパラメーターで wmode = transparentまたはwmode = opaque を使用しないでください。これらのモードでは、パフォーマンスが低下する可能性があります。また、ソフトウェアとハ​​ードウェアの両方のレンダリングで、オーディオとビデオの同期がわずかに失われる可能性があります。さらに、これらのモードが有効な場合、多くのプラットフォームはGPUレンダリングをサポートしないため、パフォーマンスが大幅に低下します。

操作の非同期バージョンを使用することを支持する

現在の実行スレッドのアプリケーションコードは実行を継続します。

非同期操作は、レンダリングの問題を回避するためにスケジュールおよび分割されます。そのため、操作の非同期バージョンを使用するレスポンシブアプリケーションを作成する方がはるかに簡単です。詳細については、知覚パフォーマンスと実際のパフォーマンスを参照してください。

レンダリングを改善するための滑らかな形状

ビットマップとは異なり、ベクターコンテンツのレンダリングには、特にグラデーションや多くのコントロールポイントを含む複雑なパスの場合、多くの計算が必要です。デザイナーまたは開発者として、形状が十分に最適化されていることを確認してください。

必要なたびにネットワークからアセットをロードするのではなく、ロード後にアセットをローカルにキャッシュします

アプリケーションがメディアやデータなどのアセットをロードする場合、アセットをローカルデバイスに保存してキャッシュします。頻繁に変更されないアセットの場合、キャッシュを定期的に更新することを検討してください。

StageVideoクラスを使用して、ハードウェアアクセラレーションを活用します

StageVideo クラスを使用して、ハードウェアアクセラレーションを利用してビデオを表示します。

このアプローチは、基礎となるビデオハードウェアを最大限に活用します。その結果、CPUの負荷が大幅に低下し、性能の低いデバイスではフレームレートが高くなり、メモリ使用量も少なくなります。

AACオーディオ形式は、同等のビットレートでmp3形式よりも優れた品質と小さなファイルサイズを提供します

ビデオのデコードと同様に、オーディオのデコードには高いCPUサイクルが必要であり、デバイスで利用可能なハードウェアを活用して最適化できます。

AAC形式は、同等のビットレートのmp3形式よりも優れた品質と小さなファイルサイズを提供します。

コンストラクターのコードを最小化

constructors などの初期化関数は解釈され、それ以外はすべてJITです。

127
Jason Sturges