为了在屏幕上绘制一个对象,游戏引擎必须发出一个绘制命令给图形化API接口(如OpenGL 或者Direct3D),DrawCalls通常都是资源密集的,图形化API每一次DrawCall都要做很多重要的工作,
会造成CPU一定的性能开销,这通常是由于在显示卡驱动中DrawCall资源密集验证和转化步骤之间状态切换导致的
Unity利用两种技术来解决上述问题:
Dynamic batching
对于足够小的网格, 动态合批将转换他们在CPU上的顶点, 将许多相似的顶点分成一组,一次性把他们全部渲染出来
Static batching
对于标记为Static的对象(前提是不能移动)合并成一个大的网格,以更快的方式渲染出来
内置的合批比起手动合并对象有更多好处,最显著的就是对象仍然可以被单独的剔除(culled ),但是它们也有一些不足之处,静态合批会增加内存开销,动态合批会增加CPU开销
Material set-up for batching
只有当对象共享相同的材质时才能实现合批,因此,如果你想较好的实现合批应该专注于尽可能让更多的游戏对象共享材质
如果有两个仅纹理不同其他都相同的材质,可以把这两个纹理合并一张大的纹理,这个过程通常被称为纹理图集(可参阅 Wikipedia page on Texture atlases for more information)
一旦纹理存在于相同的图集中,便可以用一个材质来替代
如果需要从脚本中访问共享材质属性,要注意使用Renderer.material会造成材质的拷贝,