一种生成中间帧技术,异步时间扭曲(Asynchronous Timewarp)

翻译: https://www.oculus.com/blog/asynchronous-timewarp/

异步时间扭曲(Asynchronous Timewarp 时间扭曲,即调整时长)调查

关于作者:迈克尔·安东诺夫,他是Oculus的首席软件工程师,领导SDK团队,在来Oculus之前,他是Scaleform的CTO,在那里他领导硬件加速Flash矢量图形引擎项目,这个引擎被用到上百个视频游戏中,在他的职业生涯里,他主要关注复杂的多线程体系结构,计算机图形学,编程语言设计领域。

导言: 异步时间扭曲(Asynchronous Timewarp简称ATW)是一种生成中间帧的技术,当游戏不能保持足够帧率的时候,ATW能产生中间帧,从而有效减少游戏画面的抖动,但是,ATW不是灵丹妙药,有一定局限性(局限性在后面介绍),开发人员也应该意识到。

简介: 近一年来,围绕着ATW这项技术已经有了许多令人兴奋的进展,ATW技术让虚拟现实设备保持较低帧率运行看到了希望,在虚拟现实穿戴设备中应用ATW,人为地填充中间帧,即使在帧率下降的情况下,也不会使渲染质量有显著的下降。

在Gear VR(三星的一款虚拟现实穿戴设备)中,ATW是其重要组成部分,并积累了宝贵的经验, 但是很不幸,经验表明,在PC机上ATW通过位置跟踪方法来解决虚拟现实系统抖动问题是有限的和有技术挑战的,就像Oculus Rift(虚拟现实眼镜)一样。在一些情况下,在虚拟现实中应用ATW后的效果和由跳帧引起的抖动效果一样糟糕。

在这篇博客中,我们分析了这些限制和导致特殊困难的原因,您将看到,ATW有时是有用的,但是还不能让虚拟现实引擎满帧运行,没有达到完美体验的程度。

时间扭曲(Timewarp),异步时间扭曲(Asynchronous Timewarp),和抖动(Judder)的概念:

时间扭曲是一种图像帧修正的技术,在使用虚拟现实眼睛设备时,由于头部运动过快,而造场景渲染的延迟,即头已经转过去了,但是图像还没有渲染出来,或者渲染的是上一帧的图像, 时间扭曲它通过扭曲一副被送往显示器之前图像,来解决这个延迟问题。 最基础的时间扭曲是基于方向的扭曲,这种只纠正了头部的转动变化姿势,这种扭曲对于2D图像是有优势的,它合并一副变形图像不需要花费太多系统资源。对于复杂的场景,它可以用较少的计算生成一个新的图像帧。

异步时间扭曲是指在一个线程(称为ATW线程)中进行处理,这个线程和渲染线程平行运行(异步),在每次同步之前,ATW线程根据渲染线程的最后一帧生成一个新的帧。

抖动和其具体细节在迈克尔·亚伯拉什的一篇文章中有详细介绍(参见我翻译的Ramblings in Value Time.)

在虚拟现实设备中,为了正确在虚拟世界里呈现一个人们的感知,必须要在显示器上的定时更新图像,然而,如果渲染时间太长,一帧就会丢失了,产生的结果就是抖动,这是由于新的一帧图像还没有被渲染出来,显示器显示了上一帧的图像,如果一帧图像被两次渲染就会产生下面结果,如图:

这里,眼睛转向左侧,这时图像又被渲染一次,图像落在视网膜的不同部分,导致双影抖动。

当然,双影并不是唯一的结果,如果同样的帧显示三次,就会产生三重影,以此类推。

基于方向的时间扭曲可以解决上午位置重影抖动问题,如果游戏渲染帧没有和头部运动达成同步, 时间扭曲可以介入并产生一个图像替代还没有被渲染出来的帧。 自从最后一帧被渲染,通过扭曲最后一帧来反馈头部运动, 所以相比原始的帧加入ATW显示会减少抖动,如果不加ATW不知道会发生什么事情。

