パーティクルシステム最適化—— スキル特殊効果の最適化

![4919.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/69344301-8a93-79d1-4fc7-b58716b9a7ce.png)
4年前、Unityの各主要なモジュールのパフォーマンス最適化知識（初心者向け版）を1つずつ説明しました。近年、エンジン自体、ハードウェアデバイス、製作基準などのアップグレードに伴って、UWAは引き続き規則や方法を更新して、各開発者に提供しつつあります。「アップグレード版」のパフォーマンス最適化マニュアルとして、「Unityパフォーマンス最適化シリーズ」はより多くの開発者が利用できるように、シンプルでわかりやすい表現を心がけています。今回、パーティクルモジュールに関連する知識を共有します。

CPUであろうとGPUであろうと、パーティクルシステムへの影響は大きいです。プロジェクトの重度化と3A化につれて、プレイヤーの目が肥えてきて、ゲームが複雑になって、画面の特殊効果も複雑になっています・・・したがって、パーティクルシステムをより慎重に扱います。
##一、パーティクルシステムはCPUにどんな影響を与えるか##
UWAレポートのパーティクルモジュールには、これらのパラメータに焦点を当てます。
「ParticleSystem.Update」：パーティクルシステムで更新された平均CPU時間；
「ParticleSystem.Draw」：パーティクルシステムで各フレームのDraw Callの平均CPU時間；
「ParticleSystem.ScheduleGeometryJobs」：この関数はパーティクルシステムマルチスレッドにおける更新タスクのコールとかかわっています。一般的には、この数値が大きいほど、プロジェクトにおけるPlayingのパーティクルシステムの数量が大きくなっています。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/fe22c2a8-ded8-5bda-4c19-4fd3985e6135.png)
UWAの経験からみれば、主な影響されたレベルは以下の通りです。

###1、パーティクルシステム数量###
UWAのアパフォーマンスレポートには、 「パーティクルシステム数量」を直接検索（ctrl + f）すると、2つのテスト結果が表示されます。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/000ae1d9-d78c-ba18-8395-988319df0626.png)
（1）パーティクルシステムの数量に対して、UWAは600以下（1Gモデル）をお勧めします。この数量はメモリにあるすべてのParticleSystemの総数量を指します。再生しているものとバッファプールにあるものが含まれています。

（2）Playingのパーティクルシステム数量とは、再生しているParticleSystemコンポネントの数量を指します。スクリーン内外のすべてが含まれています。一つのフレームで現れた最大数は50（1Gモデル）を超えないようにすることをお勧めします。

では、プロジェクトの実行中にどれぐらいのパーティクルシステムがキャッシュされていますか。それを確認するにはどうすればよいですか。これらのPlayingのパーティクルシステムは合理的ですか。ここにはコツがあります。つまり、レポートにおける「詳細アセット情報」-「パーティクルシステム」から確認できます。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/706eab84-da80-cbc3-13c1-4980415d1900.png)
上の図に示すように、青い線はメモリにロードされているパーティクルシステムのすべてを表し、紫色の線は擬似冗長を表し、黄色の線は実際に再生されているパーティクルシステムの数です。ゲームが実行するライフサイクル図に従って、任意的なフレームのスクリーンショットが選べれます。特に数字の大きい部分を選択し、[選択されたフレーム]モードをオンにして、このフレームにおけるすべてのParticleSystemsとすべてのPlayのParticleSystemsが表示できます。

上記の2つの問題に関しては、最適化と分析する時、次の2つの点に焦点を当てることもできます。

（1）パーティクルシステムの最大値（つまり青い線）に焦点を当て、その数値が高すぎるかどうかに注意してください。ある最大値のフレームを選択して、どのようなパーティクルシステムがキャッシュされているか、合理的かどうか、過剰なキャッシュがあるかどうかなどの問題を確認します；

