创建多个顶点和索引缓冲区时会花费大量内存

时间:2010-09-08 12:49:40

标签: c++ windows graphics direct3d

我遇到了一个非常奇怪的问题。当我在D3D中创建一些非常简单的VertexBuffer和IndexBuffer时,从TaskManager报告的内存消耗很大。

我通过D3D CreateIndexBuffer方法创建了60000索引缓冲区。每个索引缓冲区包含6个索引(int),表示两个三角形。因此,一个索引缓冲区将占用24个字节。总内存消耗为24 * 60000 = 1,440,000。但任务管理器显示应用程序300MB内存增加!

我不知道D3D9是如何在内部进行内存分配的,但这个问题也发生在D3D10中。这是由于内存碎片造成的吗?

这是x86 | bebug版本,d3d是发行版本,Windows 7。

2 个答案:

答案 0 :(得分:2)

60000索引缓冲区?为什么不创建一个大的索引缓冲区?切换所有这些索引缓冲区本身就很慢。

原因:您创建的每个索引缓冲区都会产生开销(驱动程序将使用各种跟踪信息和信息位来优化它),5K的内存对我来说似乎很合理。 5K * 60000大约是300兆......

答案 1 :(得分:0)

你必须考虑到存在600多套6个整数的更多内容。如果您正在维护指向所有这些的指针,那么每个指针的另外4个字节。这甚至没有考虑到每个顶点缓冲区中存在多个数据成员的事实,这些成员跟踪诸如缓冲区类型,元素数量,每个元素的大小/类型,缓冲区是否是动态的,只读的,写入的只是等等。

您在另一条评论中提到它是只读和管理的。管理意味着Direct3D正在存储关于每个缓冲区的大量附加数据,以便在必要时(例如设备重置)对其进行销毁,重建和重新填充。

如前所述,另一个问题是你有60000个索引缓冲区,每个缓冲区存储6个索引来存储2个三角形。您可以在三角形扇形或三角形条带中使用4个索引。除此之外,我不完全确定为什么你需要60万套它们。实际上,您可以将单个索引缓冲区和索引编入其中,因为这听起来很混乱。您可以指示Direct3D使用从6 * n索引开始的6个索引来绘制n对三角形。

我离题了,因为这不是你问题的焦点。