一般的なガイドライン
備考
このドキュメントは、playcanvas/developer.playcanvas.com を元に翻訳されたものです。
ドキュメントはMITライセンスの下で提供されています。詳細については、https://github.com/playcanvas/developer.playcanvas.com/blob/main/LICENSE を参照してください。
以下は、PlayCanvasアプリケーションで良好なパフォーマンスを実現するためのヒントとアドバイスです。
JavaScript
- JavaScriptオブジェクト(特にベクトル、行列、クォータニオン)を割り当てるために
new
を呼び出すことは、動的な割り当てであり、コストがかかる可能性があります。したがって、可能な限り、スクリプトのinitialize
関数でオブジェクトを事前に割り当て、update
関数で再利用する必要があります。また、定期的なフリーズを引き起こす可能性のあるガベージコレクションにもつながります。
グラフィックス - CPU
- PlayCanvasでは、メッシュインスタンスはドローコール(個々のグラフィカルプリミティブを描画するコマンド)です。各ドローコールは、WebGLにディスパッチするためにCPU上でいくらかの処理を必要とします。したがって、特にモバイルでは、ドローコールの数を少なくすることが推奨されます。特定のモデルのドローコールのリストは、モデルアセットを選択し、インスペクターで表示することで確認できます。ローエンドのモバイルデバイスの目標は、おおよそ100〜200ドローコールです。一方、ハイエンドのデスクトップマシンは、毎フレーム数千のドローコールを処理し、それでも60fpsを維持できます。
- ドローコールを減らすためにバッチ処理を使用してください。プロジェクトでバッチグループを作成し、それらをRender、Model、Elementコンポーネントに割り当てることで、エンジンはそれらをできるだけ少ないメッシュインスタンスにマージしようとし、ドローコールを減らし、パフォーマンスを向上させます。
- アプリケーションによって生成されるシェーダーの数をできるだけ少なくしてください。シェーダーはオンデマンドでコンパイルおよびリンクする必要があり、この操作はコストがかかり、アプリケーションの起動の遅延やフレームレートの乱れを引き起こします。マテリアルAにエミッシブマップがあるが、マテリアルBにない場合、2つのシェーダーが生成されます。マテリアルBに黒のエミッシブマップを設定すると、マテリアルは同じシェーダーを共有できます。シーン内のマテリアルの数を減らすことも、生成されるシェーダーの数を減らすはずです。
- スキンメッシュの場合、エンジンはカメラの視錐台カリングに必要な正確なバウンディングボックスを毎フレーム生成します。この操作はボーンごとにコストがかかり、キャラクターが視錐台の外に完全にいる場合でも実行されます。このコストを回避するには、
Render
またはModel
コンポーネントのプロパティであるカスタムAABBを設定することを検討してください。 - カメラコンポーネントで視錐台カリングを有効にするのは、全体として、可視性を計算するコストよりもパフォーマンスの節約になる可能性が高い場合に限ります。すべてのメッシュインスタンスが常に表示されるシーンをレンダリングしている場合は、このオプションを無効にしてください。
グラフィックス - GPU
- プロジェクト設定で「デバイスピクセル比を使用」を有効にする場合は注意してください。これにより、PlayCanvasアプリケーションはデバイスのネイティブ解像度を利用してピクセル化を軽減しますが、塗りつぶされるピクセル数が大幅に増加し、フレームレートが大幅に低下する可能性があります。これは、ユーザーのデバイスの能力を評価した後、実行時に調整できます。詳細については、デバイスピクセル比の調整を参照してください。
- シーン内の動的光源の数に注意してください。最小限に抑えてください。
- テクスチャの異方性フィルタリングの値を大きくすると、視覚的には向上しますが、パフォーマンスは低下します。視覚とパフォーマンスのバランスに注意してください。
- 複数のテクスチャを1つの画像にパックする機会を探してください。たとえば、グレースケールの不透明度マップをディフューズマップのアルファチャネルに格納できます。または、グレースケールの光沢マップをスペキュラーマップのアルファチャネルに格納できます。これにより、VRAMの使用量が削減されます。
- ポストエフェクトはコストがかかる可能性があるため、有効にする前に慎重に検討してください。ピクセルフィルに関して多くのコストがかかる可能性があります。
- マテリアルで背面カリングを有効にする方が、無効にするよりもコストがかかりません。一般的に言って、背面カリングはGPUが塗りつぶす必要のあるピクセル数を減らします。これは、新しく作成されたマテリアルのデフォルト設定です。
グラフィックス - CPUとGPU
- プロダクトコンフィギュレーターのように、一定期間にわたって視覚的な変化がほとんどないアプリケーションの場合、CPUとGPUの使用率を削減するための特別なプロパティがあります。ユーザーがカメラを移動したり、製品に部品を追加したりするなど、視覚的な変化があったときに
pc.Application#autoRender
をfalse
に設定して、pc.Application#renderNextFrame
を介してオンデマンドでフレームをレンダリングできます。 - 動的光源で影の投影を有効にすると、コストがかかります。特にオムニライトの影はコストがかかります。影を投影する各オムニライトについて、シーンをシャドウマップに6回レンダリングする必要があります。
- シーン内のブレンドされたメッシュインスタンスの数を最小限に抑えてください。ブレンドされたメッシュは、すべての不透明なメッシュインスタンスがディスパッチされるまで遅延され、その後、カメラの深度順に後ろから前に送信されます。これにより、ピクセルが複数回塗りつぶされ、ブレンドされたメッシュはマテリアルでソートできないため、多くのレンダーステートの変更が発生する可能性があります。
物理
- コリジョンメッシュは、レンダリング可能なメッシュと同じレベルの詳細である必要はありません。コリジョンのために低解像度のメッシュを設定することをお勧めします。
- 特にモバイルでは、シーン内の動的なリジッドボディの数を最小限に抑えてください。