アセット管理について

今回の主な話題:「Static Colider.Moveのパーフォマンスコスト」、「スマホのバッテリー消費と発熱現象についての最適化」、「Resources ロードとAssetBundleロードの区別」、または「レンダリングモジュールのMipmap設定」。


アセット管理

Q1:UnityのProfiler画面に、時々記録の右側にウォーニングメッセージの個数が見えます、これはパフォーマンスに影響がありませんか。それとも修正は必要ですか。

 

このようの文字が見えると、その後の物理更新に大きなパフォーマンスコストを引き起こす可能性があります、Physics.Simulate/Processingに含みます。 その原因は、主に「UnityバージョンのPhysXが静的コライダーを移動する時のコストが高い」という問題に限られます(ファイルには「Unity⒌Xでは解決した」と書いてありますが、⒌Xのプロジェクトにこの問題はまた残ってあると私たちが確実に発見しました)。その為、UWAからのアドバイスは移動の必要なコライダーにRigidBodyを加えて、Is Kinematicチェックボックスを選びます。それで対象を動的コライダーに変えます。下記の図のように、移動しない物体に対しては、モデルのApply Root Motionをオフにします。直接にStatic Collider.Moveのパフォーマンスコストを省きます。

 


アセット管理

Q2:私たちはTargetFrameRateを30に設定し、高いバッテリー消費と高発熱を避けたいですが、このようにするのは合理的ですか。

このような設定は、本来フレームが良好な場合にのみ、バッテリー消費と発熱を低減する目的に役に立ちます。もしこのゲーム自体が頻繁に重いと感じているなら、この設定方法はあまり意味がありません。バッテリー消費と発熱について、研究開発チームはCPU、GPU、IOから入手し、できる限りこの3つの負荷を低減したいです。例えば:

⑴ CPU:UWAパフォーマンスレポートの問題のある関数Top10に対して最適化を行います。パフォーマンススタックを参照し、ソールを定位して最適化します。

⑵ GPU:レポート中のOverDrawを参照して、GPU負荷の大きいソールを改善や最適化します。

⑶ IO:アセットロードの粒度とネットワーク転送の周波数をできる限り制御します。アセットの粒度について、UWAは詳しく分析することがあります。「アセットバンドル(Asset Bundle)粒度の計画」をご参考ください。


レンダリング

Q3:社内のアーテイストがシーンの地面を作るとき、画像の質量に、下図のような1本の分割線ははっきり見えます。これの原因はMipmapの使用がわかりますが、私たちはこの線をこれほど鮮明でないようにしたいです。最初の考えはTextureのmipMapbiasというパラメータを設定しますが、このパラメータはTextureの配置インタフェースに提供されていません。

 

Q3.1: Unityにこの値をグローバル設定する方法はありませんか。あるいは私たちが今のようにスタンプ導入時にスクリプトで設置できろのみ、他の方法はありませんか。公式からの提案は「Note that using large negative bias can reduce performance, so it」s not recommended to use more than—0.5 negative bias.」ですか、私の理解には、この値はMipmapの層数に対応し、整数すべきです。

現在では、グローバル設定できる方法はまた発見していません。

Q3.2:この提案からの「−0.5を超えない値」は具体的にMipmapオフセットの何層に対応しますか。

Mipmapの層数は確かに整数であります。mipMapbiasはUnityエンジンが定義したの一つのパラメータです。Unity公式の解釈で、整数は今の層級より低いMipmapを表示しますと、マイナスは今の層級より高いMipmapを表示します(層級の低いMipmapはよりはっきりしています)。具体的に「−0.5」はどのぐらいオフセットするのは今また分かりません。

Q3.3:TrilinearのFilter Modeも設定してみましたけど、効果は余りありませんでした。本来ならこの設定はMipmapが二つ層の中の八つ点をサンプリングしてミクスするはずですが、なぜ違うになりましたか。

Trilinearの方がBilinearよりいいはずですが、効果があまり良くではありません。なぜならば,従来のMipmap (Anisotropic Filteringを採用しない)は毎層のu, v二つの方向を半分に削減します, すなわち512x512の次の層は256x256です。これで、会った所で違う層でサンプリングされたテクスチャがu, v二つの方向に引き伸ばされる(あるいはぼやけてしまう)ことを引き起こします。Anisotropic Filteringの方式は、「一つの方向にのみ延伸され、他の方向に原来のサンプリングレート(またはテクスチャ解像度と呼ばれる)を維持することで、突然変化のファジィ感を明らかに低減します」と簡単に理解できます。

Q3.4:現在、私たちがアーテイストに提案しているのはAniso Levelを採用し、6以上などの少し高い値を設定しますと、ちょっと理想的な効果ができます。しかし、この機能のパフォーマンスコストは高いと調べられます。UWAはこのパラメータに対して分析することはありませんか。具体的にどのぐらいコストしますか。

Anisotropic Filteringを使うとテクスチャのメモリ占有率が高くなるだけでなく、サンプリング率も高くなります(一つ方向の保持が変わらないため)、伝統的なmipmapより時間がかかります。時間がかかるのはGPU端末でテクスチャをサンプリングするときにメモリを追加しますが、CPU端末への影響はありません。確かにAnisotropic Filteringの時間コストは増えていますが、直接にmipmap levelを増やすこと(すなわちオフセット「−0.5」を設定します)と比べて、同じ効果を達成するために、Anisotropic Filteringの方が時間コストは少ないです。このパラメータはGPU端末の時間コストに影響していて、私たちは単独で統計したことがありません。開発チームは1つのバージョンをUWA公式サイト(https://jp.uwa4d.com)に提出することを試みと、私たちは全体の効率から分析します。


アセット管理

Q4:私たちはResources.LoadとLoadAsyncの方式を使って、アセットをロードしています。AssetBundleの方式と比較して、優劣を簡単的に説明していただけませんか?

現在、たくさんのプロジェクトはAsset Bundleを用いてロードしています。Resourcesのローディングに比べて、以下のような利点があります:

⑴ ゲーム起動が速い、Resourcesフォルダ下のファイル数が多いほど、ゲーム起動が遅くなります。AssetBundleの使用はResourcesフォルダ下のファイル数を大幅に減らすことができます;

⑵ アセットのロードやホットアップデートに対して更に便利です。Asset Bundleはアセット組織を可動的になされ、プロジェクトの違うよって、より簡単にモジュールの一部をプリロードやホットアップデートすることができます。


アセット管理

Q5:Unityプロジェクトでゲームを起動する時、大量のwarning(使用していない変数を定義したような)がありますが、これは実機のパフォーマンスに影響を与えますか。修正する必要がありますか。

 

もしこれらのwarningは、実機で実行する時また残っていれば、パフォーマンスに影響があります。できれば削減してとアドバイスします。問題で述べたように「使用していない変数を定義するようなwarning」は,コンパイル時のwarningであり,実行時のパフォーマンスには影響しません。


UWA公式サイト:https://jp.uwa4d.com

UWA公式ブログ:https://blog.jp.uwa4d.com

UWA公式Q&Aコミュニティ:https://answer.uwa4d.com