3



我想优化我的基本 XNA 引擎。结构有点像这样:我有一个 GameWorld 实例和更多的 GameObjects 附加到它上面。现在,在每一帧中,我都会在 GameObjects 之间进行循环,并在它们内部调用 draw 方法。此实现的缺点是 GameDevice 绘制函数被多次调用,每个对象调用一次。
现在,我想减少绘图调用,实现一个结构,在调用绘图方法之前,将所有几何图形传输到一个包含所有顶点数据的大向量中,并执行一个绘图调用来绘制它们。

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

谢谢

4

1 回答 1

6

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

  1. 截锥体剔除 - 即剔除视锥体之外的所有对象

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

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

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

一旦你拥有了一组可能可见的对象,就可以将它们单独发送到 GPU,但你必须确保这样做的方式可以最大限度地减少 GPU 上的状态变化 - 例如,将使用相同纹理/材质的所有对象分组属性在一起。

完成后,您应该会发现一切都非常快。当然,您总是可以更进一步,但上述步骤可能是最好的开始方式。

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

于 2011-04-27T10:59:18.630 回答