You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows动态刷新率(DRR)下如何为动画请求更高刷新率?

Windows动态刷新率(DRR)问题解析与实现方案

一、Windows DRR的核心机制

Windows的动态刷新率(DRR)采用应用主动请求+系统智能调度的模式,而非完全自动处理:

  • 系统默认会将未主动声明高刷需求的窗口锁定在低刷新率档位(通常是60Hz),以降低功耗。
  • 只有当应用通过API明确告知系统“需要高刷新率”,且窗口处于活跃状态、有持续内容更新(如动画)时,系统才会切换到高刷模式;当窗口闲置、最小化或动画结束后,系统会自动回落至低刷。

你遇到的“移动光标时帧率跳升”,是因为系统检测到窗口有交互操作,临时触发高刷调度,但你的应用未主动请求,所以平时会被限制在60Hz。

二、动画启动前请求高刷新率的实现方案

针对Win32+OpenGL的场景,可通过以下步骤实现:

1. 适配Windows版本选择对应API

  • Windows 11 22H2及以上:使用官方提供的SetWindowRefreshRatePreference API,直接设置窗口的刷新率偏好:

    #include <windows.h>
    #include <winuser.h>
    
    // 动画启动时调用,请求高刷新率
    SetWindowRefreshRatePreference(hwnd, REFRESHRATE_PREFERENCE_HIGH);
    // 动画结束后恢复默认设置
    SetWindowRefreshRatePreference(hwnd, REFRESHRATE_PREFERENCE_DEFAULT);
    

    这个API会告知系统,当前窗口需要优先使用高刷新率,系统会自动在合适的时机完成切换。

  • Windows 10 1903~Windows 11 22H2之前:需通过DXGI API手动检测并切换高刷模式:

    1. 枚举显示器支持的刷新率模式,筛选出120Hz及以上的模式:
      IDXGIOutput* pOutput;
      // 假设已获取到对应显示器的DXGI输出对象
      UINT count = 0;
      pOutput->GetDisplayModeList(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_ENUM_MODES_INTERLACED, &count, nullptr);
      std::vector<DXGI_MODE_DESC> modes(count);
      pOutput->GetDisplayModeList(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_ENUM_MODES_INTERLACED, &count, modes.data());
      // 筛选目标高刷模式
      DXGI_MODE_DESC targetMode = {};
      for (auto& mode : modes) {
          if (mode.RefreshRate.Numerator >= 120 && mode.RefreshRate.Denominator == 1) {
              targetMode = mode;
              break;
          }
      }
      
    2. 使用SetDisplayConfig临时切换到该模式,动画结束后需恢复之前保存的原显示配置。

2. 配合OpenGL上下文设置

确保OpenGL的垂直同步设置不会强制锁定帧率:

  • 使用WGL扩展wglSwapIntervalEXT时,设置为wglSwapIntervalEXT(-1)(让系统自动控制同步,适配DRR调度),而非固定为1(强制绑定60Hz垂直同步)或0(关闭同步导致画面撕裂)。
  • 窗口的像素格式配置需支持高刷新率,避免因格式不兼容限制帧率。

3. 确保DPI感知配置

应用需设置为每显示器DPI感知V2,否则可能干扰DRR的调度逻辑:

SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2);

三、Chrome/Firefox的DRR实现逻辑

这类浏览器会通过以下方式适配DRR:

  • 实时检测页面中的动画元素(CSS动画、JS动画、Canvas绘制等),在动画启动时调用系统API(如SetWindowRefreshRatePreference或DXGI相关接口)请求高刷新率。
  • 跟踪动画生命周期,在动画结束后立即恢复默认刷新率偏好,平衡流畅度与功耗。
  • 对于无动画的静态页面,保持低刷新率档位,避免不必要的功耗浪费。

内容的提问来源于stack exchange,提问作者helloworld123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 05:43:17