Unity 高頻度で呼ばれるメソッド内ではなるべくnew()しないほうがいいという話を身をもって実感したお話
Unity 2020.2.7
Ryzen9 3900X
こないだ作った接地判定スクリプトにおいて、Update()内でnew()してる部分がある。
よく「インスタンス生成コストが高いので高頻度で呼ばれるメソッド内でなるべくnew()しないほうがいい」という話は耳にしていたが、実際のところどの程度パフォーマンスに影響が出るか気になった。
今回は、newする場合としない場合のメソッドをループ実行して掛かった合計時間を計測してみた。
(newする事以外の処理内容はほぼ同じ)
計測用コード
以下の記事を参考にしました。
private void Start() { System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); sw.Start(); for (int i = 0; i < 10000; i++) { for (int j = 0; j < 10000; j++) { GetRayStartPosition(); } } sw.Stop(); Debug.Log(sw.ElapsedMilliseconds + "ms"); }
newするメソッド
Vector3 GetRayStartPosition(float offset = 0) { return new Vector3(transform.position.x, transform.position.y + offset, transform.position.z); }
newしないメソッド
Vector3 GetRayStartPosition(float offset = 0) { Vector3 t = transform.position; t.y += offset; return t; }
測定結果
メソッド | 合計時間 |
---|---|
newする | 18214ms |
newしない | 6424ms |
なんと倍以上の差が出た。
接地判定するために常に動き続ける処理なので軽いのに越したことはない。
塵も積もればなんとやら。
メモ
newしたときのメモリ管理についてわかりやすく説明されている。