N1.11.2asynchronous reprojection设计研究

重投影把渲染频率与显示频率解耦

别名: 时间扭曲 · ATW · ASW · spacewarp

概念解释

应用可以 70 帧画完一帧,屏幕仍按 90 Hz 亮。缺的那些显示刷新,用最近一张已画好的图,按最新头姿再投一次——这叫异步重投影(asynchronous reprojection),也叫时间扭曲(time warp / ATW)。渲染频率和显示频率被拆开:显示跟头,渲染跟得上就出新图,跟不上就拿旧图扭。

它解决的是「应用没赶上 vsync 时,世界仍要按显示频率跟上头部旋转」,不是把链路里每一段都变短。

机制

一帧画完时头已经不在提交时的位置。重投影在扫描前立刻取一次姿态,把颜色缓冲按旋转(有时按深度做平移)拧到新视点。旋转扭曲是 2D 采样,便宜,对点头、摇头特别有效,因为世界在空间里本该不动、图却要反向滑。平移需要深度:没有深度的区域拧完是破洞,常用邻域填充,于是物体边缘会拖出一层错的背景。

应用帧率掉到显示一半时,进阶做法会从两张旧帧估一张中间帧(ASW / spacewarp)。估计在刚体运动上还行,在半透明、粒子、没有深度的 UI 上会出重影或撕裂。重投影因此是解耦,不是免费的正确新帧:姿态对了,遮挡和动态物体仍可能是上一帧的。

关掉它,应用掉帧会直接变成漏刷新;开着它,漏刷新被补上,代价变成伪影。

怎么研究

让应用帧率受控地低于显示频率(固定 45/90、60/90),比较开/关重投影,以及只旋转扭曲 vs 带深度的平移扭曲。用高速摄像或光电二极管看显示是否仍满刷新,再用检查单数边缘破洞、手部重影。

自变量:应用帧率 / 显示频率比、重投影种类、场景是否含半透明与近手物体。 因变量:实际发光刷新、旋转时的世界滑动误差、伪影计数、主观「黏头」与「边缘发糊」。

要分开两件事:显示有没有漏拍,和内容对不对。只问「顺不顺」会把伪影算进成功。

边界

完全跟得上显示频率的应用,重投影几乎不露面,价值测不出来——要在掉帧条件里测。纯旋转观看收益最大;人在近处用手操作时,深度估计错会对手「粘」在错误深度上。视频透视的相机图若也走同一套扭,破洞填的是上一帧的真实世界,伪影更像鬼影。重投影不能修复模拟本身的停顿:物理、动画仍按应用帧率走,扭的只是相机。

怎么落地

  • 把显示频率当硬约束,应用帧率当尽力而为;运行时默认打开旋转重投影,不要让掉帧直接漏刷新。
  • 近手、半透明、没有深度的 overlay 尽量标成「不要乱填」,破洞用保守色或重拉那一层,而不是邻域瞎补。
  • 不要把「平均帧率 70」写成完成态——要看 90 Hz 的显示是否每次都有新姿态;那才是解耦有没有生效。
  • 验证:把场景负载加到应用稳定低于显示频率,转头。世界应仍按显示频率黏住;同时逐帧看手和半透明边缘有没有拖影。黏住但边缘在搓,说明解耦在工作、填充策略要改,而不是把重投影关掉。

延伸

  • 同组N1.11.1 端到端延迟是多段串联,优化只对最长的那段有效 · N1.11.3 丢帧在头动时表现为世界位置跳变,而不是画面变慢 · N1.11.4 延迟的波动比延迟的均值更难被适应
  • 相邻N1.05 运动到光子延迟 · N1.12 刷新率与残像
  • 站内检索asynchronous reprojection · time warp · ASW

同组卡片

快捷操作

分享

分享当前页面

ios_share

https://hci.top/zh/handbook/N1.11.2