描画パフォーマンスを向上させるためにできることがいくつかあります。
あなたは彼らがかなり遠くにいると言った。LODを使用して、これらのツリーの頂点数を減らすことができます。したがって、描画されているすべての頂点を通過するのに必要な時間を減らすことができます。これは目前の問題ではない可能性が高いですが(GTX1080にはそれぞれ10万個のツリーがあり、それぞれ200のトリスがあり、GPUには小さな数字があります)、私はそれを含めました。ビルボードは、LODレベルが最も低い場合に効果的なツールです。これは、本質的には常にツリーのレンダリングされたイメージがカメラに面する平面であるためです。深さの感覚が失われるため、プレイヤーは違いに気付かない可能性が最も高いため、最低レベルに適しています。
バッチ処理を有効にしましたか?動的なバッチ処理は、通常、メッシュの頂点数がかなり少ない場合に自動的に実行されます。静的なバッチ処理は、親ゲームオブジェクトのユニティエディターのチェックボックスをオンにしてツリーを静的にすることでも試行できます。これは、アニメーションオブジェクトではうまく機能しません。この機能を実現するには、オブジェクトに共有マテリアルが必要です。
カスタムバッチ処理を使用すると、まとまりを処理せずに自分でチャンクを生成してレンダリングを制御できます。また、より大きなメッシュのバッチ処理も可能になります。これはMesh.CombineMeshesによって簡単に行われます。これは、アニメーション化されたオブジェクトでもうまく機能しません。この機能を実現するには、オブジェクトに共有マテリアルが必要です。あなたはおそらくあなたの世界をある種のチャンクに分割し、それらからバッチを作成したいでしょう。これらのチャンクの生成方法は、カメラが世界でどのように動くかによって決まります。
シェーダーでインスタンス化を有効にします。インスタンス化により、エンジンは1回の描画呼び出しで複数のオブジェクトを(同じメッシュで)描画できます。これを機能させるには、オブジェクトに共有メッシュと共有シェーダーが必要です。マテリアルはさまざまですが、シェーダーはさまざまなさまざまなプロパティをすべてサポートする必要があります。
エンジンでインスタンス化されたレンダリングバッチをより適切に作成するには、おそらく同じメッシュをシーン内でグループ化する必要があります。また、1つのメッシュが常に同じマテリアルを持っている場合、マテリアルレンダーキューで遊ぶと良い結果が得られます。現在取り組んでいるモバイルゲームの開発中に、テストシーンでこれを使用してドローコールを半減させました。また、Unity 5.6以降Enable Instancing
では、素材のチェックボックスをオンにしてください。
一般的に、ドローコールとSetPassコールは控えておきます。これらは、GPUが原料を描画するための生の呼び出しであり、大きなオーバーヘッドがあります。drawcalls(これはバッチ処理とインスタンス化が行うことです)を減らすと、CPUが提供できる全体的なパフォーマンスが向上します。SetPass呼び出しは現在のシェーダーに対する変更であるため、多くの異なるマテリアルがある場合、複数のSetPass呼び出しが発生し、CPUも少し待機します。
シーンが巨大で、CPU時間がシーン内のすべてのオブジェクトを通過する場合は、シーン内のオブジェクトを減らしてみてください。それらを個別に配置する代わりにいくつかのツリーをグループ化し、それらを単一のオブジェクトとして持つ。また、ツリーまたは親オブジェクトを移動していないことを確認します。これにより、Unityはキャッシュされたトランスフォームを破棄し、シーンツリー全体を再計算します。
シーンが巨大で、CPU時間の大部分がシーンツリーを歩いてすべてのオブジェクトをレンダリングするリストを作成している場合、Unityにレンダリングを処理させないようにすることができます。描画可能なオブジェクトを追跡するより良い方法がある場合は、CommandBuffer.DrawMeshInstancedまたはGraphics.DrawMeshInstancedを使用してそれらを手動で描画できます。これはもっと高度であり、自分自身やその他のオブジェクトを選別する必要があるため、これについては詳しく説明しません。
静的または動的なバッチ処理が適切に機能していない場合(フレームデバッガーを確認することで確認できます)、実際に共有マテリアルを使用していることを確認する必要がありますmeshRenderer.material
。を呼び出す.material
と、材料のコピーが作成され、バッチ処理が中断されます。.sharedMaterial
代わりに使用してください。
Unity 5.6以降では、フレームデバッガーを使用して、特定のドローコールが以前のドローコールでバッチ処理されなかった理由を判断できます。これは、ゲームのドローコールを削減する際に非常に役立ちます。
インスタンス化には、静的/動的/カスタムバッチ処理よりも次の利点があります。
- メッシュをメモリ内で複製する必要がないため、メモリの使用量が少なくなります
- 複数のマテリアルを使用できます。共有シェーダーのみが必要です
- オブジェクトをアニメーション化できます
また、欠点としてはUnityのかなり新しい機能であり、少し不安定になる可能性があります。また、古いGPUまたはモバイルデバイスGPUは、必ずしもインスタンス化をサポートしていません。