うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】ListPool について

Shadow など BaseMeshEffect を継承しているクラスの場合 UIVertex を利用する際に List が必要になる

この List を利用 するたびに new していると Mesh の構築頻度によりますが
メモリリークしてしまったり、CPUのスパイクが発生してしまう可能性が高くなります

        public override void ModifyMesh(VertexHelper vh)
        {
            var output = new UIVertex();
            vh.GetUIVertexStream(output);

そのために Unity の内部では ListPool を利用していました
ListPool では static の領域の List を使い回す処理をしていました

ListPool のコードはこちらをご覧くらださい
uGUI/ListPool.cs at eba27f4eca40e88ba5d76c3f439fef950f9f38a5 · Unity-Technologies/uGUI · GitHub

先程の Shadow のコードであれば このようになります

        public override void ModifyMesh(VertexHelper vh)
        {
            if (!IsActive())
                return;

            var output = ListPool<UIVertex>.Get();
            vh.GetUIVertexStream(output);

しかしながら internal なので外部からは利用できません

これを public にしてしまうとなんでもかんでもこれを利用して Relase を忘れると
メモリがやばいことになると考えて internal なんだと思います・・・

何種類もの型 を PoolList で利用することはおすすめしませんが
BaseMeshEffect を使ったクラスを作成時に、ListPool を利用するのはいいかもしれません