在某些情况下,简单的渲染扭曲处理可以工作的很好,这种技术已经在Gear VR 中实现了,当游戏不能满足帧率的时候ATW就会自动填充帧,这使得帧很平滑,但有许多细不太明显的小瑕疵,因为 GearVR 缺乏位置跟踪,并且避开了近场对象。下面将讨论的许多瑕疵应该怎样减少或避免。

这也就是说,为什么说相比ATW在Gear VR而言,ATW在PC是更有意义和更有挑战性的,让我从Oculus Rift’s 所支持的位置跟踪开始探讨。

位置抖动(Positional Judder):

位置抖动是最明显的用基于方向的时间扭曲带来瑕疵之一,在使用虚拟现实设备时,当头部移动了, 如果在ATW产生图像帧时只考虑了旋转分量,那么任何头部平移分量都将被忽略了。这就意味着当你的头部从一边移动到另一边时,甚至是旋转你的头并且你的转动眼睛,你讲看见离你很近的物体会有多个图像的抖动,这种效果是非常明显的,在临近场空间中,比如下面的这个潜艇截图。

近场对象多重抖动的图像示例。

那么,这种影响有多严重?

这个颤抖的程度取决于玩家的运动方式,如果你保持你的头部相对静止并且只看风景,这种颤动将并不显著,可以忽略不计。

注意:上述现象在Gear VR 中是非常常见的, 它没有包含位置跟踪, 然而,头部模型产生虚拟的旋转,所以当用Gear VR 在半速率玩游戏的时候, 你仍然可以观察到近场物体的抖动。

如果看远处物体, 头部运动不太可能引起明显抖动。 在这种情况下。ATW可以使你自由的看中远处场景,并且没有明显的抖动。

换句话说, 如果你离场景非常的近,当你头部移动的时候,位置抖动将会相当明显,就像没有ATW一样,这种抖动也会出现在当你近距离看带纹理的地面的时候,这个场景离你非常近并没有产生中间帧, 由此产生的感觉是一个让人望而生畏,不稳定的世界, 让人非常迷茫和不舒服。

位置扭曲(Positional Timewarp):

解决位置颤抖的一个可能的方法是实现全位置扭曲,它应用平移和旋转两个分量来修正原始帧,位置扭曲,位置扭曲需要考虑原始帧的深度信息,由不同的量替代图像的一部分。 然而,这样产生的中间帧会使物体边缘不闭合,由于没有原始帧中的数据,会导致中间帧某些区域不能被覆盖。

此外,位置扭曲代价更高, 不容易处理半透明,处理反走样比较麻烦。位置扭曲并不能解决下面要讨论的情形。

运动的物体和动画:

使用ATW时,动画或者移动的物体引起另外一个瑕疵, 因为一个新的图像是只是根据原始图像生成的,原始图像上并没有物体的运动信息, 对于所有ATW产生的中间帧都好像是被冻结了一样,这个伪影表现为这些移动的物体,即抖动的多幅图像。

场景中移动物体产生的抖动效果。

这个伪影的影响取决于场景中物体数量,投影面积,运动速度,如果数量或大小的物体很小或不快,多个图像可能不是特别明显,然而,当移动物体或动画覆盖屏幕很大一部分,那将令人不安的。

此外,帧率比,即游戏帧率和显示设备刷新率的比值会对运动的抖动效果造成影响,根据我们的经验,ATW应该允许在一个固定的帧率区间内,例如,对于90赫兹的刷新率,我们应该在45赫兹区间使用ATW, 这将导致图像增加一倍,但在视网膜的双图像的相对位置将保持稳定,渲染在一个中间帧率,比如65赫兹,这将导致在视网膜上的图像数目和位置不断变化,这是一个糟糕的中间帧。

镜面反射:

计算镜面反射需考虑眼睛的方向, 或摄像机的方向, 由此生成一个图片。

由于眼睛或头部运动,镜面反射不再是正确的,这可能导致镜面反射抖动。

像镜面高光和反射依赖于眼睛位置一样,还有许多其他依赖于眼睛位置的着色技巧也有类似的问题, 例如,视差贴图和浮雕纹理映射将有类似的效果。

