3

我已经组合了一个四叉树/BSP 混合原型来测试我正在组合的 XNA 游戏引擎中的碰撞检测和遮挡剔除。

据我了解,硬件加速为我们提供的优化之一是能够在卡上存储顶点和索引列表,因此绘制相关几何图形的调用不必为每一帧发送模型数据。

在一个有很多几何图形的关卡中,您如何在 XNA 中进行管理?例如,如果我在 OpenGL 中工作,我会维护卡片中的内容列表,然后只发送需要更新的内容。但是,XNA 框架的高抽象级别似乎将其封装到我无法管理的程度。

告诉我为什么我错了,或者为什么我不应该担心。

4

1 回答 1

2

在 XNA 中,图形驱动程序根据您指定的缓冲区的属性决定您的顶点和索引缓冲区最好位于哪个内存中。您可以做出的影响缓冲区存储位置的选择包括:

  • 是使用动态缓冲区还是普通缓冲区

“在您的游戏经常修改顶点缓冲区的情况下,建议从 DynamicVertexBuffer 而不是 VertexBuffer 类实例化或派生该缓冲区。”

  • 创建缓冲区时的使用参数

WriteOnly “表示应用程序只写入顶点缓冲区。如果指定,驱动程序会选择最佳内存位置以进行高效写入和渲染。尝试从只写顶点缓冲区读取失败。”

概括

根据您提供的有关如何使用缓冲区的信息,图形驱动程序通常能够比您更好地决定缓冲区的位置。这是因为它知道每种类型的内存有多少可用以及该特定系统的内存的性能特征。

注意:对于 XNA 3.1 及更低版本在 xbox 上具有动态顶点和索引数据,将数据存储在托管数组中并使用 DrawUserPrimitives 比使用 DynamicVertexBuffer 或 DynamicIndexBuffer 更快。

如果您最终使用了动态缓冲区,则必须注意不要在使用 SetData 时停止管道。有关详细信息,请参阅http://blogs.msdn.com/b/shawnhar/archive/2008/04/15/stalls-part-two-beware-of-setdata.aspx

于 2010-09-14T05:26:49.910 回答