您的位置:首页 > 其它

时间异常

2016-05-15 23:09 204 查看
时间异常转换立体图像基于最新的头部追踪信息来有效的减少动作到图像的延迟。

立体眼视图是被渲染的纹理,它们随后被扭曲到显示器上来修正由宽角度镜头导致的失真在头戴中。

为了减少移动到图像的延迟,更新方向信息被检索为头戴只在绘制的时间扭曲之前,计算一个转换矩阵(歪曲眼纹理从它们在哪儿被及时渲染到它们应该被及时显示)。

很多人是怀疑的第一次听到这些时,但是为了看法转变,扭曲像素几乎是最正确的。一个急剧的旋转会留下一些像素黑边,但是这结果是最小的分散注意力。

时间扭曲花费一个步骤通过达到一个"篡改的时间异常"。因为视频被扫描在一个120扫描行/ms的速率,扫描行向远方右处有一个大的延迟不扫描行向左。在一个迟钝的LCD上这不是问题,但是在一个新鲜的转换OLED上,用户可以感觉世界像是精巧的伸长或者修剪当它们快速转换时。这是正确的通过预测头部姿势在在每个眼睛的开始,一个小于8ms的预测期,和每个眼睛的末尾,小于16ms。这些预测被用于计算时间异常转换,异常是被篡改的在两个扫描绘制线值之间。

时间异常可以被实现在GPU上通过渲染一个全屏四方盒子用一个碎片程序(计算异常纹理坐标)来取样眼纹理。然而,为了改善性能时间异常渲染一个一致的镶嵌花纹的三角格子覆盖整个屏幕(那儿的纹理坐标是设置了采样眼纹理)。渲染一个三角形格子用异常纹理坐标的结果是一个分段的线性的时间异常的近似的。

如果时间异常运行异步来立体渲染,随后它也可以被用于增加感知帧率和平滑不一致的帧率。默认的,异步的时间异常为native和Unity应用。

时间异常同步最小值

时间异常同步最小值参数默认值是1为一个60FPS目标。设置它为2会减少最大值应用帧率到不会超过30FPS。异步时间异常线程会继续渲染新帧来更新头部追踪在60FPS,但是应用只会有一个机会去产生30新立体眼缓冲对每秒。你能设置更高值为实验目的,但是仅仅健全的值为应用是1和2.

这儿有两个案例你可以考虑明确的设置这些:

如果你的应用大部分时间不能保持60FPS,它可以是美好的固定在30FPS一直,而不是有应用平滑或行为改变非预测为用户。在很多案例下,我们相信简化体验来保持60FPS是正确的决定,但是这可能会有异常。

应用渲染在30FPS会保持一个重大的电源账号和减小热量加载在设备上。一些应用可以是60FPS,但是会很快进入热力那个问题,它能有灾难性的性能隐患--它可以必要的来达到30FPS如果你希望能显示期望的周期时间。看电源管理获取更多信息关于热量阀门减轻策略。

渲染不在60FPS的结果

这些结果应用是否你有明确的设置MinimumVsyncs或者你的应用是简单的它自己运行慢。

如果视角是远离所有几何学,没有东西是有生气的,头部旋转速率是低的,这儿没有视觉上的不同。当任何这些条件没有呈现,这儿会或多或少的影响平衡。

如果头部旋转速率是高的,屏幕会出现黑边通过一个变量账户依赖于从一个眼缓冲被提交多长时间。这一直出现在60FPS,但是因为总时间是少的和从帧到帧不变,它几乎不可能被注意到。在低帧率下,你能看到它强烈的在屏幕的边。

这儿有两条缓和这些:

1.代替使用“现在”或者时间当帧会开始被显示就像点(头部追踪模式是质疑的)一样,使用一个时间是在所有的帧(眼缓冲会被显示)的中间点。这提供“非渲染区域”在屏幕的两边,而不是堆到一边。

2.耦合的,增加使用的视野为眼缓冲给它更多垫子关闭边界来拉取。原生应用,我们现在添加10度给FOV当帧率在60以下时。如果眼缓冲的分辨率没有增加,这个有效的低分辨率在屏幕中间。这儿可以是值在动态缩放FOV基于头部旋转速率,但是你可能一直看一个最初的顶部在边上,连续不断的转换FOV结果是在更多可视边当几乎稳定时。