实现:

实现ATW是有挑战性的,主要有两个原因:

1: 它需要GPU硬件支持合理的抢占粒度。

2: 它要求操作系统和驱动程序支持使GPU抢占。

让我们从抢占粒度开始,在90赫兹,帧之间的间隔大约是11ms(1/90),这意味着为了使ATW有机生成一帧,它必须能够抢占渲染线程并且运行时间少于11ms,然而11ms实际上不够好,如果ATW在一帧时间区间内任意随机点开始运行,那么起潜伏期(执行和帧扫描之间的时间)也将随机, 我们需要确保我们不跳跃任何游戏渲染的帧。

我们真的期望ATW运行一直非常的短,短到在视频卡产生新的一帧之前结束,刚好有足够的时间来完成中间帧的生成,缺少自定义的同步ATW中断例程,我们可以获得高优先级抢占粒度和调度, 在最长2ms或更少的时间内。

原来,对现在的图形卡和驱动实现来说,2ms抢占是一个艰巨的任务,虽然许多GPU支持有限的形式的抢占,但执行存在显著差异。

1: 一些显卡实现厂商和驱动程序允许抢占任一批处理或回执调用粒度,虽然有帮助,但不是十分完美(举一个极端的例子,一个复杂的并包含很多绘制指令着色器可以很容易在10ms完成)。

2: 其他显卡实现厂商和驱动程序允许抢占计算着色器, 但需要特定扩展来支持。

如果抢占操作不是很快,则ATW将无法抢在画面同步之前生成中间帧。  这样,最后一帧将会再显示,将导致抖动,这意味着一个正确的实现应该能够抢占和恢复任意渲染操作,和管线状态。 理论上讲,甚至三角抢占(triangle-granularity) 不够好,因为我们不知道一个复杂着色器执行将花多长时间。 我们正与GPU制造商来实现更好的抢占,但是在这之前确实要因为这个问题花费一定时间。

另外一方面是操作系统对抢占的支持,在Windows8之前,Windiows显示驱动模型(WDDM)支持使用“批处理队列”粒度的有限抢占,对于内奸的图形驱动程序,很不幸,图形驱动程序趋向于大批量渲染效率, 导致支持ATW太粗糙。

对于Windows8,改善了WDDM1.2支持更细的抢占粒度,然而,这些抢占模式不被图形驱动程序普遍支持,渲染管线将在Windows 10 或 DirectX12中得到显著提升。 这为开发人员提供了较低级别的渲染控制,这是一个好消息, 但直到Windows10变为主流之前,我们还是没有标准的方式来支持渲染抢占, 造成的结果是,ATW需要特定显卡驱动的扩展。

时间: 2024-10-13 19:47:38

一种生成中间帧技术,异步时间扭曲(Asynchronous Timewarp)的相关文章

几种常见高级数据保护技术

一.远程文件复制 将本地主机上的文件实时同步到远程主机上,保证文件或目录内容一致,如 Linux常用的rsync就是这类工具,它可监视文件系统的动作,将变化同步到远程 主机,只复制变化的内容,对于大文件非常有用,可节省带宽资源,提高效率. 二.远程磁盘(卷)镜像 存储级的数据数据复制技术,本地产生盘和远程镜像盘数据实时同步,且同时 处于在线状态,当生产盘故障时,可立即切换到镜像盘.远程磁盘镜像有两种模式 同步模式和异步模式,同步模式可很好的保障数据一致性,但影响性能.而异步模 式则相反,通常会使

生成静态页技术

概要: 1.什么是生成静态页技术? 答:互联网上流行的做法是将数据源代码写入数据库再从数据库读取生成静态面,这样无形间就加大了数据库.将现有的ASP页直接生成静态页,将会节省很多. 2.为什么要生成静态页以及好处? 答:一.加快页面打开浏览速度,静态页面无需连接数据库打开速度较动态页面有明 显提高: 二.有利于搜索引擎优化SEO,Baidu.Google都会优先收录静态页面,不仅被收录的快还收录的全: 三.减轻服务器负担,浏览网页无需调用系统数据库: 四.网站更安全,HTML页面不会受Asp相关

