Laya パフォーマンス最適化の選択されたコンテンツのコンパイル

1 つ目は、 LayaAirエンジンの組み込みパフォーマンス統計ツールであるパフォーマンス統計ツールです。Laya.Stat.show(); をコードに追加します。

エンジン内蔵のパフォーマンス統計ツール

このツールを開いた後、パフォーマンスを観察するために使用できます。FPS が高いほど優れていることに加えて、他の値が低いほど優れています。ここでは DrawCall の数に特に注意してください。これは重要な最適化指標です。100 未満に制御するようにしてください。

2 番目は、DebugPanel デバッグ ツールです。これも、LayaAir エンジンに付属のデバッグ ツールです。DIV デバッグ ウィンドウに似ており、ページ上の各サブ要素を確認できます。要素の属性を表示および変更し、再描画を表示することで、この領域では、プロジェクトの最適化と開発を促進できます。ステージを初期化した後、DebugPanel.init() を通じて開きます。(具体的な使用方法については、Layabox 公式 Web サイトのドキュメントの詳細な手順を参照してください。)

DebugPanel デバッグ ツール

3 つ目は Chrome パフォーマンス アナライザーです。Chrome は、H5 ゲームで一般的に使用される開発およびデバッグ環境です。パフォーマンス アナライザーのプロファイルは、ゲーム開発者にとって最も重要な最適化ツールの 1 つです。通常、メモリと CPU の使用状況を分析および確認するために使用されます。ターゲットを絞った最適化を実行するため。(Layabox 公式 Web サイトのドキュメントに詳細な手順が記載されています)

Chrome パフォーマンス アナライザー プロファイル

最適化: DrawCall を減らす

1. クロスレンダリングを避ける

DrawCall を減らすには、まず基礎となるレンダリング原理を理解する必要があります。隣接する同一のアトラスはレンダリング中に自動的にマージされるため、DrawCall が削減されます。したがって、アトラス内の画像のレンダリング順序が互いに隣り合うように注意する必要があり、クロスレンダリングの場合、DrawCall が増加します。

では、画像のレンダリング順序を変更するにはどうすればよいでしょうか? 実はLayaAirIDEのUIエディターにはUIインターフェースの最適化機能が備わっており、UIエディターの階層マネージャーを開くと各画像リソースの階層関係が直感的に確認できるようになります。異なる色のドットで区別されます。同色のドットが交点で途切れるとDrawCallの数が増加するため、同色のドットのリソースが順番に並ぶように階層関係を調整する必要があります。

LayaAirIDE の UI エディターを通じて DrawCall を最適化する

さらに、送信バッチの数を減らすために、同じパネル内のすべてのリソースが 1 つのアトラスを使用するようにしてください。

2. 3D素材の再利用

3D ゲームの DrawCall の数は主にマテリアルに影響され、同じ画面上にあるマテリアルが多いほど、DrawCall の数も多くなります。LayaAir エンジンが再利用されたマテリアルをマージして最適化するため、DrawCall の数は相対的に減少します。

3. よく使用されるモデルの面の数を制御する

LayaAir エンジンは、特殊効果や弾丸など、20 未満の面を持つ同じモデルを自動的かつ動的にマージします。したがって、アートリソースを作成するときは、アートの要件を提示し、繰り返し使用されるモデルの面の数を制御するように努める必要があります。

4. 静的シーンの最適化手法

同じマテリアルの静的シーンの場合、LayaAir エンジンは静的マージ メソッド StaticBatchManager.combine() を提供します。これにより、DrawCall の数を大幅に削減できます。

最適化:スプライトを減らす

1. 階層的なネストを減らす

不必要なネストのレベルを最小限に抑えることで、スプライトの数を減らすことができます。

2. 見えない部分の処理

非表示領域のオブジェクトは表示リストから可能な限り削除するか、オブジェクトをvisible = falseに設定する必要があります。設定されていない場合、すべての表示オブジェクト ノードが走査されます。オブジェクトの数が多い場合、パフォーマンスが低下します。