（2）Playingの最大値（つまり黄色の線）に焦点を当て、その数値が高すぎるかどうかに注意してください。ある最大値のフレームを選択して、どのようなパーティクルシステムが再生しているか、合理的かどうか、製作上の最適化ができるかどうかなどの問題を確認します（詳細は後文を参照）。
###2、ParticleSystem.Prewarmについて###
UWAレポートにおいて、重要なアパフォーマンスパラメータにはある関数が目立ちます：ParticleSystem.Prewarm。それは現在のフレームには、パーティクルシステムが「Prewarm」をオンにしたことを説明しました。この選択肢をオンにしたパーティクルシステムは、シーンにインスタンス化またはDeactiveからactiveへと変換する時、一回の完全なシミュレーションを実行します。「炎」を例にして、Prewarmがオンにしている時、ローディングしてから、「弱炎」から徐々に大きくなるのではなく、第一のフレームで 「強火」が見えます。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/998654a7-533b-6b4b-5cbe-53d107b041ec.png)
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/19e4a977-c1ed-7d0f-9be2-be29cae9beb1.png)
ただ、Prewarmの操作は通常一定的な時間が必要であるため、使用しない場合、オフにします。
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/5daf120e-98dd-0b8c-247f-5127817f13d1.png)
##二、パーティクルシステムがGPUへの影響##
もしパーティクルシステムの問題は深刻な場合、GPUのパフォーマンスに影響します。UWAの実機テストレポートのOverdrawデータと共にチェックして特定できます。ミドル・ローエンドデバイスには、5を超しないようにお勧めします。
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/04f41ef8-b476-33ad-6d5d-05d8bde4189d.png)

Overdrawのトレンド図と対応するゲームのスクリーンショットを合わせて、パーティクルの特殊効果には、面積が大きすぎるとか、成層が多すぎるとかなどのようなアセット規範などの問題があるかどうかについてチェックします。
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/dbadb2c0-c2bf-8a6b-e918-1cde1d1ea7f9.png)
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/7c6119a4-7c7e-20be-aa03-6d7756b9b12e.png)
**よく見られるほかの最適化アイデア**
ローエンドデバイスの場合、パーティクルシステムと画面カバレッジ領域の複雑さを可能な限り減らし、それによってレンダリングオーバーヘッドを減らし、ローエンドデバイスの実行のスムーズさを向上させます。 具体的なアプローチは次のとおりです。

レンダリングのコストを減少して、ローエンドデバイスをスムーズに実行させるために、ローエンドデバイスに対して、パーティクルシステムの複雑さとスクリーンのカバー面積をできるだけ減らします。具体的には以下のように示しています：

（1）ミドル・ローエンドモデルにおいて、パーティクル数と同じスクリーンのパーティクル数を減らします。例えば、「重要」なパーティクル特殊効果または自身のキャラクターによるパーティクル特殊効果などしか表示しないで、UpdateのCPUコストを減らします；

（2）不必要なパーティクルシステムのUpdateコストを避けるために、現在の視野または現在のカメラから遠く離れたパーティクルシステムを閉じ、近づいた後にオンにしてみてください。

（3）パーティクルの特殊効果がスクリーンにおけるカバー面積をできるだけ減らします。カバーの面積が大きいほど、成層が多くなり、レンダリングコストが多くなります。

パーティクルシステムの最適化については、UWA DAY 2018でモバイルゲームのGPUパフォーマンスの最適化について分析しました。FillrateやShaderなどのいくつかの側面から出発して、最適化プロセスにおける多くの実際のケースと組み合わせ、ゲームが GPU側におけるパフォーマンスボトルネックを分析しました：[https://edu.uwa4d.com/course-intro/1/90（中国語注意）](https://edu.uwa4d.com/course-intro/1/90)
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/c6add1bc-33c0-c724-877e-b9c23580134c.png)

##三、パーティクルシステムの規範##
上記はパーティクルシステムの最適化ポイントですが、ほとんどのチームにとって、それはプロジェクトの中期および後期段階で行われることです。しかし、パーティクル特殊効果のパフォーマンスストレスに対して、包括的かつ科学的なテストと予測がない場合、これは実際にはリスクが存在しています。では、日常の開発で、いくつかの科学的なアート規範や標準とテスト方法を通して、実機でスムーズなパフォーマンスを保証ために、どのようにしたらよいのでしょうか。
1. [ローカルアセットテスト](https://blog.uwa4d.com/archives/pipelinesummary.html)は、UWAによって押し出したアセット規範へのモニタリングサービスです。日々の開発では、テクスチャ、メッシュ、アニメーションアセット、パーティクル特殊効果などに対し、パフォーマンステストを1つずつ行います。下図のように示しています。
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/cba63d79-31ac-03ad-9cfd-175a7ba88e23.png)

