基于Unity3D游戏开发的批处理技术研究
来源:用户上传
作者:
摘 要:在传统游戏开发的过程中,图形渲染上的优化一直是一个难题,在Unity中最常用的優化方法就在于减少DrawCall,一次DrawCall就是CPU准备数据并通知GPU绘制图形的过程。当DrawCall数量过多时,就会导致CPU大量计算进而导致CPU过载,影响游戏运行效率。而在Unity中,最有效的优化DrawCall的方法就是批处理,Unity中的批处理分为动态批处理和静态批处理。同时,两种批处理的效率和适用范围也不一样。可以通过Unity的Stats面板信息,观察实际批处理对DrawCall数量的影响。对于动态批处理来说,优点是一切处理Unity自动完成的,不需要做任何操作,而且物体可以移动,缺点是限制很多。而对于静态批处理来说,它的优点是自由度很高,限制很少;但缺点是可能会占用更多的内存,而经过静态批处理后的所有物体都不可以再移动。
关键词:Unity3D;动态批处理;静态批处理;DrawCall
中图分类号:TP317 文献标志码:A 文章编号:2095-2945(2020)03-0031-02
Abstract: In the process of traditional game development, the optimization of graphics rendering has always been a problem. The most commonly used optimization method in unity is to reduce the number of drawcalls, which is the process of CPU preparing data and informing GPU to draw graphics. When the number of drawcalls is too large, it will lead to a large number of CPU calculations, which will lead to CPU overload and affect the efficiency of the game. In unity, the most effective way to optimize drawcall is batch processing, which is divided into dynamic batching and static batching. At the same time, the efficiency and scope of application of the two batching are different. One can use the stats panel information of unity to observe the impact of the actual batching on the number of drawcalls. For dynamic batching, the advantage is that all processing is done automatically without any operation, and the object can be moved. The disadvantage is that there are many limitations. For static batching, it has the advantages of high degree of freedom and few restrictions, but it may occupy more memory, and after static batch processing, all objects can no longer be moved.
Keywords: Unity3D; dynamic batching; static batching; DrawCall
Unity3D中渲染优化——批处理技术
1 批处理
下Unity3D在屏幕上绘制一个图形本质是调用OpenGL或者DirectX这样的外部接口,因此在这个过程中会产生一定程度上的性能消耗。DrawCall是OpenGL中描述绘制次数的一个量。一个基本的OpenGL绘制流程是(1)设置颜色;(2)绘图方式;(3)顶点坐标;(4)绘制,在绘制的过程中每帧都会重复这个过程,这就是一次DrawCall,所以当游戏中的绘制过程变得复杂的时候,就会带来DrawCall的急剧增加,进而带来游戏的性能问题,反映到游戏表现上就变成了优化问题。在Unity3D使用了批处理来达到降低DrawCall的目的,批处理希望通过对物体网格的重组来获得更高的绘制效率。在Uniyu3D中支持两种类型的批处理,分为动态批处理和静态批处理。
2 材质影响
只有用相同材质的物体才可以进行批处理,因此,在程序中尽可能地复用材质,就能在批处理时减少更多的DrawCall。如果物体的两个材质仅仅是纹理不相同,那么可以通过纹理拼合来将这两张纹理合成一张大的纹理,合成后的单一材质可以用来替代之前的两个材质。值得注意的是,在程序中应该使用Renderer.sharedMaterial来保证材质的共享状态,因为改变Renderer.material会造成一份材质的拷贝,从而导致物体的原材质没有被合并。
3 动态批处理
动态批处理的实现原理是:合并每一帧可以进行批处理的模型网格,再将合并后的模型数据传递给GPU,然后使用同一个材质对其渲染,动态批处理的优点在于一切处理由Unity3D自动完成,实现方便,同时经过批处理的物体仍然可以发生位置上的移动。 动态批处理只有对满足条件的模型和材质才可以被动态批处理。所以动态批处理存在一些条件上的限制。
(1)动态批处理网格的顶点属性规模要小于一个数值,该数值在最新版Unity2019.2中为900。针对此条限制,优化策略就是对shader的优化,尽量少使用顶点属性,或者模型顶点数要尽可能的少。
(2)有多个Pass通道的Shader会中断批处理。例如在前向渲染的过程中,使用额外的Pass来为模型添加更多的光照效果,但这样一来模型就不会被动态批处理。
(3)需要谨慎处理使用了光照贴图纹理的物体。例如,在光照贴图纹理上的索引和偏移量以及缩放信息等。因此,为了让这些物体可以被动态批处理,需要保证它们指向光照贴图纹理中的同一个位置。
4 静态批处理
静态批处理的实现原理是,只有在运行的开始阶段,把需要进行静态批处理的模型合并到一个新的网格结构中。因此,静态批处理的模型在运行时无法移动。同时由于合并操作只需要进行一次,静态批处理的优化效率比动态批处理更高。静态批处理是利用“空间”换“时间”的做法,静态批处理时,合并后的几何结构需要占用更多的内存来存储。这是因为,如果一个物体模型在静态批处理前共享了相同的网格,那么在内存中会产生一个该网格的复制品,因此当很多物体模型共用一份网格,就使原本一个网格变成了多个网格发送给了GPU。这并不是一件好事,例如在浓密森林中,会使用了很多个相同的树网格,如果对这些树物体进行动态批处理,会产生严重的内存开销。所以这里是空间和时间上的一个取舍,需要在此找一个时间和空间的平衡点。
对物体使用静态批处理的方法是在场景中选中该物体,同时在其Inspector面板中选中Batching Static静态属性。在内部实现上,Unity首先把這些静态物体变换到世界空间下,然后为它们构建一个更大的顶点和索引缓存,对于使用同一材质的物体。Unity只需要调用一个DrawCall就可以绘制全部物体。而对于使用不同材质的物体,静态批处理同样可以提升渲染性能。尽管这些物体仍然需要调用多个DrawCall,但静态批处理可以减少这些DrawCall之间的状态切换,而这些切换往往是费时的操作。
5 批处理效率分析
对Unity中动态批处理和静态批处理进行简单的测试。在空间中创建3个物体Cube。
通过勾选物体的Inspector面板中的Batching Static静态属性,来实现对物体是否进行静态批处理。观察Stats面板的Batches数量和Saved By batching数量的变化。
图1 Unity中的Stats面板
在Unity中Batches数量相当于DrawCall。Saved By Batches是指通过批处理节省的Batches数量,见表1。
根据测试结果,只有使用相同材质的物体,再通过批处理可以从一定程度上降低DrawCall。将测试用的Cube更换成Capsule时,使用同一材质无法进行动态批处理,这是因为对于顶点数太多的物体,无法进行动态批处理,所以DrawCall没有减少。
6 结束语
(1)如果不同的物体共享材质,则可以直接通过静态批处理降低DrawCall。
(2)如果无法进行静态批处理,而要使用动态批处理的话,那么尽可能减少物体的数目并且让这些物体包含少量的顶点属性和顶点数目。
(3)对于顶点数太多的物体(顶点数大于900),不能使用动态批处理,但是可以使用静态批处理来降低DrawCall。
参考文献:
[1]Fletcher Dunn,Ian Parberrry,3D数学基础:图形与游戏开发[M].史银雪,陈洪,王荣静,译.北京:清华大学出版社,2005:225-368.
[2]冯乐乐. Unity Shader 入门精要[M].北京:人民邮电出版社,2016.
[3]Shireiner D, Shellers G, Kessenich J M, et al.OpenGL programming guide: The Offcial guide to learning OpenGL, version 4.3[M]. Addison-Wesley, 2013. 中译本.OpenGL 编程指南(第八版).
[4]Wright R S, Heamel N, Shellers G M, et al. OpenGL SuperBible: comprehensive tutorial and reference[M]. Pearson Education, 2010. 中译本:OenGL超级宝典(第五版).
转载注明来源:https://www.xzbu.com/1/view-15111417.htm