あなたのモバイルゲーム開発の最適化時間を数ヶ月節約する方法（レンダリング編）

みなさん、こんにちは。こちらはUWA Technologies（略称UWA）です。今日は「あなたのモバイルゲーム開発の最適化時間を数ヶ月節約する方法」について、可能の解決策を提供したいと思います。去年のCEDEC 2019にご参加した皆様にはイメージがあるかもしれませんが、知らない人々に弊社または弊社の製品を紹介したいと思います。

#UWAとは
UWA Technologiesは、**モバイル/VR/ARなど様々なゲーム開発者向け、パフォーマンス分析と最適化ソリューション及びコンサルティングサービス**を提供している会社です。
UWA Technologiesが提供している「UWAローカル分析ツール」と「オンラインソリューション」は、中国で**Tencent、Netease**から始め、2,500以上の開発チーム、3,000以上のプロジェクトに採用され、実機に基づいた**パフォーマンステストレポートが開発のボトルネックをより簡単に解決でき**、中国のゲーム業界の急発展に大きく寄与しました。
「Make it Simple」という企業理念に基づいて、弊社は今後、日本でも製品やサービスを展開し、皆様と共に日本のゲーム業界の発展に貢献できるように一生懸命努力してまいります。
<img width="1212" alt="1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/20ff4572-7d58-fb55-2cf3-c7be754f681f.png">
<img width="1270" alt="2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/45e6353f-be8e-b490-8854-035624f77c75.png">

###弊社のクライアント
弊社が成立した５年間にたくさんのゲーム会社や開発チームとの合作経験があります、**最適化の速さとサービスの良いさ**によく高評価させております。下図に中国での名作ともう日本に登録した作品をいくつ例としてあげますので、この中に皆様がご存知しているプロジェクトはありませんか。
<img width="1438" alt="3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/f4abe0bc-3b35-e692-35a5-71e30ea666e8.png">


###私たちの経験
<img width="861" alt="4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/4cff663d-4f41-3532-178e-8ee652d9b76e.png">

弊社が成立されたばかりの時、市場を占めているモバイルゲームはほぼカードRPGであり、シーンも小さくて、ちょっとシンプルなものでした。
その後、アクションRPG、MOBA、MMORPGなども増えてきました。
現在、もっと複雑なゲーム、例えばオープン・ワールド・シューティングやオープン・ワールド・サンドボックスは大人気になりました。
見られやすいのは、過去の4年間に、モバイルゲームは複雑になり、2Dから3D、小さなシーンから大きなシーン、プレイヤーが少ないから多くなります……最適化も重要になります。
<img width="1393" alt="5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/fb275ed0-bbd9-8ece-dd95-c4c82802b212.png">
これは弊社のデータベースにおける*モバイルゲームのパフォーマンス傾向*です。上の線はRedmi Note２でのCPUコストです、ローエンドモデルの代表と認められます。下の方はSamsung S6でのデータで、ミドルローエンドモデルの代表と認められます。
約3年前のCPUコストはとても高いと見られます。ただし、2017年以降、ゲームが複雑になってきましたが、CPUコストは下がっています。これは**「モバイルゲームのパフォーマンスはだんだん良くなっている」**という意味です。2,000以上のゲームからこのデータを得ましたから、もしかしたら、これはモバイルゲーム史上初めての大規模な「全体的なパフォーマンス上昇」かもしれません。

**そのため、市場競争から取り残されないように、質の良いゲームを作ることが重要になっています。**

#UWA GOT とは
GOTは**Game Optimization Toolkit**の略称で、*Unityアプリのプロファイリングを行なう商用ツール*です。UWA GOTを使って、テストプロジェクトの各種データも使っている関数も直接にグラフやリストで見られます。何処かに悪いパフォーマンスや問題を起こす可能性があれば、ヒントもさせ、可能の解決策も提供します。ゲームの開発と最適化に役に立ちます。
UWA GOTは「Rendering」、「UI」、「Loading」と「Memory」４つの方面を分析でき、全方的にプロジェクトのパフォーマンスを検査します。
##レンダリング
###透明レンダリングと不透明レンダリング
レンダリングのパフォーマンスに対して、問題の鍵は**透明レンダリング**と**不透明レンダリング**に集めています。下図のように、透明レンダリングは総体の約50パーセント（赤枠）、不透明レンダリングは約37パーセント（青枠）を占めています。二つともにUWA GOTレポートに毎フレームのCPUコストが詳しく見られます。
<img width="1439" alt="6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/9d8ab4d4-21db-82f1-7add-c0a9d13feaa0.png">
<img width="1356" alt="7.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/bd796b61-a12c-64e0-1cb5-335324482a27.png">
<img width="1373" alt="8.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/d5df5660-f6e8-2b95-e79b-256a071187ca.png">

