【问题标题】:Cost much memory when creating several vertex and index buffer创建多个顶点和索引缓冲区时消耗大量内存
【发布时间】:2010-09-08 12:49:40
【问题描述】:

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

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

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

这是x86|bebug下的版本,d3d是release版本,windows 7。

【问题讨论】:

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

标签: c++ windows graphics direct3d


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您必须考虑到仅存储 60000 组 6 个整数还有更多工作要做。如果您要维护指向所有这些的指针,那么每个指针还有 4 个字节。这甚至没有考虑到每个顶点缓冲区中存在多个数据成员来跟踪诸如缓冲区类型、元素数量、每个元素的大小/类型、缓冲区是否是动态的、只读的、可写的 -只有等等。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多