最適化のガイドライン
PlayCanvasアプリで最適なパフォーマンスを得るためのヒントをいくつか紹介します。
JavaScript
- JavaScriptオブジェクト(特にベクトル、行列、四元数など)を割り当てるために 'new' を呼び出すことは、動的割り当てを表し、コストがかかる場合があります。可能な限り、スクリプトの initialize 関数でオブジェクトを事前割り当てし、update 関数で再利用することが望ましいです。また、これはガベージコレクションを引き起こし、定期的なフリーズを引き起こす可能性があります。
グラフィックス - CPU
- PlayCanvasにおいて、メッシュインスタンスは描画呼び出し(単一のグラフィカルプリミティブを描画するためのコマンド)です。それぞれの描画呼び出しはWebGLにディスパッチするためのCPUの作業が必要です。そのため、特にモバイルデバイスにおいては、描画呼び出しの数を低く抑えることが望ましいです。あるモデルの描画呼び出しのリストは、モデルアセットを選択し、インスペクタで表示することで確認できます。低スペックのモバイルデバイスでは、100~200の描画呼び出しを目標にするのが適切です。一方、ハイエンドのデスクトップマシンでは、1フレームあたり数千の描画呼び出しを処理でき、60fpsを維持することができます。
- バッチングを使用してドローコールを減らしましょう。プロジェクト内にバッチグループを作成し、それらをRender、Model、Elementコンポーネントに割り当てることで、エンジンはできるだけ少ないメッシュインスタンスにまとめて描画します。これによりドローコールが減り、パフォーマンスが向上します。
- アプリで生成されるシェーダーの数をできるだけ少なく保つようにしてください。シェーダーは必要に応じてコンパイルおよびリンクされるため、この操作は高価であり、アプリの起動に遅延を引き起こし、フレームレートに違和感を生じさせることがあります。例えば、マテリアルAにはエミッシブマップがあり、マテリアルBにはない場合、2つのシェーダーが生成されます。マテリアルBに黒いエミッシブマップを設定すると、マテリアルは同じシェーダーを共有できます。シーン内のマテリアルの数を減らすことも、生成されるシェーダーの数を減らすはずです。
- スキンメッシュに対して、エンジンはカメラの視錐体カリングに必要な正確な境界ボックスを、各フレームで生成します。この操作にはコストがかかり、キャラクターがビュー フラスタムの外に完全にいる場合でも実行されます。このコストを避けるためには、キャラクターのカスタムAABBを
Render
またはModel
コンポーネントのプロパティに設定することを検討してください。 - カメラコンポーネントに視錐台カリングを有効にするのは、可視性を計算するコストよりもパフォーマンスを節約できる場合に限ります。すべてのメッシュインスタンスが常に表示されるシーンをレンダリングしている場合は、このオプションを無効にしてください。
グラフィックス - GPU
- プロジェクト設定で「Use Device Pixel Ratio」を有効にする場合は注意してください。これにより、PlayCanvasアプリはデバイスのネイティブ解像度を利用し、ピクセル化を減らすことができますが、多くのピクセルが塗りつぶされるため、フレームレートが著しく低下することがあります。これは、ユーザーのデバイスの性能を評価した後にランタイムで調整することができます。こちらを読んで詳細を確認してください。
- シーン内のダイナミックライトの数に注意してください。最小限に抑えてください。
- テクスチャの異方性が増すにつれ、視覚的な品質は向上しますが、パフォーマンスが低下します。視覚的品質とパフォーマンスのバランスに注意してください。
- 複数のテクスチャを1枚の画像にパックする機会を探してください。例えば、グレースケールの不透明度マップは、拡散マップのアルファチャンネルに格納することができます。また、グレースケールのグロスマップはスペキュラーマップのアルファチャンネルに格納することができます。これにより、VRAMの使用量を低減できます。
- ポストエフェクトは高コストなため、有効にする前によく考えてください。ピクセルフィルに関しても多くのコストを伴います。
- マテリアルで裏面カリングを有効にすることは、無効にするよりもコストが低くなります。一般的に、裏面カリングはGPUが塗りつぶす必要があるピクセル数を減らします。これは、新しく作成されたマテリアルのデフォルト設定です。
グラフィックス - CPUとGPU
- 時間の経過で視覚的な変化が少ない製品構成ツールなどのアプリケーションについては、CPUとGPUの使用量を減らすための特殊なプロパティがあります。
pc.Application#autoRender
をfalse
に設定すると、ユーザーがカメラを移動させたり、製品にパーツを追加したりするなどの視覚的な変化があった場合に、pc.Application#renderNextFrame
を介して必要に応じてフレームがレンダリングされます。 - 影のキャスティングを動的ライトに有効にすると、コストが高くなります。オムニライトの影は特に高コストです。影をキャストする各オムニライトについて、シーンを6回シャドウマップにレンダリングする必要があります。
- シーン内のブレンドされたメッシュインスタンスの数を最小限に抑えるようにしてください。ブレンドされたメッシュは、不透明なメッシュインスタンスがすべてディスパッチされた後に遅延され、カメラの奥行き順に後ろから前に提出されます。これにより、ピクセルが複数回塗りつぶされ、ブレンドされたメッシュはマテリアルでソートできないため、多くのレンダリングステートの変更が発生する可能性があります。
物理
- 衝突メッシュは描画用のメッシュと同じ詳細度である必要はありません。衝突判定に使用されるメッシュには、より低い解像度のメッシュを設定することをお勧めします。
- モバイルを含むシーン内の動的剛体の数を最小限に抑えてください。