• Material和SharedMaterial的区别


    简单概括

    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
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    Mysql查漏补缺
    RabbitMQ学习笔记
    memcache学习笔记
    Redis问题整理
    JedisCluster获取key所在的节点
    JavaSE编程题
    IDEA快捷键 日常整理
    Idea 常用快捷键列表
    【C++】 构造函数为什么不能声明为虚函数,析构函数可以
    【算法笔记】买卖股票问题--DP/贪心算法
  • 原文地址:https://www.cnblogs.com/littleYellowDoggy/p/11044733.html
Copyright © 2020-2023  润新知