パーティクル特殊効果へのテストは本質的にParticleEffectProfilerと類似しています。スキャンプロセスはGame Viewでレンダリングします。これによって、テストの結果は、直感的に表示され、開発者にとってとても使いやすいです。

レポートのテストに以下のようないくつかのルールがあります。今後徐々に改善・強化していきます。
**（1）特殊効果再生時の平均Overdraw率が高すぎる**
各フレームにおけるレンダリングに参加するピクセルの平均Overdrawをカウントし、プロセスでの最大値を取ります。この数値が大きいほど、特殊効果によるGPUストレスが発生する可能性が高くなるため、それをチェックすることをお勧めします。

**（2）特殊効果再生時のDrawCall最大值が高すぎる**
各フレームのDrawCall数をカウントし、プロセスでの最大値を取ります。この数値が高すぎると、それをチェックする必要があります。

**（3）特殊効果の総スタンプメモリが大きすぎる**
特殊効果におけるスタンプの総メモリをカウントします。この数値が高すぎると、テクスチャの使用量が多すぎるかもしれません。それをチェックする必要があります。

**（4）特殊効果実行時のParticleSystemコンポーネント数が多すぎる**

特殊効果に含まれているParticleSystemコンポーネント数をカウントします。この数値が高すぎると、高いレンダリング関連指標及び高いシリアライゼーション時間コストを引き起こすため、それをチェックする必要があります。

**（5）特殊効果再生時の最大パーティクル数は多すぎる**

各フレームのパーティクルの総数を数え、プロセスでの最大値を取ります。この数値が大きいほど、特殊効果の更新コストが大きくなる可能性があります。

**（6）特殊効果の総スタンプ数が多すぎる**

特殊効果に含まれているスタンプ総数をカウントします。この数値が高すぎると、高いレンダリング関連指標を引き起こしやすいため、それをチェックする必要があります。

**（7）CollisionまたはTriggerのParticleSystemをオンする**
パーティクルシステムには、高い物理コストを起こさないように、CollisonまたはTrigger機能を有効にしないことをお勧めします。

[今、各開発者はこのサービスを無料で使用できます！](https://blog.uwa4d.com/archives/UWA_Pipeline7.html)

###2、GOT OnlineにおけるGPU時間機能を合わせて、スキルの特殊効果に対して一つずつモニタリングと最適化する。###
（1）実機でスキル特殊効果を順番に実行します。スキル特殊効果のサイズと位置は、技術チームがカメラを介して設定できます。このようにして、実機で自動的にテストできます。実機によってフィードバックされたGPU時間を通して、CPUへのストレスが大きいスキル特殊効果をすぐに見つけることができます。
![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/27e0f5be-bf2c-7d90-db1e-cbb28ee6ebb5.png)
![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/e1137dfb-24f9-1c90-4d58-c5055c420fe5.png)
同様に、Draw CallとTriangleもこの方法ですぐボトルネックを見つけます。

![15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/2dd4610a-1f92-7ada-e641-4170dca4efac.png)

さらに特殊効果のインスタンス化とActive/Deactiveを一緒にテストするチームもいます。これにより、実行時にどのスキル特殊効果がパフォーマンスに危険をもたらすかを知ることができます。

![16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/ae6985ea-08f5-5116-219b-0eb85a9977c9.png)

このプロセスは多くのチームで定期的に実行されており、フィードバックは非常に効果的です。

他に、優れたチームには優れた実践があります。除此之外、优秀的プロジェクト总有优秀的做法、「パニシング」チームがUWA DAYで共有した大量なパーティクルシミュレーションソリューションを参照することをお勧めします。https://edu.uwa4d.com/course-intro/1/207
![17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/87ee6857-26ac-0350-39f6-a2c05f6b9ecf.png)
以上はパーティクルシステムを最適化する際に注意すべき問題と対応方法です。具体的には、プロジェクトの実際な状況に応じて操作する必要があります。同時に、UWAのオンラインテストサービスを組み合わせて、素早くパフォーマンスのボトルネックを特定することができます。

---
UWA Technologyは、モバイル/VRなど様々なゲーム開発者向け、パフォーマンス分析と最適化ソリューション及びコンサルティングサービスを提供している会社でございます。

UWA公式サイト：https://jp.uwa4d.com
UWA公式ブログ：https://blog.jp.uwa4d.com