报告Direct3D内存使用情况

时间:2009-01-09 11:06:54

标签: windows memory direct3d video-memory

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

2 个答案:

答案 0 :(得分:7)

您可以使用旧的DirectDraw界面查询总内存和可用内存。

虽然,但您获得的数字并不可靠。

空闲内存可能在任何时刻发生变化,可用内存通常会考虑AGP内存(严格来说不是视频内存)。您可以使用这些数字来猜测应用程序/游戏的默认纹理分辨率和细节级别,但就是这样。

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

从应用程序的角度来看,这是正确的。您可能认为视频内存只包含曲面,纹理,索引和顶点缓冲区以及一些着色器程序,但在低级别上则不然。

还有很多其他资源。所有这些都由Direct3D驱动程序创建和管理,以尽可能快地进行渲染。其中存在层次化的z缓冲加速结构,预编译的命令列表(例如,以GPU理解的格式呈现某些东西所需的数据)。驱动程序还可以预先为多个帧排队渲染命令,以均衡帧速率并增加GPU和CPU之间的并行性。

司机也为你做了很多工作。启发式用于检测具有静态几何和常量渲染设置的绘图调用。在这些情况下,驱动程序可能决定优化几何体以获得更好的缓存使用。这一切都是在驾驶员的控制下并行发生的。所有这些东西都需要空间,因此可用内存可能随时发生变化。

但是,驱动程序也会对您的资源进行缓存,因此您不需要首先了解资源使用情况。

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

答案 1 :(得分:2)

两个建议:

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

假设你在nVidia上开发,PerfHUD包含消耗的AGP / VID内存的图形表示(分开)。

您可能无法获得内存使用者(顶点缓冲区等)与内存位置(AGP,VID,系统)的良好清洁矩阵,因为 -

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

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