Unity, C#で使えそうなパフォーマンス改善メモ

ListPool

  • Getで使用
  • Releaseで返却(※忘れないように注意)

フィールドではなく関数内で使う感じかな...

 

Transform

  • キャッシュするとちょっと早い
  • Transforom.hasChangedで変更検知

 

AsSpan<T>

foreach(var item in list.AsSpan())

とすると速くなる

 

AddRange(IEnumerable<T> collection)

ループ内でlist.AddするよりもAddRangeを使う

最初に要素数が決まっているならnew List(要素数)が一番良い

 

ref 構造体

引数を参照渡しにすることでコピーを防ぐ

struct Hoge{}
void Huga(ref Hoge hoge){}

 in, outrefreadonlyと書き込み強制版

 

変数のキャプチャ

上位スコープ変数の受け渡しによるもの

ラムダ式やローカル関数で発生するため注意する

 

Boxing

以下のようなときに発生

  • DictionaryKeyに構造体を使おうとする
  • IEnumerable<構造体> Foreachしようとする

構造体には以下の実装をすることで回避

  • IEquatable<T>
  • override bool Equals<T>(object obj)
  • override int GetHashCode()

 

ループ内Linq

多重ループ

foreach, while 内でLinqを使うと大変