小規模ゲーム向けの iOS メモリとパフォーマンスの最適化ガイドがついに登場しました! おすすめコレクション

序文

WeChat ミニゲームの通常モードは、ネイティブ プラットフォーム上で HTMLCanvas のレンダリング機能をシミュレートするための C++ レンダリング レイヤーと JS コンパイル エンジンに基づくソリューションであるため、JS コードのコンパイルと実行の効率はゲームのパフォーマンスに大きく影響します。 。

通常、JS エンジンはコンパイル速度を向上させるための JIT 機能を提供します。これにより、小規模なゲームが Android 側で優れたパフォーマンスを達成できるようになります。しかし、iOS 側のシステム セキュリティ ポリシーにより、JS エンジンによる JIT 機能の使用が制限されているため、iOS 側の小規模なゲームのパフォーマンスは常に満足のいくものではありませんでした。

WeChat ミニゲームによって提供されるハイパフォーマンス モードにより、iOS 上のミニゲームも WeChat の内部 Webkit に切り替えてゲームを実行することで JIT 機能を使用できるようになり、実行パフォーマンスが大幅に向上します。

WeChat Mini Games の公式ドキュメントにある水族館のテストから、同じシーンで、iPhone11 Pro Max では、ハイパフォーマンス モードでは 49 FPS に達しましたが、通常モードでは 13 FPS にすぎないことがわかります。

6600fef850cbcf637322c2b66e942cd2.png

この記事では以下の4つの観点から解説していきます。

  • ハイパフォーマンスモード

  • ランタイムメモリ構造

  • メモリの問題の診断

  • メモリ最適化のヒント

メモリの問題は Android 側で適切に実行され、iOS 側でより多くのフィードバックが得られるため、この記事では iOS 側でのメモリの最適化のみを紹介します。

ハイパフォーマンスモード

ハイパフォーマンス モードの導入と使用方法については、WeChat ミニゲーム開発ドキュメント: ハイパフォーマンス モードを詳しくお読みください (記事の最後にある QR コードを長押しできます)。

イタリアーノ

  1. WeChatパブリックプラットフォームにログイン -> ホームページ機能マップモジュール -> クリックして「生産改善パッケージ」に入る -> クリックして高パフォーマンスモードをアクティブ化します。

  2. アクティベーションが成功したら、game.json の iOSHighPerformance を true に構成することで、高パフォーマンス モードに入ることができます。

  3. Cocos Creator 3.7 以降では、[プロジェクト] -> [ビルド リリース]パネルでハイパフォーマンス モードを直接確認できます

このスイッチを外すと、通常はノーマルモードに戻り、2つのモードを比較することができます。

問題に注意してください

  1. ハイパフォーマンス モードでは、ゲームのレンダリング パフォーマンスとパフォーマンスが向上しますが、ゲームのメモリ要件はより厳しくなります。

  2. ハイパフォーマンス モードでは、ミニゲームがブラウザ カーネル環境で実行されるため、互換性、メモリ消費量、安定性などの側面を個別にテストする必要があり、通常モードでのテスト結果は再利用できません。

  3. iOS デバイスでは、iPhone 6s/7/8 などの 2G RAM モデルのメモリ制限は 1G、iPhone 7P/8P/iPhoneX/XR/XSAMX/11 などの 3G RAM モデルのメモリ制限は 1.4G です。アプリケーション メモリ使用量がこのしきい値を超えると、プロセスはシステムによって強制終了されます。したがって、開発者は、ピーク時のメモリがこの値を超えないようにする必要があります。

  4. ゲームがメモリに対して最適化されていない場合、ハイパフォーマンス モードをオンにすることはお勧めできません。そうしないと、ローエンド iOS マシンで異常終了しやすくなります。メモリに問題がある場合は、メモリの最適化を参照してください。メモリを完全に最適化するためのヒントは、この記事に記載されています。

ランタイムメモリ

1b02175ae3502a738fe97ac7470fa070.png

上の図からわかるように、ランタイム メモリは 6 つの部分で構成されています。

JavaScript ヒープ

ハイパフォーマンス モードでは、ミニゲームはブラウザー カーネル環境で実行されるため、JavaScript ヒープにはゲーム ロジック コード メモリが含まれます。通常、Web モバイル側をパッケージ化し、Mac プラットフォーム上の Safari ブラウザのデバッグ ツールを使用して、モバイル Safari のメモリ状態をリモートでデバッグできます。通常、JavaScript ヒープでは特定の物理メモリ使用量を確認できないことに注意してください。