3.cacheAs 属性を設定します

大量の静的コンテンツや、頻繁に変更されないコンテンツ (ボタンなど) を含むコンテナーの場合、コンテナー全体に cacheAs 属性を設定できます。これにより、スプライトの数が大幅に削減され、パフォーマンスが大幅に向上します。動的コンテンツがある場合は、それを静的コンテンツから分離して、静的コンテンツのみがキャッシュされるようにすることをお勧めします。

4. 3Dモデルの数量管理

3D ゲームのパフォーマンスの最適化は、プログラムだけでなく、アートの厳格​​な制作基準も必要とします。たとえば、アート リソースを作成する場合、エフェクトや機能要件に影響を与えずにモデルを結合して数を減らすようにすると、スプライトの数が減り、エンジンのレンダリング時のノード トラバース時間が短縮されます。

5. カメラのトリミングの最適化

大規模な 3D シーンでは、モデルに多くの顔やマテリアルが含まれているものの、遠方の部分はほとんど見えない場合、カメラのクロップ機能を使用して、遠方ではっきりと見えないモデルやマテリアルをレンダリングできます。シーン フォグ エフェクトは芸術的な効果には影響しませんが、スプライトと DrawCall の数を減らすことができます。

最適化: CPU 消費量を削減します。

Chrome パフォーマンス アナライザーを使用すると CPU 消費量を確認できますが、その削減方法についても多くのゲストが言及していました。ここでは、Archangel Master Cheng Chen Ce が共有した最適化の経験を整理することに焦点を当てます。

1. 星の経路探索の呼び出しを減らす

A スター パスファインディングはゲームでよく使用されますが、場合によっては、他の方法を使用して問題を解決できる場合もあります。A スター パスファインディングは使用しないようにしてください。まずは比較してみましょう。

通常、対角点 A から点 B までの 5*12 グリッド領域にいるとします。A スター アルゴリズムを使用する場合、上の図の青いグリッド部分など、多くの領域を計算する必要があります。

縦横の各点が動かせるかどうかだけを判断すれば、直線に進むかどうかが判断できます。下の図の青いグリッドは計算が必要な領域ですが、比較すると明らかに A スターよりもはるかに小さいです。

したがって、2 点を直線で移動できるかどうかを判断し、直線で移動できる場合は、CPU 負荷を軽減するための A スター パスファインディングを使用しないでください。

2. 各フレームで計算を実行する

通常、アイドル モードでの戦闘のほとんどでは、クライアントが計算を実行する必要があります。操作後、サーバーによって検証されます。例えば、モンスターと戦うには、ヒットするかどうか、クリティカルヒットするかどうか、無敵かどうかなど、多くの属性計算が必要になります。しかし、ほとんどのゲームでは、モンスターがいちいち出てきて戦ってくれるわけではありませんが、複数のモンスターが存在することもよくあります。特に 1 つのゲームプレイでは、モンスターがどんどん増えていきます。モンスターの数が100体に達すると失敗となります。攻撃ごとにモンスターのステータスを 100 回計算する必要がある場合、より多くのパフォーマンスを消費することになります。

では、消費を減らすために何ができるのでしょうか?すべてのターゲット (モンスター) をリストに入れ、ゲームプレイに応じて各フレームで異なる数のモンスターを取り出します。たとえば、モンスターが少ない場合は 1 ~ 2 匹、モンスターが多い場合は 10 匹が取得され、残りのモンスターは次のフレームで計算されます。もちろん表示効果は遅れますが、ダメージやその他の数値が浮き出てくる効果は同時に表示されないため、より自然に見えます。最も重要なのは、CPU 消費量が削減されることです。

3. サーバーサイドプッシュデータによる計算スキル

たとえば、クライアントはサーバーから大量の情報を受信し、データを解析して対応するモジュールのコントローラーに通知し、データ層を更新してインターフェイス表示を更新します。インターフェイス上では、各種表示オブジェクトの追加や削除などの操作が可能ですが、サーバーがデータをプッシュするたびに大量の操作が発生すると、一回限りの操作が滞ってしまいます。

