windows显示驱动开发-节能与 VSync 控制

为了节省计算机上的电源,内核模式显示驱动程序可以减少发生的 VSync 监视器刷新中断数。

较新的处理器和平台通常与操作系统配合使用,以在计算机系统空闲时节省能源。 但是,定期系统活动(如触发中断)会导致峰值用电量,并可能阻止计算机系统进入暂时性睡眠状态,从而节省能源。

从具有 Service Pack 1 的 Windows Vista (SP1) 和 Windows Server 2008 开始,当屏幕未从新图形或鼠标活动刷新时,操作系统可以关闭定期 VSync 中断计数。 通过控制 VSync 中断间隔,驱动程序可以节省大量能源。

可以通过使用 Windows Server 2008 或更高版本的 Windows 驱动程序工具包 (WDK) 重新生成 Windows 显示驱动程序模型 (WDDM) 驱动程序来利用此功能。

具有适用于 VSync 控件的 Windows Vista SP1 驱动程序更改

若要使驱动程序利用此功能,它们必须支持 Windows Vista SP1 中引入的 DXGK_VIDSCHCAPS 结构中的 VSyncPowerSaveAware 成员。 必须使用 Windows Server 2008 或更高版本的 WDK,使用 VSyncPowerSaveAware 成员重新编译 WDDM 后的现有驱动程序。

如果 1/Vsync 连续 10 个周期(其中 VSync 是监视器刷新率),如果具有 SP1 或更高版本的 Windows Vista 系统,其驱动程序位于 WDDM 后面,并且支持此功能,则会关闭 VSync 中断的计数功能。 如果 VSync 速率为 60hz (Hz) ,则 VSync 中断每 16 毫秒发生一次。 因此,在没有屏幕更新的情况下,VSync 中断在 160 毫秒后关闭。 如果 GPU 活动恢复,则再次打开 VSync 中断以刷新屏幕。

Display-Only Windows 8 及更高版本的 VSync 要求

在 Windows 8 及更高版本的 Windows 操作系统中,内核模式的仅显示驱动程序 (KMDOD) 是可选的,以支持 VSync 功能,如下所示:

仅显示驱动程序支持 VSync 控件

如果 KMDOD 支持 VSync 控件功能,则必须实现 DxgkDdiControlInterrupt 和 DxgkDdiGetScanLine 函数,并且必须提供 指向KMDDOD_INITIALIZATION_DATA 结构中这两个函数的有效函数指针。

在这种情况下,KMDOD 还必须实现 DxgkDdiInterruptRoutine 和 DxgkDdiDpcRoutine 函数,以便向操作系统报告 VSync 中断。

此外,无法D3DKMDT_FREQUENCY_NOTSPECIFIEDDISPLAYCONFIG_VIDEO_SIGNAL_INFO 结构的 PixelRate、hSyncFreq 和 vSyncFreq 成员的值。

仅显示驱动程序不支持 VSync 控件

如果 KMDOD 不支持 VSync 控件功能,则它不得实现 DxgkDdiControlInterrupt 或 DxgkDdiGetScanLine 函数,并且不得向 KMDDOD_INITIALIZATION_DATA 结构中的任一函数提供有效的函数指针。

在这种情况下,Microsoft DirectX 图形内核子系统根据当前模式和上次模拟 VSync 的时间模拟 VSync 中断和扫描行的值。

此外,DISPLAYCONFIG_VIDEO_SIGNAL_INFO 结构的PixelRate、hSyncFreq 和 vSyncFreq 成员的值必须设置为 D3DKMDT_FREQUENCY_NOTSPECIFIED。

如果不满足这些条件,DirectX 图形内核子系统将不会加载 KMDOD。

注册表控制

对于 SP1 及更高版本的 Windows 操作系统的 Windows Vista,默认 VSync 空闲超时为 10 个 VSync 周期。 (可选)出于测试目的,可以使用注册表设置来控制超时。

为了避免应用程序兼容性问题,请不要更改生产驱动程序中的默认注册表设置。

注册表项路径:RTL_REGISTRY_CONTROL\GraphicsDrivers\Scheduler

完整路径:HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\GraphicsDrivers\\Scheduler

项值:VsyncIdleTimeout

ValueType:REG_DWORD

值:10 = 默认值

值:0 = 禁用 VSync 控制 (生成与 Windows Vista 相同的行为)

相关推荐
sunoo-2291 小时前
【嵌入式Linux驱动学习】Day1-Day2 全流程梳理:环境搭建→U-Boot→内核→根文件系统→驱动基础
linux·运维·驱动开发·笔记·学习·阿里云·恩智浦
u1301307 小时前
GitHub 热榜项目:日榜(2026-10-07)
驱动开发·github
万物智能信息科技7 小时前
血氧心跳传感器MAX30100芯片驱动开发—【万物智能之开源鸿蒙OpenHarmony系统实战开发系列教程】
人工智能·驱动开发·华为·开源·harmonyos·鸿蒙
沫璃染墨2 天前
《从零入门Linux系统篇(五十八):线程篇·十一——线程安全与死锁详解:从可重入到多锁管理》
linux·服务器·开发语言·c++·驱动开发·安全·架构
ebiobiz2 天前
Zig 工具链编译 STM32 开发指南
驱动开发·stm32·嵌入式硬件
sukalot2 天前
Windows 驱动实例分析系列:libwdi 驱动分析 - 应用篇(一)
windows·驱动开发
Carl_奕然2 天前
【智能体】Loop 的四种设计模式之:Event-Driven Loop(2026 最新版)
人工智能·驱动开发·python·设计模式
gwf2163 天前
Completion Queue(CQ)与中断处理:轮询、中断聚合与错误码 —— 面向AI集群的驱动级深度剖析
驱动开发·性能调优·pcie·rdma·ai集群·中断聚合·cq
kakakahahahaha3 天前
Windows鼠标失灵排查:Ctrl Alt Delete、Mouse Keys、USB控制器与驱动修复
windows·驱动开发·电脑·笔记本电脑·软件需求
傲世仙尊3 天前
TCP报头全解-序号确认应答与可靠性是一个准数
驱动开发·网络协议·tcp/ip