时间异常现在没有尝试补偿变化在位置上,只有看法。我们没有真正的位置追踪在移动中,但是我们使用了一个头、脖子模式提供一些眼球运动基于旋转,应用允许用户航行围绕明确的移动眼球原点。这些值不会改变在所有眼球更新之间,所以在30FPS中,时间异常可以是平滑的更新每帧,但是运动可以只改变每一个其他帧。

笔直的向前走没有任何真正的东西靠近由工作的更好而不是可以被期望的,但是回避下一个墙使它相当的明显的。甚至移动你的头部当非常靠近物体使效果可见。

这儿没有魔法方案,我们没有性能头房间在移动上有时间异常做一个深度缓冲通知二次投影,和多一些可能建立新的视觉上的东西在任何案例上。这是一个简单了途径我们可以采取对待整个场景就和一个单一的深度一样,但是影响它不是现在的调度。

这是安全的说如果你的应用有一个重大的图形元素接近卡住视图,就像一个FPS武器,它不是一个候补者对30FPS。

旋转你的视点用一个控制器是在最令人恶心的事情你能在VR中做的之间,但是一些有些一直需求它,当处理整个通过应用,这结束就像一个位置改变,所以一个低帧率应用可以有平滑“旋转”当用户的头在移动时,但是短粗的旋转当他们使用控制器时。为了访问这些,时间异常有一个“ExternalVelocity”矩阵参数能允许控制器偏离平滑的推测在每个渲染帧上。我们现在没有一个Unity接口给这个。

在世界中,动画会被注意成厚重的在低帧率下,但是原位不会结束是非常分心的。对象在轨迹上是更多问题的,因为他们出现是推后的和向前的就像他们移动一样,当你追踪他们用你的头。

很多应用,单通道渲染可以一直是一个好的体验比30FPS渲染。节约不是很大,但是他是一个清楚的交易没有任何变量。

如果你在60FPS之下,Unity应用可以更好离开不用多线程渲染,它添加一个延迟帧。30FPS的GPU管线和多线程渲染可以获得更多的延迟,当时间异常会移除所有的看法,位置改变包含头部模式,会感觉非常滞后。

注意这是所有渗色边,一些指南是推测的。

时间异常调试曲线

关于时间异常的细节信息能在调试曲线中获得。

在原生应用中,打开调试曲线通过设置适当的标准在FrameParms:FrameParms.flags |= VRAPI_FRAME_FLAG_TIMEWARP_DEBUG_GRAPH_SHOW;

在图形中的每个线呈现一个眼睛在屏幕上。一个绿线代表眼睛有一个新帧源比较最后时间它被绘制。一个红线代表它hi使用相同的纹理和前面的帧一样,时间异常对当前的位置。一个应用渲染一个稳定的60FPS会有所有的绿线。一个曾经红和绿线的分布代表应用普遍是慢的。红钉代表一个间歇性操作像垃圾收集器可以导致问题。一对高红线代表一个整个帧是跳跃的。这应该不会发生除非OS或图形驱动有一些未期望的争辩。不幸的是这有时会发生。

水平白线重复呈现近似于8ms先前的眼视图是被扫描输出的,红和绿线重复呈现时间异常的开始操作渲染的结束。如果线是完全的内部白线,绘制完成在目标内存被扫描输出到视频之前,任何事情是好的。如果线延伸超过白线,一个简短的撕裂可以被可见在屏幕上。

在一个完美的世界中,所有的线可能是短的和在图形的底部,如果一个线开始超过底部,时间异常不会获取调度当它希望时,如果一个线是不同寻常的长,它代表GPU花费了一个长时间来获取一个点它可能上下文交换到高优先级时间异常命令。CPU加载和GPU管线气泡必须被平衡反对最大上下文交换延迟。

Adreno使用一个瓷砖架构和能交换任务每个太多的瓷砖可执行文件。时间异常被执行就像一个高性能任务一样但是必须等待最后一批瓷砖文件被完成。如果前台应用正在被渲染它使个别的瓷砖非常昂贵,它可以导致问题。最好的结果,避免包括部分屏幕用高的完全嵌合的图像(这使用一个昂贵的碎片程序)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: