http://blog.csdn.net/leonwei/article/details/50966071

vr现在正处于风生水起的阶段,但是vr的性能一直是大问题,最主要的问题就是响应延迟,玩家改变位置到这一位置的图像被cpu提交,gpu渲染,同步刷新到头部显示设备上,这中间的延迟会导致用户的头晕,减少相应的延迟,是vr从硬件到软件一直在优化的问题。Nvidia针对这个,新推出了VRWorks组件,这是一套软硬件结合的改善响应延迟以及提高vr渲染效率的方案,从硬件上做了一些改进和加速,同时也提供了一组api,去为你的vr应用和vr设备提供优化的方案,每当技术存在瓶颈时,硬件的改进永远是推动性巨大的。在vrwork的优化方案中,有很多很值得学习和研究的地方,也有助于我们理解vr的性能瓶颈所在,这里做一下归纳。

vr的性能瓶颈来源

1.vr需要至少同时渲染2 张50fps的图像,比常规的pc渲染量都要大。
2.vr对输入延迟性要求很高,因为对输入超过20ms的延迟都会引起用户的不适。

VR WORKS的优化

1.vr sli 多显卡支持

通过增加显卡,增加渲染性能。

常规的多显卡渲染是这样的,



即显卡0和显卡1轮流渲染第n帧和第n1帧,但是要求cpu要提交的足够快,因为cpu还是要提交两份drawcall,cpu不能成为瓶颈,这种方式从绘制n到n绘制出来的延时如图。

vrworks 做了改进,如图
让显卡0和显卡1负责绘制左右两眼,而cpu为两个显卡提供一模一样的drawcall,因为zaivr的两眼绘制的东西基本是一样的,除了perspective矩阵不一样。而vrworks通过其api,实现了一组draw call 对多个显卡的广播,并可以为不同显卡设置不同的perspective(常量)。这样cpu一份drawcall对于两眼,而两眼的绘制在两个cpu并行,延迟大大节省。当然这里还有一些可能可以优化的,比如很多东西,例如shadow map,基于gpu的一些物理可能不需要在两个gpu都做一遍,可以优化一下。

2.Multy Resolution Rendering 多分辨率渲染。

这个在vr领域算是经典的优化了,很多vr设备都做了这个,原理来源于,vr的图像为了适应眼镜的变形要做卷曲(wrap),如图

我们需要得到的是右边的图,但是渲染出来的都是左图,所以一般都是在最后将左图在图像上做处理,变成右图,这样我们可以看到其实左图在边缘处很多像素在卷曲后被浪费了,于是人们就像我们是不是可以对vr的图像做不同分辨率的渲染,即中心区域用比较高的分辨率,而边缘位置用较低的分辨率,极限情况下,将大部分边缘降低分辨率,可以减少50%的pixel的渲染,提高一倍的效率。
但是常规的渲染管线,要这样做,得不偿失,因为你要切分这个区域,定义多个不同大小的viewport,然后将物体依次渲染到多个viewport上,当然你可能会想到对不同的viewport可以剪裁掉不同的物体。
但是nvidia的maxwell架构的芯片,即GTX900以上(也就是为什么做vr要用好的显卡)支持了一种叫做multi-projection的技术,即在显卡层面,支持同时运行多个视口和投影,他不同于常规管线,他在管线中并行了多个投影,同时渲染到多个viewport,pipeline还是一次,只是在后面将这些像素绘制到多个viewport,这就是硬件层面的多适口多分辨率。

3.asyncchronous
timewarp 异步时间卷曲

timewarp也是vr很经典的优化,在occlus等早已使用,如果没有timewarp,我们会感觉很大的延时和眩晕。因为就算帧率再高,我们看到影响的那一刹那,渲染的也是过去某个时刻的图像,和我们当时所处的位置是不一样的,这种不一致随着帧渲染耗时的增长而增长,这种timewarp的做法是,在gpu绘制结束,扫描给显示屏前,将这个图像做一个图像空间的位移,以校准我们当前的位置,也就是说处于p0位置渲染的图像,在p1位置绘制好给我们,我们需要将其校准成p1位置的样子,这种校准有很多算法,都是在图像处理上做的平移,这样我们会感觉到看见的和我们的位置是同步的。

但是在传统的渲染中,这些工作是在一个流水线上的,也就是同步的,当某一帧很耗时很卡时,用户会迟迟收不到当前位置校准的图片,一直停留在上一帧的图片,因为gpu卡住了,后面的校准(timewarp)也不能进行,用户会感觉强烈的卡和眩晕。

这里就提出了一个异步 timewarp的概念,即在gpu上有一个独立的线程做这个warp,即不管你主线程渲染卡成什么样,我这个独立的线程会按照帧率给你每个位置的warp,给你最新的基于你位置的图像,这能解决很卡很卡时我们依然能够得到模拟的图像。但是传统的gpu不支持这种独立的线程。nvdia的vrworks加入了这个。他加入了一个high-priority context的概念,允许用户启动一个优先级最高的线程最warp,独立于你的渲染线程。

4. direct mode

传统的渲染,pc的显示器会把vr眼镜作为显示器的一个显示扩展,vr眼镜和gpu是没有直接交互的,而vrwroks里可以开启vr headset的直接模式,让gpui直接将图像扫描到vr设备。

5.Front Buffer Rendering

在direct mode下允许直接渲染到vr设备的front buffer上,还是为了减少延迟,但是直接到front buffer 上的画面撕裂问题怎么解决?

这就是nvidia vr works对vr的性能的优化,也许对于vr应用开发是个好的消息,同时从中我们也可以一窥vr中的性能瓶颈和解决思路。

