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

Xbox平台IDXGISwapChain1::Present1在120Hz下的帧同步异常问题

分析Xbox平台IDXGISwapChain1::Present1的帧同步异常问题

SyncInterval = 1时的异常原因

  • 60Hz刷新率+30fps视频的正常逻辑:SyncInterval=1表示等待垂直同步信号后提交帧。30fps视频每两帧对应一次屏幕刷新,Present1等待约16ms的垂直同步间隔,耗时14/15ms是同步等待+帧提交的合理时间,符合预期。
  • 120Hz刷新率+60fps视频的异常根源:Xbox平台的DXGI垂直同步存在默认绑定60Hz系统同步时钟的特性,即使屏幕刷新率设为120Hz,SyncInterval=1仍会对齐到60Hz的同步周期(16ms)而非120Hz的8.3ms。另外要检查SwapChain创建时的RefreshRate参数是否未正确设置为120Hz,若创建时固定为60Hz,Present1会强制遵循该刷新率的同步间隔。此外,若视频解码模块未真正输出60fps帧(仍按30fps输出后插值),也会导致每两次屏幕刷新才提交一帧,维持16ms的耗时。

SyncInterval = 0时的异常原因

  • 120Hz+60fps的交替耗时:SyncInterval=0表示跳过垂直同步立即提交帧。12/13ms的耗时是等待视频解码完成的时间,1ms则是帧已就绪后的直接提交,两者平均下来符合60fps每帧8.3ms的预期,属于解码与渲染的异步节奏差异导致的正常波动。
  • 60Hz+30fps的帧重复显示:SyncInterval=0关闭垂直同步后,30fps帧每33ms才提交一次,但60Hz屏幕每16.6ms刷新一次。Xbox的显示 compositor 会重复渲染当前已提交帧直到新帧到达,33ms内屏幕刷新4次,因此每帧会被显示4次。交替的耗时同样是解码等待与帧提交的时间差导致的。

排查与修复建议

  1. 修正SwapChain创建参数:使用DXGI_SWAP_CHAIN_DESC1时,将RefreshRate设置为与当前屏幕匹配的值(120Hz对应{120, 1}),同时确保BufferCount设为2或3,避免缓冲不足导致的帧阻塞。
  2. 验证视频输出帧率:确认解码模块输出的帧速率严格匹配目标刷新率对应的帧率(120Hz下输出60fps,而非30fps插值),保证帧生成节奏与屏幕刷新同步。
  3. 调整Present1标志:尝试添加DXGI_PRESENT_DO_NOT_WAIT标志,避免不必要的等待;同时检查DXGI_PRESENT_PARAMETERS的DirtyRects是否准确,减少 compositor 的处理开销。
  4. 适配Xbox平台逻辑:Xbox的帧同步存在平台特定优化,若需绑定120Hz同步,可能需要通过平台特定API(如Xbox GDK的显示配置接口)强制切换到120Hz的同步时钟。

附用户代码

RECT rect = {static_cast<LONG>(x), static_cast<LONG>(m_height - y - height),
             static_cast<LONG>(x + width), static_cast<LONG>(m_height - y)};
DXGI_PRESENT_PARAMETERS params = {1, &rect, nullptr, nullptr};
result = m_swap_chain->Present1(swap_interval, 0, &params);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 04:27:16