【ハルシオンブログ】Unity Updateの中でGetComponentをしてはいけませんよ?っていう基本の話
5月も終わりですね。
5月もあっという間に終わった感じがします。
さて横浜ゲームダンジョンに出ようかどうしようか・・・・・・坂内っす。
ポケットガール~受け継がれし希望~よろしくお願いします。
URL(Android):https://play.google.com/store/apps/details?id=com.halcyon.pocketgirl3
URL(iOS):https://itunes.apple.com/jp/app/id1539553611
PV:
Unityでの基本的な話なんだけど、Update内でGameObject.Findをしないという話。
よく聞きますよね。
実際にどれくらい重くなるのか試してみました。
[Blog20230529.cs]

Startでは画面の負荷をあげるために、Sphereを1000個画面に適当に置いてます。
2000回Imageの色を変えて時間を測ります。
Updateの中の
GameObject.Find("imgPlate").GetComponent<Image>().color = new Color(Random.value, Random.value, Random.value, 1f);
と
imgPlate.color = new Color(Random.value, Random.value, Random.value, 1f);
を切り替えて実行してみました。
【GameObject.Find("imgPlate").GetComponent<Image>().color = new Color(Random.value, Random.value, Random.value, 1f);の場合】
11.10498秒
【imgPlate.color = new Color(Random.value, Random.value, Random.value, 1f);の場合】
11.27025秒
か・・・変わらねえ・・・・というか、GetComponentしてない方が遅い!?
あれ??
まぁただ、Updateで毎フレームFindで取得しにいくのはちょっと気持ち悪いのは気持ち悪いですよね…
ちなみに処理負荷上げるために玉を10000個置いても、処理時間に差がありませんでした‥
うちのPCだとちょっと時間の差はありませんでしたが、やめた方がいいですね!キリッ
ということで、UpdateでGetComponentをしない方がいいよという話。全然検証になってませんが。
では、あでゅ~!ノシ
5月もあっという間に終わった感じがします。
さて横浜ゲームダンジョンに出ようかどうしようか・・・・・・坂内っす。
ポケットガール~受け継がれし希望~よろしくお願いします。
URL(Android):https://play.google.com/store/apps/details?id=com.halcyon.pocketgirl3
URL(iOS):https://itunes.apple.com/jp/app/id1539553611
PV:
Unityでの基本的な話なんだけど、Update内でGameObject.Findをしないという話。
よく聞きますよね。
実際にどれくらい重くなるのか試してみました。
[Blog20230529.cs]
using UnityEngine;
using UnityEngine.UI;
public class Blog20230529 : MonoBehaviour
{
[SerializeField] GameObject obj;
[SerializeField] Image imgPlate;
int rdmCnt = 0;
System.Diagnostics.Stopwatch stopwatch;
bool isMeasuring;
private void Start() {
// 準備
for (int i = 0; i < 1000; i++) {
Instantiate(obj, new Vector3(Random.Range(-3f, 3f), Random.Range(-4f, 6f), 0), Quaternion.identity);
}
stopwatch = new System.Diagnostics.Stopwatch();
stopwatch.Start();
isMeasuring = true;
}
private void Update() {
if (isMeasuring) {
rdmCnt++;
GameObject.Find("imgPlate").GetComponent<Image>().color = new Color(Random.value, Random.value, Random.value, 1f);
//imgPlate.color = new Color(Random.value, Random.value, Random.value, 1f);
if (rdmCnt >= 2000) {
isMeasuring = false;
stopwatch.Stop();
Debug.Log((float)stopwatch.Elapsed.TotalSeconds);
}
}
}
}

Startでは画面の負荷をあげるために、Sphereを1000個画面に適当に置いてます。
2000回Imageの色を変えて時間を測ります。
Updateの中の
GameObject.Find("imgPlate").GetComponent<Image>().color = new Color(Random.value, Random.value, Random.value, 1f);
と
imgPlate.color = new Color(Random.value, Random.value, Random.value, 1f);
を切り替えて実行してみました。
【GameObject.Find("imgPlate").GetComponent<Image>().color = new Color(Random.value, Random.value, Random.value, 1f);の場合】
11.10498秒
【imgPlate.color = new Color(Random.value, Random.value, Random.value, 1f);の場合】
11.27025秒
か・・・変わらねえ・・・・というか、GetComponentしてない方が遅い!?
あれ??
まぁただ、Updateで毎フレームFindで取得しにいくのはちょっと気持ち悪いのは気持ち悪いですよね…
ちなみに処理負荷上げるために玉を10000個置いても、処理時間に差がありませんでした‥
うちのPCだとちょっと時間の差はありませんでしたが、やめた方がいいですね!キリッ
ということで、UpdateでGetComponentをしない方がいいよという話。全然検証になってませんが。
では、あでゅ~!ノシ
Category: 開発日記(Unity)
« 【ハルシオンブログ】out修飾子のあるメソッドを作る | 【ハルシオンブログ】ifでキャスト判定した時にそのままキャストした変数として使う »
コメント
| h o m e |