2017-05-24 14 views

答えて

1

ユニティ4.xで、以下、キャッシュ方法が大幅に高速になります。これらのバージョンでは、MonoBehaviour.transformとMonoBehaviour.gameObjectは実際にはフィールドではありませんでした。むしろ、「フードの下で」彼らは付属のアクセサでプロパティのように振る舞いました。

したがって、gameObjectプロパティにアクセスすると、アクセサを介してComponent.get_gameobject()メソッドが呼び出されます。もちろん、メソッド呼び出しでは、単純なメモリアクセスよりもオーバーヘッドが多くなります。 (トランスフォームは悪化していましたが、アクセサーが実際にGetComponentメソッドを呼び出して値を返したようです)

これは、ベテランのUnity開発者がこれらの値をキャッシュすることが多い理由です。

私は、このプロセスがより良いパフォーマンスのためにUnity 5で合理化されていることを正式に認めています。組み込みのプロパティを使用すると、非常に少ないオーバーヘッドが作成されますが、それは重要ではないと言われています。

出典:https://blogs.unity3d.com/2014/06/23/unity5-api-changes-automatic-script-updating/

1

私は、変数をキャッシュすることはComponentクラスからgameObject変数を使用するよりも高速であると仮定して、簡単なテストでは、それが本当であることが判明しました。これは、getアクセサを使用して参照を返すgameObjectを使用するのではなく、参照をキャッシュするためです。参照を取得するにはネイティブ関数呼び出しが必要かどうかはわかりませんが、それは可能です。 getアクセサを使用すると、直接参照アクセスよりも速度が遅くなります。

gameObject.activeSelfまたはキャッシュされたバージョン_GameObject.activeSelfを呼び出す100万のスクリプトがあるとします。

試験結果:

ゲームオブジェクト:54 MS

キャッシュ_GameObject:

  • ユニティ5.6.0f3

ソフトウェア/ハードウェア上でテスト30 MS

  • のWindows 10のPro
  • MacBookPro11,4
  • 16ギガバイトのRAM
  • それが重要ですか?

    通常のアプリでは、多分そうではありません。ゲームでは、はい。ゲームの種類によっては、24msをゲームから除外するのは良い改善です。

    テストスクリプト:

    public GameObject _GameObject; 
    
    void Start() 
    { 
        Application.runInBackground = true; 
    
        int iterations = 1000000; 
    
        //TEST 1 
        Stopwatch stopwatch1 = Stopwatch.StartNew(); 
        for (int i = 0; i < iterations; i++) 
        { 
         bool active = gameObject.activeSelf; 
        } 
        stopwatch1.Stop(); 
    
        //TEST 2 
        Stopwatch stopwatch2 = Stopwatch.StartNew(); 
        for (int i = 0; i < iterations; i++) 
        { 
         bool active = _GameObject.activeSelf; 
        } 
        stopwatch2.Stop(); 
        //SHOW RESULT 
        WriteLog(String.Format("gameObject: {0}", stopwatch1.ElapsedMilliseconds)); 
        WriteLog(String.Format("Cached _GameObject: {0}", stopwatch2.ElapsedMilliseconds)); 
    } 
    
    void WriteLog(string log) 
    { 
        UnityEngine.Debug.Log(log); 
    } 
    
    関連する問題