DrawPrimitives表现

时间:2012-06-24 08:46:18

标签: performance xna

我想绘制单面而不是xna模型,因为它太慢了。

但我不知道

之间的区别
  • DrawPrimitives
  • DrawUserPrimitives
  • DrawIndexedPrimitives
  • DrawUserIndexedPrimitives

哪一个是最快的方法?什么是指数有利?

2 个答案:

答案 0 :(得分:2)

你的问题的简单答案是“User”版本在CPU 上慢一点因为他们必须将顶点数据传输到GPU(通过驱动程序和公交车每次都被叫到。

User版本使用GPU上已存在的顶点和索引缓冲区(在加载时将它们放在那里)。他们传输的数据要少得多,因此速度更快。

User”和“Indexed”版本也会对 GPU 产生性能影响。这种影响相对较小。一般来说,你不必担心它。

存在User版本,因为当您的数据更改每个帧时它们会更快。还有DynamicVertexBuffer可以与非User版本的绘图函数一起使用。我相信它可以比User方法略快,因为你可以预先分配所需大小的缓冲区。

Indexed版本允许您使用索引缓冲区从顶点缓冲区中选择顶点(因此绘制的三角形可以在顶点缓冲区中的任何位置选择顶点)。另一种方法是将顶点缓冲区简单地解释为三角形顶点的顺序列表(基于PrimitiveType)。存在索引缓冲区的主要原因是不再需要顶点缓冲区中的重复顶点(这需要额外的内存和GPU上的处理)。

<强> BUT ...

XNA的Model课内部使用DrawIndexedPrimitives。不仅如此,它还正确地使用 (即:它不会绘制单个面 - 但可以同时使用多个面 - 以获得最佳性能)。因此,如果您发现它很慢,那么您的问题就在其他地方。

我建议在尝试选择“解决方案”之前,尝试诊断原因为什么您的游戏效果不佳。也许在这里的问题(或https://gamedev.stackexchange.com/)上寻求帮助。

答案 1 :(得分:0)

如果可以的话,一次完成所有实例,即时绘制将总是更好,但这需要您一次提供所有纹理!以我的情况为例,我喜欢绘制仅具有1个纹理的实例化对象……所有树木,所有地面,所有建筑物等……