投稿者 tel | 2011年8月25日

Unityのtransformのアクセス速度

Unityのtransformについてちょっと調べてみたのでメモ。

シーン中に配置されているオブジェクトはTransformのコンポーネントがくっついてるためスクリプトから位置を変えることができる。位置を変えるにはTransform.positionのVector3型のプロパティを変えればいい。JavaScriptではx座標を動かす場合、次のように書ける。

transform.position.x += 1.0f;

これをC#で同じように記述しようと思った場合、

transform.position = new Vector3(1.0f, 0.0f, 0.0f);

とする必要がある。JavaScriptみたいにposition.xとできないのはVector3が構造体でpositionが値を返すため。

ここである疑問が浮かぶ。

「JavaScriptで記述したほうが構造体を生成してないし、xにしか値入れてないし速いんじゃね?」

というわけで検証してみた。シーンにキューブをおいて次のコードをくっつけた。

コード

1. transform.positionの要素に値を足す

var iter: int = 10000;

function Start() {
    var start: float = Time.realtimeSinceStartup;
    for(var i: int = 0; i < iter; i++) {
        transform.position.x += 0.001f;
    }
    start = Time.realtimeSinceStartup - start;
    Debug.Log(start);
}

2. transformをキャッシュしておく

var iter: int = 10000;

function Start() {
    var start: float = Time.realtimeSinceStartup;
    var t: Transform = transform;
    for(var i: int = 0; i < iter; i++) {
        t.position.x += 0.001f;
    }
    start = Time.realtimeSinceStartup - start;
    Debug.Log(start);
}

3. positionにVector3を足す

var iter: int = 10000;

function Start() {
	var start: float = Time.realtimeSinceStartup;
	var t: Transform = transform;
	var v: Vector3 = new Vector3(0.001f, 0.0f, 0.0f);
	for(var i: int = 0; i < iter; i++) {
		t.position += new Vector3(0.001f, 0.0f, 0.0f);
	}
	start = Time.realtimeSinceStartup - start;
	Debug.Log(start);
}

4. C#で

using UnityEngine;
using System.Collections;

public class cs_test : MonoBehaviour {
	public int iter = 100;

	void Start () {
		float start = Time.realtimeSinceStartup;
		Transform t = transform;
		for(int i = 0; i < iter; i++) {
			t.position += new Vector3(0.001f, 0.0f, 0.0f);
		}
		start = Time.realtimeSinceStartup - start;
		Debug.Log(start);
	}
}

計測結果

それぞれ5回計測して中央値をとった。

  1. 0.01833411
  2. 0.01582873
  3. 0.01554751
  4. 0.01529592

結論

別に速くなかった。そのほか分かったことは

  • transformは頻繁にアクセスするならキャッシュしておく。
  • JavaScriptでpositionのxyzすべてに値を入れるならVector3を作って代入したほうがいい。

Unityのエディタ上でしか試していないのでビルドして実行した場合、結果が変わるかもしれない。


コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

カテゴリー

%d人のブロガーが「いいね」をつけました。