卡马克揭开VR延迟背后的真相
- 整个系统保持在50ms已经很快了, 但是还是可以感觉到延迟
- 20ms是可接受的最大延迟
- 传感器数据的推导预测可以缓解部分的系统延迟。但即使有一个非常复杂的人类头部运动模型, 也不能很好地处理开始运动和运动突变时的情况
- 滤波和传输是固定延迟, 但是离散的传感器数据包也会带来一个可变的延迟, 因为渲染的帧率与传感器的帧率是不一致的
- 早期的LCD在运动时有拖影, 尽管现在的工艺已经进步了很多, LCD的像素从一个值转变到另一个值大约仍要10ms, 专为3D游戏优化过的可以降低到一半以下
- OLED的像素切换时间在1ms以下, 激光显示甚至与CRT一样快
- 有一个不易察觉的延迟, 多数显示器显示一幅图像时是逐渐出现的, 就像从计算机中扫描出来一样。 这就导致了60Hz刷新率的屏幕底部比顶部晚了16ms
- 这对于固定的显示器不是什么问题, 但是对于头戴式的显示器,它会引起画面左右割裂或者转头时的晃动。 这是因为原图像是即时生成的, 但不同部分却不是同一时间显示的。 这个现象在LCD头戴显示器上会因切换时间的问题被忽视, 但是在OLED头戴显示器上非常明显
- 有一个非常有吸引力的立体渲染方向, 就是双眼的画面各由一个GPU渲染, 这样可以带来最好的性能和最小的延迟, 只是需要应用程序管理好两个独立的渲染上下文
- 阻止GPU缓存的负面影响是会降低吞吐量, 造成高负载时的帧率下降
- 多数的模拟并不直接依赖用户的输入,可能在一帧的延迟中并不明显。如果输入数据是在使用到时再采样,就会比在帧开始时保存下来延迟要低
- 延迟帧调度(late frame scheduling)通常需要等待,浪费了一些性能。 如果你的帧率依赖video retrace而不是固定的时间片, 那么从显示驱动中获取当前的扫描输出位置会有帮助
- 另一个降低延迟的方法是允许渲染层基于最新的采样数据修改游戏层传过来的参数(VIEW BYPASS)。简单地说, 可以计算出本次用户输入与上次采样的差值,用于修改游戏层提交给渲染层的视图矩阵
- 差值处理是最小程度的侵入, 但也有一些情况是用户输入不能影响渲染的,如玩家死亡时的过场动画。或许VR游戏从设计上就应该避免在头戴显示器中出现不能响应的情况,但是依照传统游戏的惯例这种设计还是有很多的
- 如果你十分了解渲染一帧所花的时间,那么一些额外的延迟可以通过整个渲染任务的延迟帧调度来节省下来,但这对于频繁变化的帧渲染时间并不是一件容易的事。然而一个后期处理任务(TIME WARPING)可以降低意料之中的一些时间, 这样就可以更加容易地进行延迟调度
- 从你的角度尽可能使用最好的信息绘制了一帧后(已经应用了view bypass),不要急着直接显示出来, 开发者还可以再次获取最新的用户输入, 生成一个更新过的视图矩阵, 把渲染的画变换到更新过参数的位置上。 使用这个变换, 显示到屏幕上的画面就反映了最新的输入
- view bypass和time wraping是互补的技术, 它们既可以独立使用也可以一起使用。time warping可以变换一个源图像的任意时间或位置到另一个, 一些视差和屏幕边缘的瑕疵又可以通过view bypass来弥补
- 需要模拟状态变更的动作, 如切换开关或武器开火, 仍然需要大约32-48ms的延迟通过整个管线, 显示出对应的画面信息时的延迟并不会低于bypass优化过的16-32ms。而最重要的头部朝向反馈却可以在60Hz的刷新率下延迟控制在2-18ms。结合低延迟的传感器和显示屏, 甚至可以做到不可察觉。连续的time warping让延迟低于3ms成为了可能,为人机交互打开了一片未曾探索过的新天地
- 传统的计算机交互并没有VR的延迟要求这么高, 但是敏感的人却可以说出20ms级别的鼠标反应差异, 所以这项技术对于非VR的应用也是值得推广的
- 一个有趣的应用就是云游戏, 客户端发送操作信息给远程服务器, 并返回游戏的视频流。这为玩家提供了极大便利,但网络和压缩的延迟使得动作向的游戏体验比较差。view bypass和time warping都可以在服务器上应用,能够抵消相当大一部分网络延迟。再进一步,time wraping如果可以在客户端本地运行,理论上可以降低到与本地应用程序相同的水平,不过把time wraping限制在30或40ms比较好,避免与源图像的距离差异过大。
卡马克揭开VR延迟背后的真相的更多相关文章
- Android IOS WebRTC 音视频开发总结(四七)-- 深度解读国内首届WebRTC大会背后的真相
本文主要解读国内首届WebRTC大会背后的真相,文章来自博客园RTC.Blacker,支持原创,转载必须说明出处,更多详见www.rtc.help -------------------------- ...
- CPU 利用率背后的真相,只有 1% 人知道【转】
导读:本文翻译自 Brendan Gregg 去年的一篇博客文章 “CPU Utilization is Wrong”,从标题就能想到这篇文章将会引起争议.文章一上来就说,我们“人人皆用.处处使用,每 ...
- 约翰·卡马克和他的id Software
John Carmack 上帝花了6天创造了这个世界,id software和它的创始人.引擎师约翰·卡马克(John Carmack),则用6款游戏创造了个人电脑的3D世界. 1992年,id做出了 ...
- 深入理解java虚拟机(十二) Java 语法糖背后的真相
语法糖(Syntactic Sugar),也叫糖衣语法,是英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语.指的是,在计算机语言中添加某种语法,这些语法糖虽然不会对语言 ...
- 7个连环问揭开java多线程背后的弯弯绕
摘要:很多java入门新人一想到java多线程, 就会觉得很晕很绕,什么可见不可见的,也不了解为什么sync怎么就锁住了代码. 本文分享自华为云社区<java多线程背后的弯弯绕绕到底是什么? 7 ...
- 【CEDEC 2015】【夏日课堂】制作事宜技术篇,新手职员挑战VR Demo开发的真相
日文原文地址 http://www.4gamer.net/games/277/G027751/20150829002/ PS:CEDEC 2015的PPT有些要到10月才有下载,目前的都是记者照片修图 ...
- 一些VR延迟优化方法
http://m.blog.csdn.net/article/details?id=50667507 VR中的”延迟”, 特指”Motion-To-Photon Latency”, 指的是从用户运动开 ...
- C# 不卡屏延时方法,延迟系统时间,但系统又能同时能执行其它任务
//延迟系统时间,但系统又能同时能执行其它任务,不卡屏延时方法 public static void Delay(int milliSecond) { int start = Environment. ...
- 重磅发布 | 黑镜调查:深渊背后的真相之「DDoS 威胁与黑灰产业调查报告」
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由云鼎实验室发表于云+社区专栏 本文经授权转载自 FreeBuf 2018年世界杯硝烟散尽,但关于她的话题却远远没有结束.说起世界杯,就 ...
随机推荐
- 哈希表的java实现
一.为什么要用哈希表 树的操作通常需要O(N)的时间级,而哈希表中无论存有多少数据,它的插入和查找(有时包括删除)只需要接近常量级的时间,即O(1)的时间级. 但是哈希表也有一定的缺点:它是基于数组的 ...
- 九度OJ 1097:取中值 (中值)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5092 解决:1411 题目描述: 存在两组数组,和4个数字a,b,c,d,要求做如下操作,将第一个数组第a个数到第b个数,第二个数组的第c ...
- 15款创建美丽幻灯片的 jQuery 插件
1. Skippr Skippr 是一个超级简单的 jQuery 幻灯片插件.仅仅是包含你的网页中引入 jquery.skippr.css 和 jquery.skippr.js 文件就能使用了. Sk ...
- 局域网如何通过SSH连接虚拟机装的centOS系统
首先,在一个局域网内的一台机器上装了虚拟机,虚拟机上装了centos系统: 但是,只有本机能连接centos,其他电脑都连不上: ping了一下发现不通,然后排查原因. 我发现局域网内的机器IP都是: ...
- Visitor Pattern
1.Visitor模式:将更新(变更)封装到一个类中(访问操作),并由待更改类提供一个接收接口,则可在不破坏类的前提下,为类提供增加新的新操作. 2.Visitor模式结构图 Visitor模式的关键 ...
- STM32 ~ 查看系统时钟
调用库函数RCC_GetClocksFreq,该函数可以返回片上的各种时钟的频率 函数原形 void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks) ...
- Anroid事件分发
因为最近因个人原因离职,面试的时候,有人问到了Android中事件分发机制的过程,因为忘得差不多了,没答好,所以回来后,想写了个Demo,重新复习一遍. 一般来说,Android的组件其实可以分为两类 ...
- 03-树1 树的同构(25 point(s)) 【Tree】
03-树1 树的同构(25 point(s)) 给定两棵树T1和T2.如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是"同构"的.例如图1给出的两棵树就是同构的,因为 ...
- ssh服务器终端乱码
在使用 iTerm2 ssh 连接远程服务器的终端时,终端中文显示乱码.但是本地使用却没有出现中文乱码的问题,在网络上寻找了一番发现应该是服务器字符集和本地 iTerm2 设置的字符集不一致导致的,于 ...
- this.triggerEvent()用法
在对组件进行封装时 在当前页面想要获取组件中的某一状态,需要使用到this.triggerEvent(' ',{},{}),第一个参数是自定义事件名称,这个名称是在页面调用组件时bind的名称,第二个 ...