LayaAirにはこのフレームのフレームヘッダーから現在までの経過時間を取得するメソッドがあり、経過時間がフレームの通常時間に達していればサーバー側でデータの処理を開始します。計算時間は短縮されませんが、スタック現象は発生しません。

4. 複雑なインターフェースを段階的に処理する

ゲームにはバックパックなどの複雑なインターフェイスが多数あり、バックパックに大量のデータが含まれている場合、初めてバックパックを開いたときに多数のサブオブジェクトが作成されます。このときインターフェースを押すと、サーバーデータの処理と同様に、各フレームの時間に応じて段階的に処理されます。このようにして、バックパックを開いたときに、インターフェイス上のサブ要素が 1 つずつ表示されるように感じられ、遅延はなくなります。

5. オブジェクトプールの使用

オブジェクトが作成されるたびに CPU が消費されるため、オブジェクト プールを使用すると、大量のオブジェクトの作成を回避できます。モンスターや銃弾など、使用するたびにオブジェクトをプールに入れておき、モンスターが死んで不要になった場合は、そのオブジェクトをプールに入れることができ、次回使用するときにそれらを使用することができます。プールから直接取得されます。オブジェクト プールが存在しない場合にのみ作成する必要があります。

ただし、オブジェクト プールはカジュアルに使用できることに注意してください。通常、モンスター、モンスターを倒した後の経験値ボール、モンスターを倒してドロップする小道具、スキル効果、浮遊キャラクター、マップなど、頻繁に再利用およびリサイクルされるオブジェクトに使用されます。チャンク化など。

6. スキル特殊効果と浮遊キャラクターの数を制限する

浮遊キャラクターや特殊効果の数を制限しないと、効果がまったく見えなくなるだけでなく、CPU の消費が大きくなりやすいため、スキル特殊効果や特殊効果の作成数や表示数を制限する必要があります。フローティング文字も CPU 消費を最適化するための戦略の 1 つです。

最適化: メモリ使用量を削減します。

メモリは、ゲームにおいて非常に重要な最適化指標でもあります。通常、携帯電話、特にメモリの制御が厳しい iOS システムでは、ゲームにはあまりメモリが残されていません。メモリの使用量が多すぎると、ゲームがクラッシュする可能性があります。 。これは、すべてのゲストが言及する最適化の焦点でもあります。メモリ使用量の確認方法はここでは紹介しませんので、Layabox公式サイトのドキュメントで確認してください。ここでは、ゲストが共有する最適化のポイントを整理します。

1. リソースの解放

オブジェクト プールを使用すると、CPU が最適化されるだけでなく、オブジェクト作成時のメモリ消費も削減されます。したがって、2D プロジェクトであっても 3D プロジェクトであっても、頻繁に再利用されるオブジェクトにはオブジェクト プールを適切に使用する必要があります。

未使用のリソースを解放する必要があります。ただし、しばらく使用する必要がある場合は、簡単に解放しないでください。リリース後のリロードもパフォーマンスを消費するためです。したがって、さまざまなリソースや戦略に基づいたトレードオフが存在します。

たとえば、プレイヤーが UI リソースを開いた場合、一定時間以内に再度開かれることはありません。次に、UI リソースが他の場所で使用されていないことを確認し、使用されていない場合は削除できます。

UI にアニメーションがある場合、UI インターフェイスを閉じると、他のインターフェイスがこのアニメーションを使用していないため、このアニメーションはすぐに削除できます。

キャラクターやスキルアニメーション、サウンドなどもUIと同じで、一定期間使用しなかった場合は他で使用されていないか確認でき、使用されていない場合はすぐに削除することができます。

ゲーム内でマップを切り替える必要がある場合、マップ上にドロップされた小道具はすぐに削除できます。

destroy() メソッドを使用して表示オブジェクトのメモリをクリアできることに注意してください。このメソッドは実際にはメモリからそれを解放し、null に設定しますが、表示オブジェクトによって使用されているリソースはクリアしません。

リソースを解放するには 3 つの方法があります。1 つは手動解放メソッド、clearRes() および clearTextureRes() で、もう 1 つはリソース マネージャー ResourceManager で autoRelease=true を設定して自動解放を実現します。

プロジェクトが大きい場合は、自動リリース機能を使用しないことをお勧めします。この関数はメモリ制限を超えた場合にのみリソースを解放するためです。また、自動的に解放された後、解放されたリソースがまだ他の場所で使用されている場合、クリアされたまま引き続き使用される可能性があります。画面がちらつく原因となります。

手動解除方法のうち、clearTextureRes()メソッドの使用を推奨します。これは、LayaAir 1.7.12 の最新バージョンの新しい方法です。

以前の clearRes() と比較すると、clearTextureRes() メソッドはテクスチャで使用されている画像リソースを破棄するだけですが、テクスチャ リソースのシェルは保持します。次のレンダリング中に、テクスチャで使用されている画像リソースが破棄されていないことが判明した場合は、存在する場合、画像リソースは表示のために自動的に復元されます。ClearRes はテクスチャを完全に破壊し、使用できなくなります。さらに、clearTextureRes() を使用すると、破棄の失敗を心配することなく、画像リソースを即座に破棄できます。ClearRes() は参照カウントを使用してリソースを破棄します。他の場所にリソース参照がある場合、リソースは破棄できません。

ヒント: 大きな画像コレクションの場合、clearRes() も clearTextureRes() も破棄できません。リソースを手動で管理したい場合は、大きな画像の自動収集機能をオフにするか、大きな画像の収集ルールを変更します。

3D リソースを解放する必要がある場合は、手動でのみ管理し、despose() メソッドを使用してビデオ メモリからリソースを削除します。リソースが蓄積されすぎて解放されない場合、クラッシュが発生する可能性があるため、開発者はいつでも未使用のリソースを削除する習慣を身に付ける必要があります。

2. アルバム作成のルール

たとえば、上の図のボタンは、ビデオ メモリによって幅と高さが 2 の整数乗に自動的に埋められるため、当初は 138*305 になるように設計されていました。したがって、ビデオメモリでは 256*512 になります。比例スケーリングを実行してサイズを 116*256 に変更すると、ビデオ メモリには 128*256 のみが存在します。メモリは元のサイズの 1/4 に削減されます。

3. 表示領域にないオブジェクトはロードされません。

通常、RPG 系ゲームではマップ全体が比較的大きく、すべて読み込むとメモリを多く消費するため、表示領域外のオブジェクトは読み込まれません。メモリの節約になります。

4. 視覚的な焦点にない場合は、適切に縮小できます。

ゲーム プレイヤーの視覚的な焦点角度は通常、主人公に焦点を当てていますが、視覚的な焦点領域に入っていないプレーヤーの場合は、画像の実際のサイズを比例的に縮小し、ゲーム内で 100% のサイズに戻すことができます。この方法ではメモリ使用量も削減できます。具体的な減少率に関して、Archangel Master Cheng Chen Ce 氏は、モンスター、武器、翼は 67%、スキルは 25% または 50% に拡大できると示唆しました。

インテリジェントな最適化

上記の手動最適化方法に加えて、LayaAir エンジンはバージョン 2.0 でインテリジェントな最適化を開始します。主な機能は、エンジンの多数の CacheAs 静的キャッシュ最適化を手動最適化から自動最適化に変換することです。

最大の利点は、開発者にとって最適化のしきい値が大幅に減少することです。属性を設定するだけでスマート最適化をオンまたはオフにできます。インテリジェントな最適化を有効にすると、最適化のワークロードが少なくとも 10 日間短縮されます。また、一度に見つけるのが難しい多くの最適化ポイントを首尾よく最適化できます。最適化の効果に関してはプロジェクトによって異なりますが、FPS は 2 倍以上向上します。

再版

おすすめ

転載: blog.csdn.net/weixin_42565127/article/details/133987205