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 相同的行为)

相关推荐
木白CPP2 小时前
Linux 驱动UART子系统源码分析
linux·运维·服务器·驱动开发·嵌入式硬件·开源软件
恒锐丰-罗生1 天前
小体积大驱动|LTK8833 双通道 H 桥电机驱动芯片,电池供电设备首选动力方案
驱动开发·嵌入式硬件·硬件工程
正点原子4 天前
【正点原子Linux连载】 第十章 pinctrl和gpio子系统实验 摘自【正点原子】ATK-DLRK3568嵌入式Linux驱动开发指南
linux·运维·驱动开发
星马梦缘4 天前
“零一”智能硬件开发挑战赛 宣传稿
驱动开发·智能硬件·活动·培训·科协
小此方5 天前
Re:Linux系统篇(五十四)线程篇 · 七:互斥锁的底层实现原理:从硬件上下文、原子交换指令(Swap)到并发封装实战
linux·运维·驱动开发
芯片设计-曾工7 天前
当精准脉冲遇上清晰视界——CH2205E模块与YL1621的“黄金搭档“
驱动开发·stm32·单片机·51单片机·硬件工程
平凡的小蚂蚁8 天前
Exynos4412-POP-7inLCD裸机开发完整教程(STM32 库风格)
驱动开发·stm32·单片机·嵌入式硬件·嵌入式·硬件工程
小此方8 天前
Re:Linux系统篇(五十二)线程篇 · 五:直击 Linux 内核底层:TCB 与 LWP 一体两面全解析(附自定义线程封装)
linux·运维·驱动开发
胡八一9 天前
虚拟串口com0com安装教程
驱动开发·stm32·单片机
智者知已应修善业9 天前
【三位数字显示计时定时器设计-同步方式】2025-6-30
驱动开发·经验分享·笔记·硬件架构·硬件工程