繁体   English   中英

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

[英]Cost much memory when creating several vertex and index buffer

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

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

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

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

60000个索引缓冲区? 为什么不只创建1个大索引缓冲区? 切换所有这些索引缓冲区本身将变得很慢。

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

您必须考虑到,要存储60000个6个整数的集合还有很多事情要做。 如果您要维护指向所有这些指针的指针,则应该为每个指针另外保留4个字节。 这甚至都没有考虑到每个顶点缓冲区中都存在多个数据成员的事实,这些成员跟踪诸如缓冲区类型,元素数量,每个元素的大小/类型,缓冲区是动态的,只读的,写入的,仅,等等。

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

如前所述,另一个问题是您有60000个索引缓冲区,每个缓冲区存储6个索引来存储2个三角形。 您可以在三角形扇形或三角形条带中使用4个索引。 除此之外,我不确定您为什么需要60万套。 实际上,您可以有一个索引缓冲区并在其中建立索引,这听起来可能会令人困惑。 您可以指示Direct3D使用从6 * n索引开始的6 * n个索引来绘制第n对三角形。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM