Unity性能优化1-->材质合并

本文探讨Unity性能优化中的材质合并方法,以减少DrawCall,降低CPU负担。通过合并相同材质的物体,生成新网格和材质,优化场景渲染效率。介绍了合并步骤,包括合并纹理、刷新UV坐标等,并讨论了适用条件和潜在问题。适用于美术资源材质单一且场景物体连续性不强的情况。
摘要由CSDN通过智能技术生成

前言:

       写这篇博客主要是为了让自己重新思考些东西。


       Unity项目性能优化中,DrawCall 一直出现在我们的视野。而Drawcall 的减少,则跟 UI,场景,模型,息息相关。今天主要聊聊在场景或模型上合并材质减少DC的实现方法。

UI的DC优化有空再出。


为什么要进行材质合并?

        假设在场景中有100个物体,使用的是相同的材质,排除Unity静态合并的影响下,渲染时DrawCall的数量就是100,而Drawcall的增加直接加重了设备CPU的负担。

那么怎样能减少DrawCall呢?   

         既然这100个物体使用的是相同的材质,那么就让他们合体呗,反正都是一家人,这样我们就有可能将这100个Drawcall变成1.


材质合并需要做什么?

        合并材质,实际上是生成一个新的渲染器 和 一个新的网格,将多个子物体网格合并成新的网格,使用公共shader生成新的材质,并将小物体纹理合并成一张大的纹理,赋值为新渲染器的主纹理。


普通的MeshRender的材质球合并:


1.合并所有材质球所携带的贴图,新建一个材质球,并把合并好的贴图赋予新的材质球。


2.记录下每个被合并的贴图所处于新贴图的Rect,用一个Rect[]数组存下来。


3.合并网格,并把需要合并的各个网格的uv,根据第2步得到的Rect[]刷一遍。


4.把新的材质球赋予合并好的网格,此时就只占有1个drawcall了。


  1. void CombineMesh()  
  2.     {  
  3.         //获取所有子物体的网格
  4.         MeshFilter[] mfChildren = GetComponentsInChildren<MeshFilter>();  
  5.         CombineInstance[] combine = new CombineInstance[mfChildren.Length];  
  6.   
  7.        //获取所有子物体的渲染器和材质
  8.         MeshRenderer[] mrChildren = GetComponentsInChildren<MeshRenderer>();  
  9.         Material[] materials = new Material[mrChildren.Length];  
  10.   
  11.         //生成新的渲染器和网格组件
  12.         MeshRenderer mrSelf = gameObject.AddComponent<MeshRenderer>();  
  13.         MeshFilter mfSelf = gameObject.AddComponent<MeshFilter>();  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值