赞
踩
关于 unity 项目相关优化经验的墨迹
目的在于减少 cpu 与 gpu 交互的次数, 也就是所谓的 批次.
cpu 往 gpu 提交一次数据为 一个批次. 所以可以在 cpu 层做好 合批 的工作, 将原来需要多次提交的数据合拼到一个批次中提交.
所有合批的方式都有个核心的前提就是: 材质球要相同. 其实就是提交给 gpu 的数据相同, 材质球 封装了 往 gpu 提交的数据, 包好 贴图 和 一些uniform 变量.
在 unity 中, 如果通过 render.material 获取 材质球 的话, 其实获取到的是一个 复制拷贝后的 材质球副本, 就会从原来的合批中分离, 导致批次增加. 通过 render.sharedMaterial 获取的才是共享的 材质球 就不会, 但一旦改变, 所有引用这个材质球的mesh的表现都会改变.
合批的优先级是: static batching > instancing > dynamic batching.
在另一方面, 静态合批 允许引擎为任何尺寸的几何降低draw call(如果它不移动,并且共用相同材质)。 静态合批 比动态批处理效果好得多,因为它需要消耗更少的CPU,所以你应该选择 静态合批 。
使用 静态合批 需要额外的内存来存储合并的几何。如果几个物体在批处理前共用相同的几何,那么在编辑器中或运行时,对每个物体都会创建一份几何的拷贝。
批处理不一定是好的,有时候对有些物体,你需要牺牲渲染性能来避免批处理,以减少内存消耗。比如,把一片浓密森林中的每一棵树标注为静态的,会消耗很大的内存。
静态合批 降低批次,而不是draw call数,draw call还是那么多,但是使用 静态合批 可以获得更快的效果。
打开 静态合批 开关. file -> build settings -> player settings -> other settings , 勾选上 static batching
为了利用 静态合批 ,你应该显式指定某些物体是静态的,并且它不移动、旋转或缩放。你可以在检视器(Inspector)中使用Static checkbox来标明物体是静态的。
静态合批 调试需要在运行时调试
从绘制顺序上来看, 因为 unity 渲染 不透明物体时, 渲染顺序是由远 ( 参考总结: graphic-前向渲染管线浅析.md 中的 深度测试提前:Early-Z技术)
最远的两个会 静态合批
绘制中间的 cube 时, 打断了所有 sphere 和 圆柱体 的 静态合批. 原因是因为 cube 使用了 和 sphere,圆柱体 不同的材质
参考总结: unity-shader-GPU-Instancing.md
Unity可以自动批量处理移动的物体到相同draw call,如果他们共享相同的材质并且遵守其它标准。动态批处理是自动完成的,你不需要做任何事。
批处理动态物体在每个顶点有一定开销,所以批处理只对总共包含小于900个顶点的网格进行。
如果你的着色器使用顶点位置、法线和UV值,那么最多可以批处理300个顶点;如果你的着色器使用了 顶点位置、法线、UV0、UV1和切线,那么只能处理180个顶点。
一般的,物体应该使用相同的缩放。
使用不同材质的实例,即使他们本质上是相同的,但是物体不批处理到一起。含有lightmaps的物体有附加的渲染参数:lightmap 索引和偏移/缩放,所以,一般来说,为了批处理动态lightmap 的物体,应该严格的指向相同的lightmap部位。
多通道着色器会破坏批处理,几乎所有 unity 着色器在前向渲染时都支持几个灯光,并且为它们添加高效的附加通道。“附加的逐像素灯光”的draw call不会被批处理。
接受实时阴影的物体也不会被批处理。
Other batching tips 其它批处理提示
目前,只有Mesh.Renderers和粒子系统使用批处理,蒙皮网格、衣服、尾迹渲染和其它类型的渲染组件并没有批处理。
半透明 shader 为了透明效果的需要,常常要求物体以由后向前的顺序渲染。Unity首先要求物体以这种顺序,然后试着批处理它们,但是因为顺序被严格限制了,所以,不透明物体比透明物体会获得更好的批处理效果。
Unity 的有些渲染还没实现批处理,比如渲染阴影投射、相机的深度纹理或者 GUI 将不会做批处理。
从绘制顺序上来看, 因为 unity 渲染 不透明物体时, 渲染顺序是由远 ( 参考总结: graphic-前向渲染管线浅析.md 中的 深度测试提前:Early-Z技术)
绘制中间的 capsule 时, 打断了所有 cube 的 动态合批. 原因是因为 capsule 的顶点数超过了300限制
如果把视角换到 从左往右 看, 那么 capsule 就是最后一个不透明物体, 就不会打断所有 cube 的 动态合批
因为 unity 渲染 不透明物体时, 渲染顺序是由远 ( 参考总结: graphic-前向渲染管线浅析.md 中的 深度测试提前:Early-Z技术)
所以这个很容易打断 静态合批 , gpu instancing, 动态合批 这三种合批方式. 需要注意这个问题.
通过 unity 内置的 帧调试器, 可以看出每一帧的绘制情况, 要运行时去调试. 因为运行时才会 static batch.
比如 cube 和 cylinder 应该是需要动态合批的, 但是实际上没有合批, 调试提示也很明显了, dynamic batch 开关没有打开.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。