一个Unity材质赋值内存泄露问题
2017-10-18 15:52
525 查看
void Update
{
selfmaterial = gameObject.renderer.material
gameObject.renderer.material = m2 //m2为另一个材质
}
这两行代码导致材质不断复制,造成内存泄露,只留任何一行代码都不会导致这个现象
原因为:
第一帧调用update
selfmaterial = gameObject.renderer.material
访问材质导致unity赋值一份sharematerial的材质并且分别赋值给sharematerial和material
gameObject.renderer.material = m2
此时matrial不等于m2,unity更新sharematrial和material,此时该物体还没有自己的matrial
下一帧调用update
selfmaterial = gameObject.renderer.material
此时物体没有自己的material,又重复第一帧的事
猜测Unity实现是:
最开始,只有sharematrial有值,material初始为空值
material
{
Get
{
if(matrial != sharematrial)
{
material= Instantiate(sharematrial);//复制sharematerial,内存泄露点
sharematrial = material;
}
return material;
};
Set(Value)
{
sharematrial = Value;
};
}
如何避免:
不要在update中设置新的材质,如果无法避免,这样做
material.shader = newmaterial.shader;
material.CopyPropertiesFromMaterial(newmaterial);
访问了material后,复制了材质,销毁这个物体时,这个材质需要手动销毁,unity不负责
也可调用Resources.UnloadUnusedAssets销毁
{
selfmaterial = gameObject.renderer.material
gameObject.renderer.material = m2 //m2为另一个材质
}
这两行代码导致材质不断复制,造成内存泄露,只留任何一行代码都不会导致这个现象
原因为:
第一帧调用update
selfmaterial = gameObject.renderer.material
访问材质导致unity赋值一份sharematerial的材质并且分别赋值给sharematerial和material
gameObject.renderer.material = m2
此时matrial不等于m2,unity更新sharematrial和material,此时该物体还没有自己的matrial
下一帧调用update
selfmaterial = gameObject.renderer.material
此时物体没有自己的material,又重复第一帧的事
猜测Unity实现是:
最开始,只有sharematrial有值,material初始为空值
material
{
Get
{
if(matrial != sharematrial)
{
material= Instantiate(sharematrial);//复制sharematerial,内存泄露点
sharematrial = material;
}
return material;
};
Set(Value)
{
sharematrial = Value;
};
}
如何避免:
不要在update中设置新的材质,如果无法避免,这样做
material.shader = newmaterial.shader;
material.CopyPropertiesFromMaterial(newmaterial);
访问了material后,复制了材质,销毁这个物体时,这个材质需要手动销毁,unity不负责
也可调用Resources.UnloadUnusedAssets销毁
相关文章推荐
- 一个JS图片放大镜,实现动态记录的图片放大,避免内存泄露,解决IE6下无法遮盖select控件问题
- 一个内存泄露问题的定位
- 一个JS图片放大镜,实现动态记录的图片放大,避免内存泄露,解决IE6下无法遮盖select控件问题
- 一个常见的android内存泄露 问题
- 一个诡异的C++内存泄露问题。
- 修正了一个内存泄露的问题
- 写了一个可以记录路线的计步器,好像有内存泄露问题,求指点
- 关于一个内存泄露的问题
- 一个常见的android内存泄露 问题
- 一个不经意的内存泄露问题
- 一个常见的android内存泄露 问题
- 一个C语言典型的内存泄露问题
- leakcanary作者发现的一个Dialog的各种listener容易引发的内存泄露问题
- python多重赋值的一个小问题
- 关于JNI内存泄露问题
- Handler 当做内部类,导致内存泄露的问题
- 关于WebView的内存泄露问题
- java内存泄露问题详解
- 共享内存内使用指针引起的一个问题。
- Java内存泄露问题