原文:http://oculusrift-blog.com/john-carmacks-message-of-latency/682/



延迟是OculusVR所面对的最大挑战之一,  它不仅会分散玩家体验游戏时的注意力, 还会导致晕动症, 所以找出它背后的原因并消除它是非常重要的。

  • 整个系统保持在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延迟背后的真相的更多相关文章

  1. Android IOS WebRTC 音视频开发总结(四七)-- 深度解读国内首届WebRTC大会背后的真相

    本文主要解读国内首届WebRTC大会背后的真相,文章来自博客园RTC.Blacker,支持原创,转载必须说明出处,更多详见www.rtc.help -------------------------- ...

  2. CPU 利用率背后的真相,只有 1% 人知道【转】

    导读:本文翻译自 Brendan Gregg 去年的一篇博客文章 “CPU Utilization is Wrong”,从标题就能想到这篇文章将会引起争议.文章一上来就说,我们“人人皆用.处处使用,每 ...

  3. 约翰·卡马克和他的id Software

    John Carmack 上帝花了6天创造了这个世界,id software和它的创始人.引擎师约翰·卡马克(John Carmack),则用6款游戏创造了个人电脑的3D世界. 1992年,id做出了 ...

  4. 深入理解java虚拟机(十二) Java 语法糖背后的真相

    语法糖(Syntactic Sugar),也叫糖衣语法,是英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语.指的是,在计算机语言中添加某种语法,这些语法糖虽然不会对语言 ...

  5. 7个连环问揭开java多线程背后的弯弯绕

    摘要:很多java入门新人一想到java多线程, 就会觉得很晕很绕,什么可见不可见的,也不了解为什么sync怎么就锁住了代码. 本文分享自华为云社区<java多线程背后的弯弯绕绕到底是什么? 7 ...

  6. 【CEDEC 2015】【夏日课堂】制作事宜技术篇,新手职员挑战VR Demo开发的真相

    日文原文地址 http://www.4gamer.net/games/277/G027751/20150829002/ PS:CEDEC 2015的PPT有些要到10月才有下载,目前的都是记者照片修图 ...

  7. 一些VR延迟优化方法

    http://m.blog.csdn.net/article/details?id=50667507 VR中的”延迟”, 特指”Motion-To-Photon Latency”, 指的是从用户运动开 ...

  8. C# 不卡屏延时方法,延迟系统时间,但系统又能同时能执行其它任务

    //延迟系统时间,但系统又能同时能执行其它任务,不卡屏延时方法 public static void Delay(int milliSecond) { int start = Environment. ...

  9. 重磅发布 | 黑镜调查:深渊背后的真相之「DDoS 威胁与黑灰产业调查报告」

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由云鼎实验室发表于云+社区专栏 本文经授权转载自 FreeBuf 2018年世界杯硝烟散尽,但关于她的话题却远远没有结束.说起世界杯,就 ...

随机推荐

  1. CCBPM中的消息机制,CCIM服务端安装说明

    1.改动LeeIMService.exe.config服务端配置文件: 2.client的配置就比較简单了,仅仅须要在"SercerIP"节点上写上server的IP: 3.然后要 ...

  2. MVC入门——删除页

    添加Action DeleteUserInfo using System; using System.Collections.Generic; using System.Linq; using Sys ...

  3. iOS进程间通信之CFMessagePort

    本文转载至 http://www.cocoachina.com/industry/20140606/8701.html iOS系统是出了名的封闭,每个应用的活动范围被严格地限制在各自的沙盒中.尽管如此 ...

  4. 哈希表的java实现

    一.为什么要用哈希表 树的操作通常需要O(N)的时间级,而哈希表中无论存有多少数据,它的插入和查找(有时包括删除)只需要接近常量级的时间,即O(1)的时间级. 但是哈希表也有一定的缺点:它是基于数组的 ...

  5. 无法启动FTP站点,服务目前停止

    在本地搭建了一个FTP服务器(windows搭建FTP服务器实战),再启动的时候提示错误: 错误提示信息: 根据提示可以查出问题原因:FTP服务没有开启 启动服务,再次重启站点服务.一切OK. 亲测好 ...

  6. REUSE_ALV_GRID_DISPLAY_LVC 的user_command

    *&--------------------------------------------------------------------* *& Form CALL_FUNCTIO ...

  7. MongoDB学习笔记(2):数据库操作及CURD初步

    MongoDB学习笔记(2):数据库操作及CURD 数据库操作 创建数据库 首先MongoDB中数据库的创建和数据库的切换都是使用命令,USE DATABASE,如果要切换的数据库不存在则会进行创建, ...

  8. [HTML & CSS] HTML和CSS基础知识

    最近将博客简单地修饰了下,需要用到HTML和CSS代码,花了一天时间学习了一下这两方面的知识.虽然内容很简单,但是足够用来修改自己的博客了. 1. HTML 1.1. HTML介绍 HTML与CSS的 ...

  9. hdu 6053(To my boyfriend)

    -----------题目链接------------- 题目描述: 给定一个矩阵,定义\(f(A)\) 为矩阵中不同元素的个数.现在要求\(f(A)\)的期望. 解法: 首先来暴力的,复杂度大约:\ ...

  10. C++中对类的提前引用声明注意事项

    //或许,友元是VC++6.0心里永远的痛,对于这个BUG我一直很介意.//注:这个程序在VC++6.0里是行不通的,在VS2008里是可以的.#include <iostream> #i ...