在基本的XNA引擎中优化绘图调用
本文关键字:优化 绘图 调用 引擎 XNA | 更新日期: 2023-09-27 17:53:48
我想优化我的基本XNA引擎。结构有点像这样:我有一个GameWorld实例和更多的GameObjects。现在,在每一帧中,我在GameObjects之间进行循环,并在其中调用draw方法。这个实现的缺点是多次调用GameDevice draw函数,每个对象调用一次
现在,我想减少绘图调用,实现一种结构,在调用绘图方法之前,该结构在一个大向量中传输所有几何体,包含所有顶点数据,并执行一个绘图调用来绘制所有顶点数据
这是一种有效的方法吗?有人能告诉我一个优化的解决方案吗
感谢
第一步是减少绘制对象的数量。有很多方法可以做到这一点,最常见的是:
-
截头体剔除-即剔除视图截头体之外的所有对象
-
场景查询-例如,使用BSP树或QuadTree组织场景-一些数据结构,使您能够减少潜在可见的对象集
-
遮挡剔除-更高级的主题,但在某些情况下,您可以确定对象不可见,因为它被其他几何体遮挡。
网上有很多教程涵盖了所有这些。我会按照上面的顺序攻击它们,现在可能会忽略遮挡剔除。任何图形引擎中最重要的优化是,绘制最快的图元是不必绘制的图元。
一旦你有了一组潜在的可见对象,可以将它们单独发送到GPU,但你必须确保以最小化GPU状态变化的方式发送,例如将使用相同纹理/材料属性的所有对象分组在一起。
一旦完成,你会发现一切都很快。当然,你总是可以更进一步,但以上步骤可能是最好的开始方式。
只是为了说明这一点——不要只是认为更少的绘图调用=更快。当然,这取决于许多因素,包括硬件,但一般来说,XNA/DDirectX API非常擅长通过管道对几何图形进行排队-这毕竟是它的作用。关键不是最小化调用,而是最小化整个场景所需的状态更改量(纹理/着色器等(。