绘制基元性能



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

但我不知道两者之间有什么区别

  • 绘制基元
  • DrawUserPrimitives
  • DrawIndexedPrimitives
  • DrawUserIndexedPrimitives

哪一种是最快的方法?指数有什么用?

您的问题的简单答案是" User "版本在CPU上的速度要慢一些,因为它们每次调用时都必须将顶点数据传输到GPU(通过驱动程序和总线)。

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

"User"和"Indexed"版本也将分别对GPU的性能产生影响。这种影响相对较小。一般来说,你不需要担心它。

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

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

但。。。

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

我建议在尝试选择"解决方案"之前,尝试诊断游戏性能不佳的原因。也许在这里(或 https://gamedev.stackexchange.com/)的问题中寻求帮助。

如果

可以的话,一次性完成所有内容,实例化绘制总是更好,但这需要您一次给出所有纹理!例如,就我而言,我喜欢绘制只有 1 个纹理的实例化对象......所有的树木,所有的地面,所有的建筑物,等等...

最新更新