请见Demo
Demo1: Vox APP
Demo2: Vox APP
实时渲染引擎在面对大规模渲染对象(drawCall数量很多,例如2w以上)的时候, 性能损耗在drawcall的地方就会很大,在移动端和web端表现尤为明显。除了合批绘制( 无论是cpu或者是gpu端)等优化之外,动态的遮挡剔除系统提供的支持是一个有效的减少drawcall次数的机制。
这里主要说的是动态遮挡剔除,这种剔除机制主要是几何运算(本身运算消耗少,还可以借助其他线程来提供算力),在进入渲染器阶段之前就尽可能的剔除没必要渲染的对象。很多辅助设计或者游戏(例如室内或者第一视角游戏),因为有很多实际存在的遮挡对象,所以遮挡剔除在这些环境中就很有效。
基于几何计算的遮挡剔除,原理是利用开放或者封闭的空间包围体(球体,六面体等)对需要做剔除测试对象做的集合做布尔运算(可见或者不可见),正因为有布尔运算,所以各种包围体可以通过布尔运算做求交,求差,求和等集合运算, 可以通用的测试遮挡体之间的遮挡关系,结合空间管理机制,可以获得很高的运行时性能表现。
请见下图:
有了遮挡剔除,可以剔除掉很多不必要的drawCall(下面的图如果全部drawcall原本有10090个单次drawcall)
通过上图的演示可以看到,这种遮挡剔除,避免了90%左右的多余drawcall。在有需求的场合还是非常有效的。
实际上遮挡剔除系统,不仅仅能优化直接的渲染逻辑,还可以优化例如实时灯光计算、实时阴影渲染等渲染消耗。除了渲染,还可以优化例如鼠标拾取测试,运动碰撞检测(例如运动扫掠体)等。结合现代的多核多线程,可以在模型面熟精度高,渲染单元量巨大,要求高效能这种应用中发挥很不错的功效。