Unity性能优化——关于批处理

Unity性能优化

Unity中的动态批处理和静态批处理(Draw Call)没有减少三角形数量

绘制原理

为了讲物体绘制到屏幕上,引擎必须向图像API(OpenGL、Direct3D)发送一个DrawCall指令,每一次发送DrawCall指令的过程为一个渲染批次(Batch),而这个过程分为两大部分:设置渲染状态(setPass)和调用DrawCall(Batches)【其中设置渲染状态属于比较重的分工,对于加载到游戏中的资源和对象等,CPU需要计算其顶点相关的矩阵,渲染所用贴图,渲染所用到的材质和Shader,渲染所用到的灯光等,如果每个物体的材质和贴图等都不一样,此时CPu的主要工作就是设置这些物体的渲染状态后调用DrawCall,从而造成CPU性能的开销,简单来说也就是CPU向GPU发送指令并由GPU进行绘制CPU设置渲染状态】(如果能够减少重复渲染状态的切换,能够优化)

什么是批处理

因为CPU每一次发送DrawCall指令都会造成CPU的能开销,CPU在处理图形数据时,比GPU慢了很多,所以可以将绘制的压力移交给GPU。

Unity可以将一些物体进行合并,从而利用一次DrawCall来渲染他们。这一操作称为批处理,批处理能得到更好的渲染性能(批处理没有减少GPU的开销,减轻了CPU的工作量(减少CPU切换(设置)状态次数),也使GPU的利用率提高)。

渲染统计窗口

Batches:相当于DrawCall次数

Saved by batching:通过批处理节省的DrawCell次数

Set Pass calls: 设置渲染状态的次数

动态批处理

动态批处理默认是关闭的,需要手动打开(editor->project setting->Player->other setting->Dynamic Batching)

条件限制:(材质对应渲染状态)

  1. 必须使用相同材质(相同材质之间的差别只在于顶点数据不同,可以将顶点数据合并在一起,再一起发送给GPU)
  2. Mesh不能超过900个顶点(带uv的模型不能超过300个顶点)
  3. transform的scale属性不能有负值(有负值模型就已经翻转了)【一般不出现】不考虑
  4. 多个pass的shader会破坏批处理【例如:卡通渲染和卡通勾边渲染:卡通渲染一个pass处理,卡通勾边渲染两个pass处理,这两个虽然材质相同但是不能放在一个批次处理】
静态批处理

在Inspector面板右上角勾选上Static,只要勾选上Static并拥有相同材质的物体就可以在运行时(在还没有运行时)进行静态批处理

但是静态批处理会为每一个物体创建一个合并后的CombinedMesh,需要额外的内存空间来存储合并后的CombinedMesh,所以使用时慎用,内存开销大

总结
  1. 静态批处理和动态批处理都能降低DrawCall,最主要前提是物体使用同一个材质
  2. 静态批处理适合于场景中不会改变并且单对象不能太多的物体,像树林,草地这种动态批处理更适合
  3. 动态批处理限制较多,顶点数要求,材质要求等。静态批处理限制较少,是内存换性能的方法(空间换时间)
合并网格

静态批处理会增加额外的内存消耗去存储合并后的Mesh,但原先没有用的Mesh仍保留在内存中,所以可以通过代码动态合并网格后将原先的网格销毁或隐藏。

MeshFilter:网格来源(Mesh是没有优化的网格,sharedMesh是优化后的网格)

通常情况下一个模型只有一个Mesh Renderer

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值