poi’s tech blog

3D多人数同時接続型球体アクション成人向けゲーム開発のためのアイデア、ナレッジ

Unity 高頻度で呼ばれるメソッド内ではなるべくnew()しないほうがいいという話を身をもって実感したお話

Unity 2020.2.7

Ryzen9 3900X

こないだ作った接地判定スクリプトにおいて、Update()内でnew()してる部分がある。

poipoipoip.hatenablog.com

よく「インスタンス生成コストが高いので高頻度で呼ばれるメソッド内でなるべくnew()しないほうがいい」という話は耳にしていたが、実際のところどの程度パフォーマンスに影響が出るか気になった。

今回は、newする場合としない場合のメソッドをループ実行して掛かった合計時間を計測してみた。

(newする事以外の処理内容はほぼ同じ)

計測用コード

以下の記事を参考にしました。

qiita.com

    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したときのメモリ管理についてわかりやすく説明されている。

chocochoco.hatenablog.com