WASM リソース

物理エンジン計算などの JS モジュールの実行パフォーマンスを向上させるために、いくつかの C++ コードを WASM コード スニペットに直接コンパイルして、最適化されたパフォーマンス要件を達成します。たとえば、Cocos Creator が参照するサードパーティの物理ライブラリは WASM バージョンです。

基本ライブラリとキャンバス

基本ライブラリは、WeChat ミニゲームのブラック ボックス環境によって公開される API パッケージとして理解でき、ブラウザ カーネル環境 API が開発者に公開されるのを防ぐことができます。実際のテストでは、基本ライブラリのメモリは約 70M を占有しました。ミニゲーム環境で作成された最初の Canvas がメイン Canvas であり、レンダリング サーフェスをメイン インターフェイスに同期できる、つまりゲームのレンダリング パフォーマンスを提示できる唯一の Canvas でもあります。Canvas のメモリ フットプリントは、Canvas の幅と高さに比例します。

音声ファイル

オーディオ ファイル メモリとは、メモリにロードされたオーディオ インスタンスを指します。

GPUリソ​​ース

頂点データ キャッシュ、インデックス データ キャッシュ、テクスチャ キャッシュ、レンダリング サーフェス キャッシュなど。

メモリの問題の診断

ここでは、メモリの問題を迅速に特定し、解決策を見つけるのに役立つ、一般的に使用される iOS メモリ診断ツールをいくつか紹介します。

一般的に使用される iOS デバイスのメモリ表示ツール

  • Xcodeに付属する機器分析ツール

  • Perfdog ツール

  • WeChat開発者ツール

注: iOS ミニゲームのプロセス名はモードによって異なります。

  • 高パフォーマンス モード: WebContent あり

  • 通常モード: WeChat を含む

XCode インストゥルメント

3b5c10ad38e5cc16e0989eb914ee149e.pngXCode Instruments は、XCode 独自のアプリケーション ランタイム分析ツールであり、WeChat ミニ ゲーム プロセスにも適用できます。

アクティビティ モニターを使用し、キャプチャするすべてのプロセスに対応するデバイスを選択し、プロセス リストが更新されるのを待ち、フィルタリングする Webkit を入力すると、すべてのプロセスの CPU とメモリのステータスを確認できます。

55cf1a1d3ff5d991be46cf05d21d937d.png

パーフドッグ

Perfdog (Perfdog) は、iOS/Android/PC/ホスト プラットフォーム向けのパフォーマンス テストおよび分析ツールです。具体的な使用方法については、https:  //perfdog.qq.com/を参照してください。

対応する設定プロセス名を選択すると、関連するパフォーマンス データが表示されます。

[開発段階でのメモリ調整: 開始時にすべてを制御 | WeChat オープンドキュメント]: https://developers.weixin.qq.com/minigame/dev/guide/performance/perf-action-memory-devを参照してください。 - プロフィール.html

WeChat開発者ツール

WeChat 開発者ツールは主にデバッガを使用してメモリ データを追跡します。操作プロセスは次のとおりです。

  1. デバッグ開発者ツールインターフェイスに入る

  2. [メモリ]にチェックを入れてゲームをリフレッシュしてください

  3. 下の画像の左上隅にある小さな丸ボタンをクリックして録画を開始します

  4. 録音が終了すると、次のインターフェースが表示されます

ここでは主に 2 つの波形に焦点を当てます。1 つは論理フレームの呼び出しスタックを表示するために使用されるメイン波形で、もう 1 つはメモリ増加の変化を観察するために使用される JS ヒープのピーク曲線です。特定の瞬間に JS ヒープ値が増加していることが観察された場合は、論理フレームの呼び出しスタックを表示して、データのソースを大まかに確認できます。

26092dd83562b9549f832ea63ee8189d.png

上記の手順により、ゲームの JS メモリ分布を分析できます。その後、特定の JS メモリのソースとリリースを特定するには、次のメモリ リーク検出ツール - リアルタイム メモリ診断を使用する必要があります

73e2f44b56faeb071bb5d4fa35932a5d.png