最后这是vr works 现在的软硬件支持情况:

pc, D3D11 only, windows7 +, Multi resulution rendrering 要gtx 900+(maxwell arc),其他的那些要GTX 500 +。

nvidia的开发者页面、

https://developer.nvidia.com/vrworks

vr的延迟和渲染效率优化与Nvidia VRWorks的更多相关文章

  1. (转)as3效率优化

    1.改进算法无论对于那一种程序,好的算法总是非常重要的,而且能够极大地提高程序性能,所以任何性能的优化第一步就是从算法或者说程序逻辑的优化开始,检查自己的程序是否有多余的运算,是否在没有必要的时候做了 ...

  2. jquery选择器效率优化问题

    jquery选择器效率优化问题   jquery选择器固然强大,但是使用不当回导致效率问题: 1.要养成将jQuery对象缓存进变量的习惯 //不好的写法 $('#btn').bind("c ...

  3. Unity3d代码及效率优化总结

    1.PC平台的话保持场景中显示的顶点数少于200K~3M,移动设备的话少于10W,一切取决于你的目标GPU与CPU. 2.如果你用U3D自带的SHADER,在表现不差的情况下选择Mobile或Unli ...

  4. cocos2d-x ios游戏开发初认识(六) 渲染的优化

    做程序开发肯定要考虑到内存的优化,毕竟iphone本身的内存就不是非常大.这一节主要说这个cocos2d开发对内存的优化,详细表如今,既能够对同样的精灵(图片)仅仅渲染一次,也能够对不能的精灵仅仅渲染 ...

  5. as3效率优化

    1.改进算法无论对于那一种程序,好的算法总是非常重要的,而且能够极大地提高程序性能,所以任何性能的优化第一步就是从算法或者说程序逻辑的优化开始,检查自己的程序是否有多余的运算,是否在没有必要的时候做了 ...

  6. Kettle中ETL的效率优化

    ETL效率优化 开启数据库日志记录及性能监控 如果我们想要优化一个ETL(KTR或者KJB)的性能,我们首先需要知道的就是它的瓶颈在哪里.而这些信息一般只能在ETL运行的步骤度量中看到,并且是不会持久 ...

  7. CSharpGL(30)用条件渲染(Conditional Rendering)来提升OpenGL的渲染效率

    CSharpGL(30)用条件渲染(Conditional Rendering)来提升OpenGL的渲染效率 当场景中有比较复杂的模型时,条件渲染能够加速对复杂模型的渲染. 条件渲染(Conditio ...

  8. HBase读延迟的12种优化套路

    任何系统都会有各种各样的问题,有些是系统本身设计问题,有些却是使用姿势问题.HBase也一样,在真实生产线上大家或多或少都会遇到很多问题,有些是HBase还需要完善的,有些是我们确实对它了解太少.总结 ...

  9. php程序效率优化的一些策略小结

    php程序效率优化的一些策略小结   1.在可以用file_get_contents替代file.fopen.feof.fgets等系列方法的情况下,尽量用 file_get_contents,因为他 ...

随机推荐

  1. hdu5317 RGCDQ 统计

    // hdu5317 RGCDQ // // 题目大意: // // 给定一个闭区间[l,r],定义f(x)是x的不同的质因子的个数 // 比方: 12 = 2 * 2 * 3,是两种.所以f(x) ...

  2. asp.net 列表控件

    web空间类都被放置在System.Web.UI.WebControls命名空间下1.ListBox  ListBox控件用于创建多选的下拉列表,而可选项是通过ListItem元素来定义的.示例代码如 ...

  3. raise 与 raise ... from 的区别

    起步 Python 的 raise 和 raise from 之间的区别是什么? try: print(1 / 0) except Exception as exc: raise RuntimeErr ...

  4. 管中窥Vue

    博客文章链接:管中窥Vue Vue和Angular.React.js的相同点和不同点? 与React的相同: 都使用了Virtual DOM 提供了响应式和组件化的视图组件 将注意力集中保持在核心库, ...

  5. C++引用详解【转】

    本文转载自:http://www.cnblogs.com/gw811/archive/2012/10/20/2732687.html 引用:就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作 ...

  6. 组合优化学习笔记<之>从贪心算法到子集系统再到拟阵

    贪心算法是用的比较多的一种优化算法,因为它过程简洁优美,而且结果有效.有些优化问题如最大权森林(MWF)是可以用贪心问题求解的,由于最小支撑树(MST)问题与MWF是等价的,所以MST也是可以用贪心算 ...

  7. cygwin Could not create directory '/home/Administrator/.ssh'

    在cygwin下运行: ssh-keygen -C "634772208@qq.com" -t rsa 时,出现如下错误: cygwin Could not create dire ...

  8. XML 解析中 SelectSingleNode 与 SelectNodes 使用通配符介绍

    俺是 XML XPath的新手,最近因为项目需要,研究了一下基本的两个函数 SelectSingleNode和SelectNodes 是如何实用通配符的,分享以下基本经验: 假设有段XML 如下所示: ...

  9. Tensorflow基础知识

    基本知识 使用 TensorFlow, 你必须明白 TensorFlow: 使用图 (graph) 来表示计算任务. 在被称之为 会话 (Session) 的上下文 (context) 中执行图. 使 ...

  10. Windows Vista for Developers——第四部分:用户帐号控制(User Account Control,UAC)

    作者:Kenny Kerr 翻译:Dflying Chen 原文:http://weblogs.asp.net/kennykerr/archive/2006/09/29/Windows-Vista-f ...