(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]

gameObject.tagをイコールで比較した場合とCompareTagを使った場合の処理時間の比較【Unity】【最適化】


このエントリーをはてなブックマークに追加

この記事でのバージョン
Unity 2018.3.4f1


はじめに

GameObjectにはTagが設定でき、そのTagを比較して判別するという事はよくありますが、


f:id:kan_kikuchi:20190428052226j:plain

var isPlayer = gameObject.tag == "Player";


実はCompareTagというメソッドを使って比較する事も可能で、

しかもCompareTagの方が処理が早かったりもします。


var isPlayer = gameObject.CompareTag("Player");


と言う事で今回は、gameObject.tagをイコールで比較した場合と、CompareTagを使って比較した場合の

具体的な処理時間の比較記事です。


なお、記事内の処理時間は以下のProcessTimerを使って測っています。





処理時間の比較

早速、比較に使ったプログラムです。

int loopCount    = 100000000; //実行回数
string playerTag = "Player";
    
//gameObject.tagをイコールで比較した場合の処理時間計測
ProcessTimer.Restart();
for (int i = 0; i < loopCount; i++) {
  var isPlayer = gameObject.tag == playerTag;
}
Debug.Log("equal : " + ProcessTimer.Stop().ToString("F5"));
    
//CompareTagで比較した場合の処理時間計測
ProcessTimer.Restart();
for (int i = 0; i < loopCount; i++) {
  var isPlayer = gameObject.CompareTag(playerTag);
}
Debug.Log("CompareTag : " + ProcessTimer.Stop().ToString("F5"));

f:id:kan_kikuchi:20190427074402j:plain


実際にUnityエディタ上で実行し、処理時間をまとめてみたものが以下の通りです。

実行回数 ==の処理時間[秒] CompareTagの処理時間[秒]
1 0.00012 0.00007
100 0.00015 0.00008
10,000 0.00250 0.00116
1,000,000 0.26340 0.09998
100,000,000 25.13310 10.01015


前述の通り、CompareTagを使った方が常に早く、1.7倍 ~ 2.6倍もの速度になっています。


ちなみにMac用にビルドし、実機で確認してもほぼ同様の結果が得られました。

f:id:kan_kikuchi:20190427074336j:plain


なお、重いのはイコールでの比較ではなく、gameObject.tagへのアクセスだったりします。

なので、tagをキャッシュし、それをイコールで比較するとむしろCompareTagより早くなります。

int loopCount    = 100000000; //実行回数
string playerTag = "Player";

//タグをキャッシュ
string thisTag = gameObject.tag;
    
//キャッシュしたタグをイコールで比較した場合の処理時間計測
ProcessTimer.Restart();
for (int i = 0; i < loopCount; i++) {
  var isPlayer = thisTag == playerTag;
}
Debug.Log("equal : " + ProcessTimer.Stop().ToString("F5"));
    
//CompareTagで比較した場合の処理時間計測
ProcessTimer.Restart();
for (int i = 0; i < loopCount; i++) {
  var isPlayer = gameObject.CompareTag(playerTag);
}
Debug.Log("CompareTag : " + ProcessTimer.Stop().ToString("F5"));

f:id:kan_kikuchi:20190427074342j:plain


おわりに

処理時間が増えるといっても、少ない処理回数では大したものではありませんが、

色んなものが重なって時間が増していくので、ちょっとした事に気を付けて行くと後々楽になります。


特にCompareTagは簡単に使えますし、可読性も上がりそうなので積極的に使って行きましょう。

なお、tagのキャッシュはよほどの事がない限り、しなくて大丈夫だと思います。


ちなみにRiderだと、gameObject.tagをイコールで比較しているとCompareTagの使用を勧めてくれます。

(これでCompareTagの存在を知った)


f:id:kan_kikuchi:20190427074831j:plain