###ドローコールと三角形数
レンダリング最適化のボトルネック、**ドローコール**と**三角形数**もレポートに顕示されます。
<img width="1437" alt="9.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/ab126bbc-a8b8-e055-8e91-5aea9e075a60.png">
ドローコールを最適化する最も一般的な方法は、ドローコールのバッチ処理です。 詳細は[Unityマニュアル](https://docs.unity3d.com/ja/2018.4/Manual/UnityManual.html)をご覧ください、こちらには説明しません。ここでシェアしたいのは、二つの実際によく遭う**「ドローコールのバッチ処理を影響する」**問題です。
###1.Material instance
<img width="1435" alt="10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/9bb729c5-f875-a64d-0371-8874f17eb818.png">
1つ目は**Material instance**です。この画像では、*木と草がバッチ処理されていない*ことがわかります。 どうして？ 右側のインスタンスマテリアルは原因になります。マテリアルは同じように認めますが、Unityはそれらを異なるものとして処理するため、バッチ処理できません。インスタンスマテリアルを生成しないために、Material Property Blockを使用してMaterialパラメータを変更する必要があります。また、大量の草、木や石のある場合、レンダリングにはGPUインスタンスを使う必要があります。 ドローコールを減らすためには非常に便利です。

###2.異なるLightmaps
<img width="835" alt="11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/135efc40-b381-47b8-077d-1142ffae6778.png">
2つ目は、**異なるLightmaps**です。 ゲームオブジェクトが異なるライトマップに属している場合もバッチ処理できません。例えば、このプロジェクトには24のライトマップがあり、解像度は512 x 512です。したがって、1024 x 1024でライトマップをリベイクし、ライトマップ数は6になるため、バッチ処理が大幅に改善されます。

###三角形の単純化
<img width="1322" alt="12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/1f9ca137-1fa5-0278-9923-7a55202bf89b.png">
三角形については、**単純化する必要があります**。このスクリーンショットでボトルネックがすぐ見られます。こちらの三角形数は非常に多いです。 カメラがLandから遠く離れているのがわかります。ですから、*カメラにはより多くのゲームオブジェクトを捕まれています*。 それが原因です。ここではMeshLab、SimplygonまたはUnity LOD gourpなどのLOD（Level of Details）で三角形を単純化でき、役に立ちます。
<img width="1438" alt="13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/52e4e680-8434-a688-c448-362c60972f6b.png">
スキンメッシュの最適化方法も同じです。ドローコールを最適化し、三角形を単純化してください。

**UWA GOTレポートでは、どのスキンメッシュに頂点と三角形が多いかを表示でき、開発者が迅速に最適化できます。**

---
##UWA GOTの最適化実績
![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/564139a6-c7ff-cfcb-7731-11d6ffeb1075.png)
プロジェクト《キワミ》では、武将たちの三角形はすべて1500未満です。だからローエンドモデルでも、レンダリングコストはとても低いです。
![15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/9c1f3949-356c-ce8c-8ded-a19bbf1bfab1.png)
また、GPUスキニングとGPUインスタンス化を使って、ドローコールを最適化し、CPU計算をGPUに変えることもできます。こちらに2つの便利なオープンソースプロジェクトをお勧めします。
https://github.com/Unity-Technologies/Animation-Instancing
https://github.com/chengkehan/GPUSkinning
<img width="789" alt="16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/a097aa7a-c127-ca6a-b0cb-3276b9990a44.png">
最後に最適化する結果を見でください。**UWA GOTを使って、40日間の最適化処理後、CPUコストは8.2から6.2に減少しました**。

---
UWAおよびUWA GOTについてもっと了解したい場合には、[UWA公式サイト](https://jp.uwa4d.com/)に移動してください。
UWA GOTを使っていた[nowsprintingさん](https://twitter.com/intent/follow?original_referer=https%3A%2F%2Fwww.nowsprinting.com%2Farchive%2Fcategory%2FUWA%2520GOT&ref_src=twsrc%5Etfw&region=follow_link&screen_name=nowsprinting&tw_p=followbutton)も自身のブログでUWA GOTについて詳しく説明してしましたが、興味があれば[「やらなイカ？」](https://www.nowsprinting.com/archive/category/UWA%20GOT)に移動してご覧ください。

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

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