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

  • 相关阅读:
    Makefile:2:*** missing separator. Stop.
    Code笔记之:对使用zend加密后的php文件进行解密
    Apache 访问控制
    leetcode-21-合并两个有序链表
    tcp四次挥手的过程
    实现一个LRU算法
    redis为什么快
    二月春日
    你的支持会鼓励我更积极地创作
    静夜思·静夜祈愿
  • 原文地址:https://www.cnblogs.com/littleYellowDoggy/p/11044733.html
Copyright © 2020-2023  润新知