Unityプロファイラが使用するポートは: MulticastPort : 54998 ListenPorts : 55000 - 55511 Multicast(unittests) : 55512 - 56023 ネットワーク ノードの中からアクセス出来る必要があります。つまりプロファイリングを行うデバイスはプロファイラを有効にしてUnityエディター上でマシンのポートをみることが出来る必要があります。
Unityはスキニング,バッチング,物理計算,ユーザスクリプト,パーティクルについてCPUに依存します(部分的にはSIMD,例えばx86ならSSE,ARMならNEON)。
GPUはシェーダ,ドローコール,イメージ エフェクトで使用されます。
大部分の問題 (80%) は少数の問題(20%)により引き起こされます。エディター プロファイラを使用して最も問題となる関数コールをみつけて最初に最適化します。多くの場合,それらの重大な部分を最適化するだけで,全体的な実行速度を改善させることが出来ます。
スクリプトが必要なときだけ実行されていることを確認して下さい。例えば,アクティブである必要がないオブジェクト見つけてOnBecameVisible/OnBecameInvisible を使用して無効化して下さい。毎フレーム毎に実行する必要がない場合コルーチンを使用します。
// Do some stuff every frame:
void Update () {
}
//Do some stuff every 0.2 seconds:
IEnumerator Start ()_ {
while (true) {
yield return new WaitForSeconds (0.2f);
}
}
.NET System.Threading.Thread クラスを使用して重い処理は別スレッドにします。これによりマルチコア実行出来ますがUnityAPIはスレッドに完全には対応していません。バッファ入力や結果や読み込みはメインスレッドに割り当てします。
全てのユーザコードがプロファイラに表示されるわけではありません。しかし Profiler.BeginSample および Profiler.EndSample を使用さて必要なユーザ コードをプロファイラに表示させることが出来ます
Unityエディター プロファイラは現時点でGPUデータは表示出来ません。われわれはハードウェア製造元と協力をしながらエディタープロファイラにTegraデバイスでは表示出来るように進めています。
PowerVR はタイルベース ディファード レンダラ であり,ドローコール毎のGPUタイミングを取得することは不可能です。しかしシーン全体のGPU時間を取得するのにUnityのビルトイン プロファイラを使用出来ます(Xcodeに結果出力する分)。現在AppleツールはGPUおよびそのパーツがどれだけビジーかのみ伝達し,ミリ秒単位で知ることは出来ません。
PVRUniSCo によりシェーダ コードの中のシェーダ全体のサイクルをWindows および Macともに知ることが出来ます。 しかしAppleドライバの状況を正確には反映出来ていません。それでもラフな指標としては十分です。
Tegraでは,NVIDIAから最高級のパフォーマンス測定ツールが提供されていて実現したいことのすべてが出来ます - ドローコール毎のGPU時間,シェーダ毎のサイクル,強制 2x2 テクスチャ,Nullビュー四角形,でWindows, OSX, Linuxにて動作します。PerfHUD ESはコンシューマ デバイスで上手く動作しないためNVIDIAのdevelopment board が必要です。
Qualcomm により優秀なAdreno Profiler (Windows のみ) が提供されていてWindowsのみですが,タイムライン グラフ,フレーム キャプチャ,APIコール,シェーダ アナライザ,ライブ編集の機能があります。
内部プロファイラによりモジュール毎の良い概要が得られます:
Unityメモリおよび Mono メモリがあります
Mono メモリはスクリプトオブジェクト,Unityオブジェクトのラッパー(ゲームオブジェクト,アセット,コンポーネント,その他)をハンドリングします。ガーベージ コレクションにより,利用可能なメモリへの割り当てが出来なかった場合,または System.GC.Collect() コールの場合,クリーンアップを行います。
メモリはヒープブロックに割り当てされます。ヒープブロックはアプリが閉じられるまでMonoに保持されます。すなわち Mono は使用メモリをOS に対して開放しません (Unity 3.x)。特定の量のメモリを割り当てるとMonoのために予約されてOSでは利用可能ではありません。リリースしたときも Mono で内部的に利用可能となるのみでOSにとつては利用可能ではありません。プロファイラのヒープメモリは増加するのみで,減ることがありません。
もしシステムが割り当てたヒープブロックに新しいデータを当てはめる領域が十分にない場合,Mono により “GC” がコールされ,新しいヒープブロックを割り当て出来るようになります(例えばフラグメンテーションにより)
ヒープのセクションがありすぎるということは Mono メモリを使い切ったことを意味します(フラグメンテーションまたは重い処理により)。
System.GC.GetTotalMemory をしようして Mono でメモリ使用量の合計を取得します。
一般的なアドバイスとしては,出来るかぎり割り当ては小さくします。
Unity メモリはアセット データ(テクスチャ,メッシュ,音声,アニメーション,等),ゲームオブジェクト,エンジン内部処理(レンダリング,パーティクル,物理計算,その他)をハンドリングします。 Profiler.usedHeapSize を使用してUnity メモリ使用量の合計を取得します。
ツールはまだ存在しませんが次のものが使用出来ます。
また,Unity APIを呼び出して自身でツールを作成することが出来ます:
ロードされたオブジェクトへの参照 - これを知る方法はありません。回避方法としてパブリック変数の参照をFindすることです。
どこかの時点でゲームはメモリ不足 “out of memory” でクラッシュするかもしれませんが,理論的には十分なはずです。これが発生した場合,通常のゲームメモリ使用量と今回割り当てされたメモリの大きさを比較します。もし数字にかなり差がある場合,メモリの急増が発生しています。これの要因としては: