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



我想优化我的基本XNA引擎。 结构有点像这样:我有一个GameWorld实例和更多的GameObjects附加到它。 现在,在每一帧中,我都会在GameObjects之间做一个循环,然后我在里面调用draw方法。 这个实现的概念是GameDevice绘图函数被多次调用,每个对象一个。
现在,我想减少绘图调用,实现一个结构,在调用绘图方法之前,将大型矢量中的所有几何图形转换为所有顶点数据并执行一次绘图调用以绘制所有顶点数据。

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

谢谢


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

  • 剔除剔除 - 即剔除视锥体外的所有物体

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

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

  • 网上有大量的教程涵盖了所有这些。 我会按照上面的顺序攻击它们,现在可能会忽略遮挡剔除。 任何图形引擎中最重要的优化是,绘制最快的图元是你不需要绘制的图元。

    一旦你有潜在可见的一组对象,将它们全部单独发送给GPU是很好的,但是你必须确保以最小化GPU状态变化的方式来做到这一点 - 例如将所有使用相同纹理/材质的对象属性一起。

    一旦完成,你会发现一切都非常快。 当然,你可以随时采取进一步行动,但上述步骤可能是最好的开始。

    为了明确这一点 - 不要只是假定较少的绘图调用=更快。 当然,这取决于很多因素,包括硬件,但通常XNA / DirectX API在通过流水线排队几何时相当不错 - 毕竟这就是它的目的。 关键并不是最小化调用,而是尽量减少场景中所需的状态变化(纹理/着色器等)。

    链接地址: http://www.djcxy.com/p/95511.html

    上一篇: Optimizing drawing calls in a basic XNA engine

    下一篇: How to translate a sprite and a vertex geometry by the same distance?