XNA,遮挡剔除和碰撞检测

3
我已经制作了一个四叉树/BSP混合原型来测试XNA游戏引擎中的碰撞检测和遮挡剔除。据我所知,硬件加速的优化之一是能够将顶点和索引列表存储在显卡上,这样与几何体相关的绘图调用就不必为每帧发送模型数据。
在一个有大量几何体的关卡中,如何在XNA中管理这个问题?如果我使用OpenGL,我会维护一个在显卡上的列表,并只发送需要更新的内容。然而,XNA框架的高度抽象似乎将其封装得如此彻底,以至于我无法管理它。
请告诉我我错在哪里,或者为什么我不应该担心。
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了解详细信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接