具体的な手順は次のとおりです。

  1. 左上隅の小さな丸ボタンをクリックして、下の記録ボタンに入ります. ヒストグラムの出現は特定のメモリ ブロックの作成を示し、ヒストグラムの消失はメモリ ブロックが解放されたことを示します。左上のゴミ箱ボタンは、JS エンジンの GC をアクティブに起動するボタンで、クリックするとメモリのリサイクルを高速化できます。9af850b0fc29055f005d6b83023c1a5f.png

  2. 左上隅の小さな赤い丸ボタンをもう一度クリックして記録を終了します。このとき、青い領域を選択すると、メモリ ブロックに含まれるオブジェクトが表示されます。これらは、まだリリースされていないリソースです。オブジェクトを選択した後、Retainers インターフェイスでオブジェクトのメモリ参照関係を確認できます。この時点で、コード層の論理関係に基づいてメモリ オブジェクトを解放する必要があるかどうかを判断し、メモリ リークが存在するかどうかを確認できます。3372bf4c5537569d41ca42e5b95bcbc3.png

メモリ最適化のヒント

一般的な WeChat ミニゲーム プロジェクトのメモリは、次の部分で構成されます。

  1. ミニゲーム基本ライブラリ

  2. エンジンスクリプトメモリ

  3. ビジネススクリプトメモリ

  4. オーディオメモリ

  5. フォントメモリ

  6. 画像メモリ

  7. キャンバスメモリ

メモリのコンポーネントがわかれば、さまざまな部分に対して最適化を行うことができます。

iOS の高パフォーマンス モードを例に挙げると、一般的に使用されるメモリ最適化手法は次のとおりです。

  1. 小規模ゲームの基本ライブラリのメモリは通常 ~= 70M ですが、これは常駐メモリであり、最適化できません。

  2. エンジンのメモリ使用量はロード時に決定されます。エンジンのロードによりレンダラーが初期化されるため、通常、メインの Canvas メモリ使用量もこの時点で決定されます。このメモリ使用量は、レンダリング解像度の倍数を構成することで最適化できます。実行時、エンジン モジュールのニーズに応じて一部のキャッシュ メモリが動的に追加され、開発者は機能のニーズに応じてエディタのプロジェクト設定で機能を調整することで、エンジン メモリの使用量を削減できます。

  3. スクリプト メモリにはエンジンとビジネス コード、および構成テーブル データが含まれます。ゲームの開発量に応じて、ビジネス コードと構成テーブル データのメモリのサイズは数百 M になり、ユーザーのみが最適化できます。

  4. 単一のデュアル チャネル オーディオ インスタンスは約 20M になる場合があります。オーディオの再生後にインスタンスを解放すると、このメモリ損失が軽減されます。また、シングル チャネル オーディオに合理化してメモリを削減することもできます。

  5. 中国では一般に中国語フォントが使用され、ロード後のメモリ使用量は少なくとも 10M を超えるため、システム フォントを使用し、アプリケーション内の共有リソースを使用するようにしてください。開発条件が許せば、ビットマップフォントやSDFフォントレンダリングも使用可能です。

  6. 画像メモリは一般的に使用されるリソースであり、ロードのニーズに応じて、テクスチャを塗りつぶしてから解放するか、メモリにキャッシュして次回テクスチャを再充填するかを選択できます。iOS 側では、astc 圧​​縮テクスチャ形式を使用し、画像リソース メモリを解放できる動的バッチ処理を無効にすることをお勧めします。圧縮されたテクスチャ自体も、png よりも使用するメモリが 50% 以上少なくなりますが、astc のファイル サイズは png よりも大きくなるため、パッケージ サイズは大きくなります。通常、最初のパッケージのサイズを減らすために、画像リソースをミニゲームの下請けまたはリモートの下請けに投入しようとします。

  7. Canvas オブジェクトは、TTF フォント テキストのレンダリング時に作成されます。Canvas オブジェクトは、使用後にキャッシュ プールにリサイクルされます。テキスト レンダリングのフォント サイズが大きいほど、キャッシュ プールも大きくなります。現在、エンジンはリサイクル メカニズムを提供していません必要に応じて、エンジンを変更して Canvas キャッシュ プールを解放できます。ゲームのメモリ使用量が比較的高い場合は、TTF フォントの代わりにビットマップ フォントを使用できます。

  8. JSON ファイルなど、エンジンによって提供される機能に従ってオンデマンドでリリースされる他の JS メモリ オブジェクトもあります。

この記事は、Cocos エンジンの公式テクニカル サポート チームによって提供され、エンジンの公式オープン ソース ウェアハウスである WeChat ミニ ゲーム メモリ最適化ガイド (IOS) に同期されています。Star and Fork へようこそ。de6dce0aa111d74b356227e4b1b6a209.png


参考記事 ef266b5c53b6c22df687424ae6352d59.png

過去のハイライト


おすすめ

転載: blog.csdn.net/6346289/article/details/132353256