这是我的第一个问题,如果您对如何改进问题有任何建议,请随时告诉我:)
所以我的问题是这样的:我有一个改变每一帧的对象,这会导致我计划通过管道发送不同数量的顶点。现在,我显然无法动态改变顶点缓冲区的大小,那么最好的方法是什么呢?
以下是我的一些想法:
创建一个大小为 n 的顶点缓冲区,并简单地将顶点传递给 n 。缺点:一些顶点多次穿过VS,因此性能略有下降(可能不明显),每帧需要多次调用Map / Unmap,这可能会有问题。
制作一个巨大的顶点缓冲区,它将容纳足够的顶点,使我的对象永远不会超过缓冲区的大小。缺点:因为我事先并不知道我的对象有多少个顶点,所以可能很难预测这个缓冲区的大小。另外,缓冲区可能会占用太多空间。
每个帧,创建一个正确大小的新顶点缓冲区,并调用IASetVertexBuffer。缺点:这可能会产生巨大的性能问题......
我很感激你的家伙有任何想法,或建议使用这三个中的哪一个! :)
答案 0 :(得分:0)
1 /这并不理想,因为正如你所说,你需要多次映射/取消映射,并在两者之间进行绘制调用。在现代卡上(以千兆字节的数据计),你做了一个权衡以减少内存使用的性能,内存不太可能是一个问题(如评论中所述)。
2 /与1相反,您需要一个Map / Unmap和一个绘图(您还可以在DeviceContext中指定顶点计数 - > Draw以确保只绘制缓冲区的相关部分)。这将是性能方面的最佳选择,并且不应该太难以获得某种形式的最大定义(即使是100万个多边形也不是那么多内存,并且你将很难让你的CPU进给每帧的数据量。)
3 /我在您的用例中没有看到任何好处(当您对某些不可变资源进行异步加载时,重新创建资源很常见,因此它并不适用于此处。)所以选择2,如果有一天记忆成为一个问题,那么很容易回到1,但我怀疑这种情况会发生。