1

我有一个 Direct3D 9 应用程序,我想监控内存使用情况。有没有工具可以知道 Direct3D 使用了多少系统和视频内存?理想情况下,它还会报告为纹理、顶点缓冲区、索引缓冲区分配了多少...

4

2 回答 2

7

您可以使用旧的 DirectDraw 接口来查询总内存和可用内存。

但是,您以这种方式获得的数字并不可靠

可用内存可能随时发生变化,可用内存通常会考虑 AGP 内存(严格来说不是视频内存)。您可以使用这些数字来很好地猜测您的应用程序/游戏的默认纹理分辨率和细节级别,仅此而已。

您可能想知道为什么没有办法获得更好的数字,毕竟跟踪资源使用情况并不难。

从应用的角度来看,这是正确的。您可能认为视频内存只包含表面、纹理、索引和顶点缓冲区以及一些着色器程序,但在低级方面并非如此。

还有很多其他资源。所有这些都是由 Direct3D 驱动程序创建和管理的,以使渲染尽可能快。其中包括分层 z 缓冲区加速结构、预编译命令列表(例如,以 GPU 理解的格式呈现某些内容所需的数据)。驱动程序还可以提前对多帧的渲染命令进行排队,以平衡帧速率并增加 GPU 和 CPU 之间的并行性。

驱动程序还在引擎盖下为您做了很多工作。启发式方法用于检测具有静态几何图形和恒定渲染设置的绘制调用。在这些情况下,驱动程序可能会决定优化几何结构以更好地使用缓存。这一切都是在驾驶员的控制下并行发生的。所有这些东西也需要空间,因此可用内存可能随时更改。

但是,驱动程序也会缓存您的资源,因此您实际上并不需要首先知道资源使用情况。

如果您需要比可用空间更多的空间,那没问题。驱动程序将为您在系统内存、AGP 内存和视频内存之间移动数据。在实践中,您永远不必担心视频内存不足。当然 - 一旦你需要比可用更多的视频内存,性能就会受到影响,但这就是生活:-)

于 2009-01-09T18:09:56.550 回答
2

两个建议:

您可以在不同时间调用GetAvailableTextureMem以获得对整体内存使用进度的(粗略)估计。

假设您在 nVidia 上进行开发,PerfHUD包括消耗的 AGP/VID 内存(分离)的图形表示。

您可能无法获得一个干净的内存使用者(顶点缓冲区等)与内存位置(AGP、VID、系统)的矩阵,因为 -

(1) 驱动程序在内存类型之间传输资源有很大的自由度,并且

(2) 实际消耗内存的种类远远大于暴露的D3D接口。

于 2009-05-04T07:13:08.813 回答