2010-09-08 28 views
0

我遇到了一个非常奇怪的问题。当我在D3D中创建一些非常简单的VertexBuffer和IndexBuffer时,从TaskManager报告的内存消耗是巨大的。创建几个顶点和索引缓冲区时需要大量内存

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

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

这是在86 | bebug版本,D3D是发行版本,Windows 7的

+0

Index Buffer!= array。而且,每个内存分配通常具有大约16个字节的开销。 – 2010-09-08 13:37:48

+0

您是否使用动态索引缓冲区? (图/取消映射)。参考设备是否产生相同的内存消耗水平? – Stringer 2010-09-08 18:45:25

+0

它在只读的管理池中。 – Buzz 2010-09-09 00:08:18

回答

2

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

由于原因:与您创建的每个索引缓冲区相关的开销(驱动程序将用来优化它的各种跟踪信息和位信息)以及5K的内存对我来说似乎相当合理高架。 5K * 60000大概是300兆...

0

你必须考虑,还有更多的事情,只是存储60000套6整数。如果你维护指向所有这些的指针,就像你应该的那样,每个指针又是4个字节。这甚至不考虑这样的事实:每个顶点缓冲区中存在多个数据成员,以跟踪诸如缓冲区类型,元素数量,每个元素的大小/类型,缓冲区是动态的,只读的,只有等。

你在另一个评论中提到它是只读和托管的。被管理意味着Direct3D正在存储大量有关每个缓冲区的附加数据,以便在必要时可以销毁,重建和重新填充,例如设备重置。

如前所述,另一个问题是您有60000个索引缓冲区,每个索引缓冲区存储6个索引以存储2个三角形。您可以在三角形扇形或三角形条中使用4个索引。除此之外,我不完全确定你为什么需要600000套。事实上,你可以有一个索引缓冲区和索引,就像听起来那样令人困惑。您可以指示Direct3D使用从索引6 * n开始的6个索引来绘制第三对三角形。

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

相关问题