四种生成和解析XML文档的方法详解(介绍+优缺点比较+示例)

四种生成和解析XML文档的方法详解(介绍+优缺点比较+示例) 众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址 DOM:在现在的Java JDK里都自带了,在xml-apis.jar包里 SAX:http://sourceforge.net/projects/sax/ JDOM:http://jdom.org/downloads/index.html DOM4J:http://sourceforge.

一维条形码生成与识别技术

核心提示:1引言 条形码(简称条码)技术是集条码理论.光电技术.计算机技术.通信技术.条码印制技术于一体的一种自动识别技术,条形码是由宽度不同.反射率不同的条(黑色)和空(白色),一维条形码生成与识别技术,按照一定的编码规则编制而成,用以表达一组数字或字母符号信息的图形标识符,参考文献1.熊小寒.条形码技术与标准化[M].天津: 1引言 条形码(简称条码)技术是集条码理论.光电技术.计算机技术.通信技术.条码印制技术于一体的一种自动识别技术.条形码是由宽度不同.反射率不同的条(黑色)和空(白色)

Web---myAjax(自己写底层)-隐藏帧技术

讲解网站一般都有的一个功能,就是注册时候的,实现验证用户名是否存在的功能. 源代码演示: reg.jsp: <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <

谢宾斯基三角形的几种生成方法

简介 谢宾斯基三角形(Sierpinski triangle)是一种分形,由波兰数学家谢宾斯基在1915年提出.它是一种自相似集. 几种生成方法 方法一:去掉中心 取一个实心的三角形(多数用等边三角形) 连接三边中点,将它们分成4个小三角形 将正中间的三角形挖空 对其余三个小三角形重复操作1 取一个正方形或其它图形开始,用类似的方法,形状也和谢宾斯基三角形相似,例如: 取一个实心正方形 将它分成3个“品”字形的小正方形 将其余部分“挖空” 重复步骤1 方法二:Chaos Game 任取平面上三点

Focusky教程 | 帧的播放时间太长,该如何调整?

(Focusky动画演示大师简称为"FS软件")设置适当的帧的播放时间能有效地展示内容,达到更好的演示效果.但如果帧的播放时间太长,所有演示动作完成后,还需等待一段时间后才能播放下一帧,可以对录音总时长和帧的停留时间作相应调整,从而使帧的播放顺畅.自然.美观. 具体步骤如下: 1.对录音总时长的设置. 录音总时长太长会导致录音播放完之后,帧有相当长时间的停留. [图1▲] 如下图所示,把录音总时长设置为和录音时间一致,在录音播放完之后直接进行帧的其他演示动作,从而调整帧的播放时间. [

Spring框架中2种生成代理对象的方法

Spring框架中2种生成代理对象的方法 Jdk Proxy基于接口生成代理对象,只能赋值给接口的引用(默认使用jdk). Spring进一步封装 CGLIB,基于实现类生成代理对象,既可以赋值给接口的引用,也可以赋值给实现类的引用 JDK提供的Proxy,和spring进一步封装的CGLIB.二者生成的代理没有任何区别,生成的都是代理对象.只是生产方式不同,前者是基于接口生成代理,后者基于实现类生成代理对象 如何切换spring框架中默认生成代理的方式 <aop:config proxy-ta

异步编程(Asynchronous Programming)

异步编程与我们所看过的其他并行编程形式有一些不同,讨论的其他主题可以有大量的线程并行运行,可以完全利用系统中可用的处理器:而在异步编程中,需要避免阻塞线程,我们在这一章的第一节"线程.内存.锁定和阻塞"中已经对阻塞线程的概念有所了解了.阻塞的线程是不能工作的线程,因为它需要等待其他任务的完成:线程等待的通常任务是操作系统执行的输入输出,但有时也可能是等待锁,因此会进行临界区.线程是相对昂贵的资源,每个线程分配 1 MB 的堆(stack),以及操作系统内核为管理大量线程而产生的其他相关