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 图形子系统在高负载、多任务环境下的稳定性和性能,同时为应用提供了更可靠的内存信息。

相关推荐
牧以南歌〆34 分钟前
在Ubuntu主机中修改ARM Linux开发板的根文件系统
linux·arm开发·驱动开发·ubuntu
Narnat2 小时前
Rk3568驱动开发_中断_14
驱动开发
mmoyula14 小时前
【RK3568 驱动开发:实现一个最基础的网络设备】
android·linux·驱动开发
站在巨人肩膀上的码农1 天前
全志T507 音频ALSA核心层注册流程分析
驱动开发·音视频·安卓·全志·alsa·声卡
车载操作系统---攻城狮2 天前
[驱动开发篇] Can通信快速入门手册 - 应用篇
驱动开发
Natsume17103 天前
嵌入式开发:GPIO、UART、SPI、I2C 驱动开发详解与实战案例
c语言·驱动开发·stm32·嵌入式硬件·mcu·架构·github
S,D4 天前
MCU引脚的漏电流、灌电流、拉电流区别是什么
驱动开发·stm32·单片机·嵌入式硬件·mcu·物联网·硬件工程
Despacito0o5 天前
ESP32-s3摄像头驱动开发实战:从零搭建实时图像显示系统
人工智能·驱动开发·嵌入式硬件·音视频·嵌入式实时数据库
小米里的大麦14 天前
014 Linux 2.6内核进程调度队列(了解)
linux·运维·驱动开发
Svan.15 天前
Portable Watch:基于STM32的便携智能手表
arm开发·驱动开发·stm32·嵌入式硬件·硬件工程·pcb工艺·智能手表