优化基本XNA引擎中的绘图调用

Arc*_*ius 3 c# optimization xna xbox360



我想优化我的基本XNA引擎.结构有点像这样:我有一个GameWorld实例,附加了更多GameObjects.现在,在每个框架中,我在GameObjects之间进行循环,并在其中调用draw方法.这个实现的结果是GameDevice绘制函数被多次调用,每个对象一个.
现在,我想减少绘图调用,实现一个结构,在调用绘图方法之前,将大型矢量中的所有几何体转移到所有顶点数据中并执行单个绘图调用以将它们全部绘制出来.

这是一种有效的方式吗?有人可以告诉我一个优化的解决方案吗?

谢谢

Jam*_*unt 6

第一步是减少要绘制的对象数量.有很多方法可以做到这一点,最常见的是:

  1. Frustum剔除 - 即剔除视锥体外的所有物体

  2. 场景查询 - 例如使用BSP树或QuadTree组织场景 - 一些数据结构,使您能够减少潜在可见的对象集

  3. 遮挡剔除 - 更高级的主题,但在某些情况下,您可以确定对象不可见,因为它被其他几何体遮挡.

网上有大量的教程涵盖了所有这些.我会按照上面的顺序攻击它们,并且可能暂时忽略遮挡剔除.任何图形引擎中最重要的优化是绘制最快的原始图形是您不必绘制的图形.

一旦你拥有潜在可见的一组对象,就可以将它们全部发送到GPU,但你必须确保以最小化GPU上状态变化的方式这样做 - 例如,对使用相同纹理/材料的所有对象进行分组物业在一起.

一旦完成,你应该发现一切都很快.当然,您可以随时采取进一步措施,但上述步骤可能是最好的开始.

只是为了明确这一点 - 不要只是假设较少的绘图调用=更快.当然,它取决于许多因素,包括硬件,但通常XNA/DirectX API非常适合通过管道排队几何 - 这毕竟是它的用途.关键不是最小化调用,而是最小化场景中所需的状态(纹理/着色器等)的变化量.

  • 实际上,对"Draw Primitives"函数的调用次数或多或少直接映射到发送到GPU的批次数.批次是CPU限制.一般来说,GPU现在可以比CPU发送新状态更快地切换状态.最小化状态变化是非常*非常老的性能建议.它只适用于这些日子,因为任何国家的变化都需要一批新的. (4认同)
  • 首先,XNA不使用DX11(尤其不适用于Xbox和WP7).其次,绘制调用是现代游戏中非常重要的CPU瓶颈.我肯定会优先考虑减少DrawPrimitives调用而不是减少状态变化. (2认同)