您的位置:首页 > 移动开发 > Unity3D

一个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销毁
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  unity 内存泄露