window 显示驱动开发-报告图形内存(二)

报告图形内存

WDDM 的视频内存管理器 (VidMm) 向客户端报告每个图形内存参与者的准确帐户。 这些可用内存报告可以通过显示应用程序找到。

以下客户端使用此报告:

Windows 系统评估工具 (WinSAT) 检查可用的图形内存,并根据可用内存量采取措施关闭或打开 Premium Aero Glass 体验。

桌面窗口管理器 (DWM;Dwm.exe) 取决于具有 WDDM 显示驱动程序的计算机上可用图形内存的确切状态。

DirectX 游戏和其他图形应用程序必须能够获取描述图形内存状态的准确值。 不准确的图形内存数量可能会极大地改变用户的游戏体验。

Windows Vista 之前的操作系统通过控制面板显示应用程序将图形内存报告为单个数字。 OS 直接从显示驱动程序接收此数字。

1. VidMm 的图形内存报告机制

(1)与传统模型的区别

Windows Vista 之前:

  • 图形内存由 显示驱动程序直接报告(如通过控制面板显示一个固定数值)。
  • 仅提供一个 静态的、粗略的总内存值(如 "显存:256MB"),无法反映动态使用情况。

WDDM(Vista 及之后):

  • VidMm 动态跟踪所有图形内存参与者(如 GPU 显存、系统内存共享、光圈段等)。
  • 向客户端提供 精确的、细粒度的内存状态(如可用显存、已提交内存、共享内存等)。

(2)报告内容

VidMm 报告的信息可能包括:

  • 专用视频内存(Dedicated Video Memory):GPU 显存。
  • 共享系统内存(Shared System Memory):通过 PCIe 光圈或 AGP 映射的内存。
  • 当前可用内存(Available Memory):实时可用的图形内存。
  • 内存压力(Memory Pressure):是否接近内存限制(可能触发逐出或降级)。

2. 主要客户端及其依赖

(1)Windows 系统评估工具(WinSAT)

用途:评估系统性能,决定是否启用 Aero Glass 特效(如透明窗口、动画)。

依赖 VidMm 数据:

  • 如果可用图形内存不足,WinSAT 可能 禁用 Aero Glass 以节省资源。
  • 示例:低端 GPU 可能因显存不足而强制使用 Basic 主题。

(2)桌面窗口管理器(DWM, Dwm.exe)

用途:管理桌面合成(如窗口动画、缩略图、Direct3D 加速)。

依赖 VidMm 数据:

  • 动态调整 合成策略(如降级为软件渲染 if 显存紧张)。
  • 确保 多窗口环境 的内存公平分配(如防止某个应用耗尽显存)。

(3)DirectX 游戏与图形应用

用途:优化渲染质量(如纹理分辨率、后期处理效果)。

依赖 VidMm 数据:游戏可能根据可用显存 动态调整画质(如《GTA V》的自动显存管理)。

错误的报告可能导致:

  • 性能下降(如误判可用内存,导致过度逐出)。
  • 视觉瑕疵(如纹理加载失败)。

3. 内存报告的获取方式

(1)通过 DirectX API

  • IDXGIAdapter::GetDesc

返回 DXGI_ADAPTER_DESC,包含:

复制代码
typedef struct DXGI_ADAPTER_DESC {
  UINT DedicatedVideoMemory;  // 专用显存
  UINT DedicatedSystemMemory; // 专用系统内存(如共享光圈)
  UINT SharedSystemMemory;    // 共享系统内存
};
  • IDXGIAdapter3::QueryVideoMemoryInfo(Win10+)

提供更细粒度的当前内存状态:

复制代码
DXGI_QUERY_VIDEO_MEMORY_INFO info;
adapter->QueryVideoMemoryInfo(0, DXGI_MEMORY_SEGMENT_GROUP_LOCAL, &info);
// info.Budget      // 当前可用预算
// info.CurrentUsage // 当前使用量

(2)通过 WDDM 内核接口

  • 驱动程序通过 DxgkDdiQueryAdapterInfo 向 VidMm 提供硬件能力数据。
  • VidMm 汇总后通过 DXGKQAITYPE_QUERYSEGMENTMEMORYSTATE 等查询类型返回内存状态。

4. 驱动程序的职责

  1. 准确报告内存容量:在 DxgkDdiQueryAdapterInfo 中正确填写显存、共享内存等数据。
  2. 处理动态内存变化:如果 GPU 内存动态调整(如 NVIDIA GPU 的 "Shared Memory" 机制),需通知 VidMm。
  3. 支持内存压力通知:当内存不足时,VidMm 可能调用 DxgkDdiRecommendFunctionalVidPn 或触发逐出

5. 实际影响示例

场景 传统驱动(XPDM) WDDM 驱动
多任务显存管理 应用可能独占显存,导致系统卡顿。 VidMm 公平分配,DWM 保持流畅。
游戏显存检测 仅看到固定值,可能误判。 动态获取可用内存,优化画质设置。
Aero Glass 自动降级 无智能降级,可能直接崩溃。 WinSAT 根据内存禁用特效。

6. 总结

  1. WDDM 的 VidMm 提供了细粒度的图形内存管理,取代了旧模型的静态报告。
  2. WinSAT、DWM、DirectX 应用依赖实时内存数据 以优化用户体验。
  3. 驱动程序必须准确报告内存信息,并支持动态调整(如显存不足时的逐出)。
  4. 开发者应使用 IDXGIAdapter3 等 API 获取最新内存状态,而非依赖硬编码值。

这种机制确保了 Windows 图形子系统在高负载、多任务环境下的稳定性和性能,同时为应用提供了更可靠的内存信息。

相关推荐
高翔·权衡之境7 小时前
主题10:实时性——硬实时与软实时
服务器·网络·驱动开发·信息与通信·智能硬件
不怕犯错,就怕不做11 小时前
ARM设备异常断电容易造成数据损坏,硬件如何设计
linux·驱动开发·嵌入式硬件
枳实-叶14 小时前
【Linux驱动开发】第10天:设备树零基础入门——DTS/DTB/DTC全解+编译流程
linux·运维·驱动开发
枳实-叶14 小时前
【Linux驱动开发】第11天:设备树(Device Tree)超详细全解:从诞生背景到工作原理
linux·运维·驱动开发
沃普天科技15 小时前
USB显示器驱动板触摸收款机显示器收银机点菜机广告机
驱动开发·游戏·计算机外设·电脑·ar·音视频·硬件工程
小此方16 小时前
Re:Linux系统篇(十九)进程篇·四:内核托底与生死交错 ,深度硬核剖析“僵尸”与“孤儿”进程
linux·运维·驱动开发
charlie1145141911 天前
嵌入式Linux驱动开发pinctrl篇(1)——从寄存器到子系统:驱动演进之路
linux·运维·驱动开发
猫猫的小茶馆1 天前
【Python】函数与模块化编程
linux·开发语言·arm开发·驱动开发·python·stm32
高翔·权衡之境2 天前
主题9:DMA与零拷贝——让CPU从数据搬运中解放
驱动开发·安全·缓存·系统安全·信息与通信
小此方2 天前
Re:Linux系统篇(十七)进程篇·二:深入浅出 [进程概念与进程父子关系]:从底层原理到实战应用
linux·运维·驱动开发