「这是我参与2022首次更文挑战的第3天,活动详情查看:2022首次更文挑战」。
作为一名优秀的开发者,对于技术的探求应该是永无止步的,如何让自己更进步,那就只有不停的学习,不停的充电.而这些都都是说起来容易做起来难,坚持才是难的地方 --蛙哈哈
和 GPU instancing 一样, draw call batching 也是为了提升渲染效率, 降低 draw calls 的功能, 那么 draw call batching 和 GPU instancing 有什么区别呢?
且听我一一道来!
1.静态合批
使用静态合批没有像动态合批那样有很多的限制,使用静态合批, Unity可以减少 任何 几何体大小的 draw calls.前提是它共享相同的材质, 并且不能移动.这种做法比动态合批更有效(不会在CPU上转换的顶点, 所以不会造成额外的CPU的开销),但是会造成额外的内存开销,经典的拿空间换时间.
1.1使用
使用也很简单
只需在你需要静态合批的对象的 Inspector 上面勾选 Static 复选框即可.
1.2原理
静态合批生成的离线网格,会导致放在内存的网格数量剧增,在静态合批中,每一个网格都会生成一份网格数据,无论他们使用的时候是同一个网格.
比如文档所说:
如果多个游戏对象在静态批处理之前共享相同几何体,则会在 Editor 中或运行时为每个游戏对象创建几何体的副本.
有时您必须避免为某些游戏对象进行静态批处理,这样会牺牲渲染性能,但可保持较小的内存占用量,例如在茂密森林关卡中,将树标记为静态可能会产生严重的内存影响。
静态合批后,同一材质实例调用的 draw call 数量合并了, 合批不会消耗CPU的算力,因为他们已经在离线合批时已经计算好了合批的数据(也就是网格数据),在实时渲染时,如果该静态合批模型在摄像机的范围内,CPU就会将这些生成好的网格数据,直接整体提交给GPU,这就会有一个问题,如果这个被合批的网格过大,就会导致CPU和GPU的带宽消耗过大,整个数据必须从系统的内存再拷贝到GPU的显存或者缓存中,再由GPU渲染,这样也会降低效率.
1.3总结
上一篇讲的动态合批为了均衡CPU消耗和GPU的渲染优化,将动态合批做了很多限制,而静态合批则牺牲了大量的内存和带宽,提升渲染效率.上上一篇讲的GPU instancing 则既没有网格的数量的限制,也不需要耗费过大的内存和带宽,很好了弥补了动态合批和静态合批的缺点,是一个不错的技术栈,下一篇,咱们再讲讲GPU instancing的原理和它的一些限制.