没错……最近在倒腾Simplygon,用于LOD的生成。没错,这个东西非常酷,从方方面面提升了帧率……读了官网的关于LOD优化的文章,感觉很有感触,因此写下这篇博客。


Over-Shading

硬件的机能是有限的,因此,我们需要对硬件的机能进行最有效的利用和榨取……众所周知的,小多边形对于硬件的利用效率是比较低下的。众多的硬件供应商都推荐屏幕上最小的三角形都至少是16个像素大小,而且尽量避免细长的三角形——因为这种三角形一方面边太长,另一方面对于面积的贡献也不大。

下面给出了两个三角形以及屏幕上的像素点,而且像素点被集成在2*2的Quads中。所有的像素操作都是针对于Quad的。

Triangle&Pixels

在着色的过程中,如果三角形盖住了这个像素点,那么这个像素点就会被画出来。由于像素的操作都是针对于Quad的,那么可以看出来小三角形对于机能的利用率更低:

Efficiency

从上图中可以看出来右边的三角形对硬件有着更好的利用率,虽然只是大了一点点……

而且,因为现在大多数的GPU都支持更高位数的SIMD units,下图中,我们要覆盖住16个像素才能够最大限度的利用硬件。
Wider SIMD Units

总而言之言而总之,如果一个Mesh的面越细分,那么渲染起来就越贵。如果使用LOD的优化,那么就可以将远处的Mesh的细分面数减少,从而提升硬件的利用效率。


Data Per Frame

对于XBox One以及PS4来说,数据带宽的传递速度上限为100GB/s,如果说我们的游戏运行帧率为60fps,那么每帧能够传输的带宽最多只能达到1.6GB/s。在某些游戏中,这可能成为瓶颈。

如果使用LOD优化,那么能够减少远处的物件的顶点数,从而优化这种情况。此外,还可以使用mip-map来减少传输的贴图大小。最后,可以将极远的东西直接设为Invisible……虽然粗暴,但是还是很有效的。


Draw Calls

Draw call is the killer… ——沃·资基朔德

现在的大多数GPU都很善于处理顶点数据和多边形数据,但是如果要新开一个Batch,这个开销还是不小的。每个新的材质以及新的物件都可能会新开这么一个Batch。

因此如果要针对于Draw Call进行优化,一方面可以将各种物件进行merge,从而在一次Draw Call里面就绘制出来。另一方面,可以尝试将各种Texture集合成一个大的Texture,从而减少材质的Draw Call。