8
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[Unity] Rendererのmaterialプロパティはメモリリークの原因になりうる

Last updated at Posted at 2018-07-11

知らずにメモリリークをさせないために

Material(Clone)の恐怖

Rendererに存在しているmaterial,materialsはアクセスした時点で複製が作られる
これは参照元のマテリアルのパラメータが変更されるのを防ぐため

そしてやっかいなのが、このCloneは自動で破棄されない

var materials = Renderer.materials;
int number = Renderer.materials.Length;
Debug.Log( Renderer.material.shader.name );

どんな形であっても、アクセスした時点でCloneは強制的に作られる

対策

sharedMaterial,sharedMaterialsを使う

参照元のマテリアルのパラメータを直で変更する
ただし永続的に変更されるので注意が必要

OnDestroyでしっかり破棄する

var renderer = GetComponent<Renderer>();
int length   = renderer.materials.Length;
for(int i = 0; i < length; ++i)
{
 Destroy( renderer.materials[i] );
}

リークしているかを調べるには

ProfilerのMemoryにあるMaterial Countが増えていっているようならリークしてます

8
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?