Xna 如何优化绘制大量动态顶点集合?

Xna 如何优化绘制大量动态顶点集合?,xna,xna-4.0,Xna,Xna 4.0,…还是我连尝试都疯了 作为一个在3d图形中使用裸顶点的新手,我以前从未使用过顶点缓冲区之类的东西。我猜我应该使用动态缓冲区,因为我的游戏处理的是操纵、添加和删除原语。但是我该怎么做呢 到目前为止,我已将索引存储在Triangle.cs类中。三角形存储在四边形中(包含与其索引相对应的顶点),四边形存储在块中。在我的绘制方法中,我迭代每个块、每个块中的每个四边形,最后是每个三角形,将适当的纹理应用于效果,然后调用DrawUserIndexedPrimitives绘制存储在三角形中的顶点 我想使用顶点

…还是我连尝试都疯了

作为一个在3d图形中使用裸顶点的新手,我以前从未使用过顶点缓冲区之类的东西。我猜我应该使用动态缓冲区,因为我的游戏处理的是操纵、添加和删除原语。但是我该怎么做呢

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

我想使用顶点缓冲区,因为这种方法不能支持我想要的比例。我假设它是动态的。因为我的顶点和索引存储在一个单独的类集合中,所以我仍然可以有效地使用缓冲区吗?为每个四边形使用单独的缓冲区是否愚蠢(我猜是这样)?第一次绘制四边形时将顶点转储到缓冲区中,然后将这些顶点存储在哪里,以便我可以将该偏移应用于该三角形的索引以进行连续绘制,这是否可行且有效?在这种情况下,是否有一种可行的方法来处理从缓冲区中移除顶点(可能是基于事件的三角形索引偏移移动)


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

我不能确切地说出你想做什么,但对每个四元数据使用单独的缓冲区是非常愚蠢的

图形编程的黄金法则是批量、批量、批量。这意味着在一个DrawUserIndexedPrimitives调用中尽可能多地打包内容,您的图形卡会因此而爱上您

在你的例子中,把所有的垂直和标记放在一个顶点缓冲区和索引缓冲区中(你可能需要使用更多,我不知道我们谈论的垂直有多少)。每当用户更改其中一个缓冲区时,请重新生成整个缓冲区。如果你真的有很多灵长类动物,把它们分成多个缓冲区,在用户改变某些东西时只重新生成你需要的缓冲区

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


不管怎样,祝你好运,请随时提问。

如果我实现了缓冲区,我就不必调用DrawUserIndexedPrimitives,而是一种更有效的方法,是吗?此外,我理解你所说的配料。据我所知,没有真正合乎逻辑的方法来分割我的原语,但我可能把它们都放在一个大数组中。我只预见到两个问题:如何在从缓冲区中移除面时有效地跟踪索引(我应该重新计算所有的面吗?)以及如何独立地对面进行纹理处理(我可能会为此编写一个着色器…可能…有大量纹理…)嗯,问题不在于DrawUserIndexedPrimitions,任何绘图。。。电话很慢。问题是你打电话的次数太多了。重新计算所有的指数,这应该不仅仅是一个转变。如果你真的很紧张,有更快更精细的选择,但它们可能不是必需的。对于纹理,请使用纹理图集。这是你制作一个巨大纹理的地方,里面有所有的纹理。然后,只需更改texcoords.interest即可获得正确的纹理。想详细说明纹理坐标吗?到目前为止,我只是在猜测如何使用它们。创建VertexPositionNormalTexture时,纹理坐标参数是否与传递给着色器的纹理上的位置或模型面上的位置相对应?这让我有些困惑。此外,我制作的基本体大小不同,我希望它们的适当纹理在每个面上延伸。我觉得用地图集会打破这一点。当然。它对应于纹理上的一个位置,与往常一样。让我给你举个例子:假设你有一个四元组,通常会有texcoords[0]、[0 1]、[1 1]和[1,0]。如果要从中采样的纹理实际上是atlas的一部分,位于右上角,从[5.0]到[1.5]。您的新texcoords将被转换为仅访问此子文本,因此在本例中,[.5.0]、.5.5]、[1.5]、[1.0]。拉伸纹理应该没有问题,你的意思是平铺(重复)纹理吗?那可不那么容易。顺便问一下,你在做什么?这是一个截图:它是一个用平截头体块做成的球体。如你所见,我正在缩放块纹理,以适应不同形状的面。你说的很有道理,我很确定我能把它应用到这种情况。如果我制作了一个纹理图集,并选择了正确纹理的适当坐标,它仍然会缩放到整个面部,对吗?我相信我现在明白了,非常感谢你的帮助。