使用Unity3D做开发的朋友应该都知道,对于实例化出来的模型,我们改变它身上的颜色值或者贴图之类,Unity是会把它当前使用的ShareMaterial复制一份实例出来,以做到不同对象身上的材质互不影响的改变参数。但这样做会导致如果使用的对象很多,就会产生很多材质的实例的问题,这样会对内存有一定的消耗。
下面做了这么一个例子:

在场景里面生成了多个cube,然后用代码改变他们的颜色:

给每一个cube随机一种颜色,然后用传统的material.color来设置颜色。

结果会是这样,各个cube的颜色变化了。

从Profiler里面看看内存,会发现场景内存里面,有很多的InstanceMat(Instance)。这就是生成出来的材质实例。

接下来改一下代码,使用MaterialPropertyBlock来作为设置颜色的手段:


可以看到我们会先new一个MaterialPropertyBlock,然后给它赋值,最后用Renderer.SetPropertyBlock方式给MeshRender设置属性。

运行时,可以看到运行的结果和之前的写法是一样的。

再从Profiler里面看看内存。

这次可以看到,并没有生成任何的Material的实例出来。

技术
下载桌面版
GitHub
Gitee
SourceForge
百度网盘(提取码:draw)
云服务器优惠
华为云优惠券
腾讯云优惠券
阿里云优惠券
Vultr优惠券
站点信息
问题反馈
邮箱:[email protected]
吐槽一下
QQ群:766591547
关注微信