我应该如何优化绘制大量动态数量的顶点集合?

时间:2011-09-17 20:17:07

标签: xna xna-4.0

......或者我甚至疯了吗?

作为使用裸顶点用于3d图形的新手,我以前从未使用过顶点缓冲区等。我猜我应该使用动态缓冲区,因为我的游戏处理操作,添加和删除原语。但是我该怎么做呢?

到目前为止,我已将索引存储在Triangle.cs类中。三角形存储在四边形中(其包含与其索引对应的顶点),四边形存储在块中。在我的绘制方法中,我遍历每个块,每个块中的每个四边形,最后每个三角形,将适当的纹理应用于我的效果,然后调用DrawUserIndexedPrimitives来绘制存储在三角形中的顶点。

我想使用顶点缓冲区,因为这种方法不能支持我想要的规模。我认为它是动态的。但是,由于我的顶点和索引存储在一个单独的类的集合中,我还能有效地使用缓冲区吗?为每个四元组使用单独的缓冲区(我猜它是)?在第一次绘制四边形时将顶点转移到缓冲区是否可行且有效,然后存储这些顶点的位置,以便我可以将该偏移应用于连续绘制的三角形索引?在这种情况下是否有一种可行的方法来处理从缓冲区中删除顶点(可能是基于事件的三角形中索引偏移的移位)?

我很抱歉这些问题可能过于新手或过于混乱/模糊。我很乐意提供澄清。但正如我所说,我是新手,我甚至不知道我在说什么......

1 个答案:

答案 0 :(得分:2)

我无法确切地说出你要做的是什么,但是为每个四边形使用一个单独的缓冲区是非常愚蠢的。

图形编程的黄金法则是批量,批量,批量。这意味着将尽可能多的东西打包到一个DrawUserIndexedPrimitives调用中,你的显卡会爱你。

在你的情况下,将所有的verticies和indicies放入一个顶点缓冲区和索引缓冲区(你可能需要使用更多,我不知道我们正在讨论多少个verticies)。每当用户更改其中一个灵长类动物时,重新生成整个缓冲区。如果你真的有很多灵长类动物,可以将它们分成多个缓冲区,并且只在用户改变时重新生成你需要的缓冲区。

最重要的是最大限度地减少“DrawUserIndexedPrimitives”调用的数量,这些内容具有很多的开销,您可以轻松地使游戏速度提高20倍。 显卡是管道,他们喜欢被给予大量数据供他们吃掉。你一次给它一个三角形所做的就像强迫一家大型汽车制造厂一次只制造一辆汽车。在最后一辆车完成之前,他们无法开始建造下一辆车。

无论如何,祝你好运,随时提出任何问题。