答えて
ユニティ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/
私は、変数をキャッシュすることはComponent
クラスからgameObject
変数を使用するよりも高速であると仮定して、簡単なテストでは、それが本当であることが判明しました。これは、get
アクセサを使用して参照を返すgameObject
を使用するのではなく、参照をキャッシュするためです。参照を取得するにはネイティブ関数呼び出しが必要かどうかはわかりませんが、それは可能です。 get
アクセサを使用すると、直接参照アクセスよりも速度が遅くなります。
gameObject.activeSelf
またはキャッシュされたバージョン_GameObject.activeSelf
を呼び出す100万のスクリプトがあるとします。
試験結果:
ゲームオブジェクト:
54
MSキャッシュ_GameObject:
- ユニティ5.6.0f3
:
ソフトウェア/ハードウェア上でテスト30
MS
それが重要ですか?
通常のアプリでは、多分そうではありません。ゲームでは、はい。ゲームの種類によっては、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);
}
- 1. シェルのアイコンを取得する最速の方法
- 2. 外部ウェブページのスクリーンショットイメージを取得する最速の方法
- 3. SubSonicで単一のレコードを取得する最速の方法
- 4. クエリの総レコード数を取得する最速の方法
- 5. 新しいアクティビティでTouchEventを取得する最速の方法
- 6. ビットを設定して取得する最速の方法
- 7. ビューポートで要素を取得する最速の方法
- 8. ウェブサイトから値を取得する最速の方法
- 9. PHPで複数のHTTPリクエストヘッダを取得する方法(最速|高速)
- 10. IDでXMLノードを取得する最も速い方法は
- 11. 次の1000レコードを取得する方法は最速の方法
- 12. djangoのクエリーセットから最初のオブジェクトを取得する最速の方法は?
- 13. Haskellでリストの最後の要素を取得する最速の方法
- 14. ulong(C#)の最下位ビット位置を取得する最速の方法は?
- 15. Rustのベクトルからリファレンスのスライスを取得する方法は?
- 16. UNoのリファレンスのアドレスを取得する方法は?
- 17. jqueryの 'this'リファレンスのクラス名を取得する方法
- 18. javascript inbuilt関数の汎用リファレンスを取得する方法
- 19. matlabコードのBibTexリファレンスを取得する方法。
- 20. コンストラクタメソッドの取得方法Javaでリフレクションを使用するリファレンス
- 21. Sparkの処理済みデータフレームレコードの最速の取得方法
- 22. サブストリングを最速で取得する
- 23. すべてのページでユニバーサルフッターを取得する最速の方法は?
- 24. S3オブジェクトのメタデータ(NodeJS API)を取得するための最速の方法
- 25. javacriptを使用してドメイン/ホスト名を取得する最速の方法
- 26. タグとGCEインスタンスのステータスを取得する最速の方法は?
- 27. はMnesiaから大量のデータを取得する - 最速の方法
- 28. SQL Serverの条件でテーブルレコード数を取得する最速の方法
- 29. 角度の現在の象限を取得する最も速い方法
- 30. google analytics apiから基本情報を取得する最速の方法