http://blog.csdn.net/cartzhang/article/details/50788894

VR开发中性能问题—OculusWaitForGPU

本文章由cartzhang编写,转载请注明出处。 所有权利保留。 
文章链接:http://blog.csdn.net/cartzhang/article/details/50788894 
作者:cartzhang

**

一、OculusWaitForGPU

在unity 5.3.0f4中测试,使用Unity提供的VR解决方案,直接在Build setting的Playersetting中,勾选使用Virtual Reality Supported,如下图所示: 

在运行程序的Profile时,你会发现OculusWaitForGPU 的占用时间特别高。 
如下图:

二、原因

先说配置: 
Unity 版本:Unity 5.3.0f4 
OC版本:0.8.0 beta的. 
是什么造成这个问题的呢?

网上搜索各种原因,如下: 
1. 有的说是因为,CPU在等待OC的GPU渲染数据返回。 
2. OC内部API强制垂直同步,罪魁祸首是Unity内部集成的当前OC驱动。 
3. Unity个版本问题,不仅仅各个大版本,还有各个小版本之间,有个的f,有的是P。

三、大致的解决方案

为啥说大致的解决方案呢?因为招了半天,没有具体的,也没有谁说有个自己好用,别人也好用的方法。更重要的是OC官方说的方法,也是针对某个版本的暂时之用。

故此,我总结的方法如下: 
1.使用64位模式。 
2.在GUp和shader的渲染处理优化。 
3. 换OC版本试试,使用0.6.0.1,0.7版本的可能效率低。 
4. 5.3.0f4对VR来说不太好,可选择5.2.3p3来解决多线程问题,也就是说你的换换其他版本来测试,安装OC官方推荐版本来试试(下面会给出官方推荐版本连接)。 
5. 对于使用Untiy插件的观众:你的选择有多了一个!!代码来解决,自己修改 TimeWarp,但是OCulus官方说这个是暂时的,以后版本就不能这样用 的。 
关于修改TimeWarp的代码如下:

using UnityEngine;
using System.Runtime.InteropServices; /// <summary>
/// Helper class to modify the internal Oculus TimeWarp values.
/// </summary>
public class OVRTimeWarp : MonoBehaviour
{
public enum VsyncMode
{
VSYNC_60FPS = 1,
VSYNC_30FPS = 2,
VSYNC_20FPS = 3
} #pragma warning disable 414
[SerializeField]
VsyncMode targetFrameRate = VsyncMode.VSYNC_30FPS;
#pragma warning restore #if (UNITY_ANDROID && !UNITY_EDITOR)
[DllImport("OVRPlugin")]
// Support to fix 60/30/20 FPS frame rate for consistency or power savings
private static extern void OVR_TW_SetMinimumVsyncs( VsyncMode mode );
#endif /// <summary>
/// Start modifying the TimeWarp
/// </summary>
void Start()
{
if (!OVRManager.isHmdPresent)
{
enabled = false;
return;
} #if (UNITY_ANDROID && !UNITY_EDITOR)
Debug.LogWarning( "Setting TimeWarp Rate to: " + targetFrameRate );
OVR_TW_SetMinimumVsyncs( targetFrameRate );
#endif
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

看清楚了,这个是需要OC对Unity的插件的,因为看到里面的

OVRManager
  • 1
  • 1

看到这个东西了吧,这个就是需要OVRManager.cs,也就是OC插件里带的相机管理脚本。 
里面还有个宏定义,也就是说在安卓下使用。


#if (UNITY_ANDROID && !UNITY_EDITOR)
[DllImport("OVRPlugin")]
// Support to fix 60/30/20 FPS frame rate for consistency or power savings
private static extern void OVR_TW_SetMinimumVsyncs( VsyncMode mode );
#endif #if (UNITY_ANDROID && !UNITY_EDITOR)
Debug.LogWarning( "Setting TimeWarp Rate to: " + targetFrameRate );
OVR_TW_SetMinimumVsyncs( targetFrameRate );
#endif
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

什么是TimeWarp呢?这个问题,很好。简单说就是:处理VR,提高帧率的一种手段。但是不是万能的。 
具体参考如下: 
http://xinreality.com/wiki/Timewarp 
http://www.myexception.cn/other/1883027.html

里面讲了TimeWarp的基本原理,时间扭曲和位置抖动等,可以参考一下!! 
就这样了。

最后,就是关于Unity版本推荐的OC官方网:

https://forums.oculus.com/viewtopic.php?t=25882

四、参考链接

https://www.reddit.com/r/oculus/comments/3of567/huge_fps_hit_in_unity_with_vr_enabled/ 
https://forums.oculus.com/viewtopic.php?f=37&t=27963&p=310144&hilit=OculusWaitforGPU#p310144 
http://forum.unity3d.com/threads/major-vr-performance-issue-oculuswaitforgpu-running-on-cpu.328442/

http://xinreality.com/wiki/Timewarp 
http://www.myexception.cn/other/1883027.html

重要更新:2016-07-28 
我们的解决方案: 
目前我们测试的低OculusWaitForGPU的版本为:5.3.2f1版本。当然也不是说其他版本不行。 
只是我们没有测试过。

还有就是:目前对OCulus0.80.支持的最后版本为: 
Unity 5.3.4p4 and 5.4.0b15 were the last versions that supported PC SDK 0.8.!!!

就是这样了。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

VR开发中性能问题—OculusWaitForGPU的更多相关文章

  1. 关于VR开发中的穿墙问题随想

    在VR开发中,用户将以第一人称的视角进入虚拟世界,即用户同时身处两个坐标系:1. 现实世界坐标系(如房间的坐标系),用户的身体处于这个坐标系 2. VR世界坐标系,用户的感官处于这个坐标系,即用户觉得 ...

  2. Cocos开发中性能优化工具介绍之Visual Studio内存泄漏检测工具——Visual Leak Detector

    那么在Windows下有什么好的内存泄漏检测工具呢?微软提供Visual Studio开发工具本身没有什么太好的内存泄漏检测功能,我们可以使用第三方工具Visual Leak Detector(以下简 ...

  3. Cocos开发中性能优化工具介绍之使用Windows任务管理器

    说到Windows平台,我们很快就想到了Visual Studio 2012,然而Visual Studio 2012在这方面没有很好的工具.如果我们只是想知道大体上内存.CPU等在某一事件前后变化情 ...

  4. Cocos开发中性能优化工具介绍之Xcode中Instruments工具使用

    Instruments是动态分析工具,它与Xcode集成在一起,可以在Xcode中通过菜单Product→Profile启动.启动如图所示,Instruments有很多跟踪模板可以动态分析和跟踪内存. ...

  5. Java开发中程序和代码性能优化

    现在计算机的处理性能越来越好,加上JDK升级对一些代码的优化,在代码层针对一些细节进行调整可能看不到性能的明显提升, 但是我觉得在开发中注意这些,更多的是可以保持一种性能优先的意识,对一些敲代码时间比 ...

  6. 使用ThinkPHP开发中MySQL性能优化的最佳21条经验

    使用ThinkPHP开发中MySQL性能优化的最佳21条经验讲解,目前,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更 ...

  7. 在 Android开发中,性能优化策略十分重要

    在 Android开发中,性能优化策略十分重要本文主要讲解性能优化中的布局优化,希望你们会喜欢.目录 示意图 1. 影响的性能 布局性能的好坏 主要影响 :Android应用中的页面显示速度 2. 如 ...

  8. C++研究之在开发中你可能没有考虑到的两个性能优化

     1:多余的存储引用导致性能减少. 2:利用局部性提高程序性能: 先来说说引用是怎么减少程序性能.个人觉得减少程序性能主要有两个原因,一是数据结构选择不合理,二是多层嵌套循环导致部分代码被多余反复 ...

  9. VR开发2015年终总结

    本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/50617605 作者:car ...

随机推荐

  1. C++为什么不支持某些东西

    1.学习C++的过程,经常发现C++不支持一些东西,思考下,为什么? 2.C++不支持一些东西,有两个原因: a.可以做到,但是会导致一些不合理的结果,这些结果往往与程序员的期望不一致. b.属于“臣 ...

  2. Spark Core源代码分析: Spark任务运行模型

    DAGScheduler 面向stage的调度层,为job生成以stage组成的DAG,提交TaskSet给TaskScheduler运行. 每个Stage内,都是独立的tasks,他们共同运行同一个 ...

  3. 设置Delphi XE4默认界面样式

    VCL BitMap Style   Proceject Options->Application->Appearance 选择几个样式 使用代码设置   uses Vcl.Themes; ...

  4. 利用ajax获取到的网页源码不能执行js代码

    今天觉得我的博客中加载腾讯微博的速度很慢,所以就想改写为js,本来以为直接新建一个页面,把获取函数移到新的页面中,原来的页面只要使用xmlhttp去GET一下,然后把div的innerhtml属性等于 ...

  5. perl详解

    http://www.blogjava.net/qileilove/archive/2013/09/04/403646.html

  6. qsort函数、sort函数 (精心整理篇)

    先说明一下qsort和sort,只能对连续内存的数据进行排序,像链表这样的结构是无法排序的. 首先说一下, qsort qsort(基本快速排序的方法,每次把数组分成两部分和中间的一个划分值,而对于有 ...

  7. System.Data.SQLite.EF6

    2015.1.21 到目前为止这个破玩意不支持code first 建数据库 建表 代替方案   SQL Server Compact -------------------------------- ...

  8. linux【报错】userdel: user xiaoming is currently used by process 4713解决

    学习linux的初学者肯定会遇到一些莫名其妙的问题,比如我,在学习删除一个用户的时候,就遇到上面的报错 userdel: user xiaoming is currently used by proc ...

  9. ASP.NET MVC and jqGrid 学习笔记 1-基本配置

    新建一个mvc项目后

  10. Android之Handler探索

    Handler背景理解: Handler被最多的使用在了更新UI线程中,但是,这个方法具体是什么样的呢?我在这篇博文中先领着大家认识一下什么是handler以及它是怎么样使用在程序中,起着什么样的作用 ...