简单概括
Material:使用的时候,如果有其他物体同时在占用这一份,则会复制一份instance出来,只改变对应的这一份。会留存在内存中,不会销毁。unloadunuse会销毁。
SharedMaterial:改变参数的时候,所有共用的都会改变。
修改对应的接口,在Editor下使用material,其他情况改为SharedMaterial。renderer.GetShareMaterial.
public Material material {
get {
if (_sharedMaterial ~= _material){
_material = new Material (_sharedMaterial);
_sharedMaterial = _material;
}
return _material;
}
set {
_sharedMaterial = value;
}
}
public Material sharedMaterial {
get {
return _sharedMaterial;
}
set {
_sharedMaterial = value;
}
}
使用 material 时的内存泄漏问题
每一次引用 Renderer.material 的时候,都会生成一个新的 material 到内存中去,销毁物体的时候需要我们手动去销毁该material,否则会一直存在内存中。
官方文档说:
This function automatically instantiates the materials and makes them unique to this renderer. It is your responsibility to destroy the materials when the game object is being destroyed. Resources.UnloadUnusedAssets also destroys the materials but it is usually only called when loading a new level.
此方法自动实例化该材质并且使其成为该渲染器独有的材质。当该游戏物体被删除时,你应该手动删除该材质。当替换场景调用 Resources.UnloadUnusedAssets 也可以删除该材质。
网上的解决方案如下:
http://www.xuanyusong.com/archives/2530
编辑器下使用 material, 其他平台使用 sharedMaterial
public static Material GetMaterial(Renderer render) { #if UNITY_EDITOR return render.material; #else return render.sharedMaterial; #endif }
---------------------
原文:https://blog.csdn.net/david_dai_1108/article/details/71598628
版权声明:本文为博主原创文章,转载请附上博文链接!