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

原文地址:https://www.cnblogs.com/littleYellowDoggy/p/11044733.html

时间: 2024-10-22 18:08:31

Material和SharedMaterial的区别的相关文章

关于material和sharedMaterial的问题

在unity3d中,Renderer组件有两个属性:material和sharedMaterial,它们都可以用来获取Renderer的材质属性.但是它们之间却又很大的区别,下面通过示例来讲解一下. 准备工作:unity3d中新建一个空场景:创建两个cube,分别命名为Cube0.Cube1:在Project中新建一个材质球,取名M0,shader选择Unlit/Color,shader的Main Color属性设为白色,即(255,255,255,255);将M0分别赋值给Cube0.Cube

Unity面试题整理

Unity技术面试题 一:什么是协同程序?答:在主线程运行时同时开启另一段逻辑处理,来协助当前程序的执行.换句话说,开启协程就是开启一个可以与程序并行的逻辑.可以用来控制运动.序列以及对象的行为. 二:Unity3d中的碰撞器和触发器的区别?答:碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性.当Is Trigger=false时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果,可以调用OnCollisionEnter/Stay/Exit函数:当Is Trigger=true时,碰撞器被物理引

Unity全面的面试题(包含答案)

这个是我刚刚整理出的Unity面试题,为了帮助大家面试,同时帮助大家更好地复习Unity知识点,如果大家发现有什么错误,(包括错别字和知识点),或者发现哪里描述的不清晰,请在下面留言,我会重新更新,希望大家共同来帮助开发者 一:什么是协同程序? 在主线程运行的同时开启另一段逻辑处理,来协助当前程序的执行,协程很像多线程,但是不是多线程,Unity的协程实在每帧结束之后去检测yield的条件是否满足. 二:Unity3d中的碰撞器和触发器的区别? 碰撞器是触发器的载体,而触发器只是碰撞器身上的一个

Unity3D面试题整合

第一部分 1. 请简述值类型与引用类型的区别答:区别:1.值类型存储在内存栈中,引用类型数据存储在内存堆中,而内存单元中存放的是堆中存放的地址.2.值类型存取快,引用类型存取慢.3.值类型表示实际数据,引用类型表示指向存储在内存堆中的数据的指针和引用.4.栈的内存是自动释放的,堆内存是.NET中会由GC来自动释放.5.值类型继承自System.ValueType,引用类型继承自System.Object.可参考http://www.cnblogs.com/JimmyZhang/archive/2

unity 面试题(答案)

一.什么是渲染管道?是指在显示器上为了显示出图像而经过的一系列必要操作.渲染管道中的很多步骤,都要将几何物体从一个坐标系中变换到另一个坐标系中去.主要步骤有:本地坐标->视图坐标->背面裁剪->光照->裁剪->投影->视图变换->光栅化. 二.如何优化内存?有很多种方式,例如1.压缩自带类库:2.将暂时不用的以后还需要使用的物体隐藏起来而不是直接Destroy掉:3.释放AssetBundle占用的资源:4.降低模型的片面数,降低模型的骨骼数量,降低贴图的大小:

【转载】Unity3D研究院之共享材质的巧妙用法(sharedMaterial效率问题)

如果你需要修改模型材质的颜色,或者是修改材质Shader的一些属性, 通常情况是用获取模型的Renderer组件,然后获取它的material属性. 举个简单的例子,修改颜色或者直接更换shader material.color = Color.red;material.shader = Resources.Load(“Shader/Alpha-Diffuse”, typeof(Shader)) as Shader; Render可以使用material或者是sharedMaterial两个属性

android-基础编程-ToolBar

Android 3.0  Android 推了 ActionBar 这个控件,而到了2013 年 (4.0)Google 开始大力地推动所谓的 android style,material design . toolbar actionbar 区别在toolbar可以改变任意位置. toolbar布局: setNavigationIcon 即设定 up button 的图标,因为 Material 的介面,在 Toolbar这里的 up button样式也就有別于过去的 ActionBar 哦.

U3D常用题

最先执行的方法是:1.(激活时的初始化代码)Awake,2.Start.3.Update[FixUpdate.LateUpdate].4.(渲染模块)OnGUI.5.再向后,就是卸载模块(TearDown),这里主要有两个方法OnDisable与OnDestroy 高频问答的问题:1.什么是渲染管道?是指在显示器上为了显示出图像而经过的一系列必要操作.渲染管道中的很多步骤,都要将几何物体从一个坐标系中变换到另一个坐标系中去.主要步骤有:本地坐标->视图坐标->背面裁剪->光照->裁

Unity常见面试题大全

1.       [C#语言基础]请简述拆箱和装箱. 答: 装箱操作: 值类型隐式转换为object类型或由此值类型实现的任何接口类型的过程. 1.在堆中开辟内存空间. 2.将值类型的数据复制到堆中. 3.返回堆中新分配对象的地址. 拆箱操作: object类型显示转换为值类型或从接口类型到实现该接口值类型的过程. 1.判断给定类型是否是装箱时的类型. 2.返回已装箱实例中属于原值类型字段的地址. 2.        [.NET(C#)] attribute,property,markup,ta