C++ 创建多个顶点和索引缓冲区时会消耗大量内存

C++ 创建多个顶点和索引缓冲区时会消耗大量内存,c++,windows,graphics,direct3d,C++,Windows,Graphics,Direct3d,我遇到了一个非常奇怪的问题。当我在D3D中创建一些非常简单的VertexBuffer和IndexBuffer时,TaskManager报告的内存消耗是巨大的 我通过D3D CreateIndexBuffer方法创建了60000个索引缓冲区。每个索引缓冲区包含6个表示两个三角形的索引(int)。因此,一个索引缓冲区将占用24个字节。总内存消耗量为24*60000=1440000。但任务管理器显示应用程序内存增加了300MB 我不知道D3D9是如何在内部进行内存分配的,但这个问题也发生在D3D10中

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

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

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


这是x86 | bebug版本,d3d是发布版本,windows 7。

60000索引缓冲区?为什么不创建一个大的索引缓冲区呢?切换所有这些索引缓冲区本身将非常缓慢


关于原因:您创建的每个索引缓冲区都会有一个开销(不同的跟踪信息位和驱动程序用来优化它的信息位),对于这个开销,5K内存对我来说是相当合理的。5K*60000是大约300兆欧…

你必须考虑到,仅仅存储60000套6英特就有更多的进展。如果您要维护指向所有这些的指针(您应该这样做),那么每个指针还有4个字节。这甚至没有考虑到每个顶点缓冲区中存在多个数据成员的事实,这些数据成员跟踪诸如缓冲区类型、元素数量、每个元素的大小/类型、缓冲区是否是动态的、只读的、只读的等等

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

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


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

索引缓冲区!=数组。另外,每个内存分配通常有大约16字节的开销。您是否使用动态索引缓冲区?(映射/取消映射)。引用设备是否产生相同级别的内存消耗?它位于只读的托管池中。