VR开发中性能问题—OculusWaitForGPU
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的更多相关文章
- 关于VR开发中的穿墙问题随想
在VR开发中,用户将以第一人称的视角进入虚拟世界,即用户同时身处两个坐标系:1. 现实世界坐标系(如房间的坐标系),用户的身体处于这个坐标系 2. VR世界坐标系,用户的感官处于这个坐标系,即用户觉得 ...
- Cocos开发中性能优化工具介绍之Visual Studio内存泄漏检测工具——Visual Leak Detector
那么在Windows下有什么好的内存泄漏检测工具呢?微软提供Visual Studio开发工具本身没有什么太好的内存泄漏检测功能,我们可以使用第三方工具Visual Leak Detector(以下简 ...
- Cocos开发中性能优化工具介绍之使用Windows任务管理器
说到Windows平台,我们很快就想到了Visual Studio 2012,然而Visual Studio 2012在这方面没有很好的工具.如果我们只是想知道大体上内存.CPU等在某一事件前后变化情 ...
- Cocos开发中性能优化工具介绍之Xcode中Instruments工具使用
Instruments是动态分析工具,它与Xcode集成在一起,可以在Xcode中通过菜单Product→Profile启动.启动如图所示,Instruments有很多跟踪模板可以动态分析和跟踪内存. ...
- Java开发中程序和代码性能优化
现在计算机的处理性能越来越好,加上JDK升级对一些代码的优化,在代码层针对一些细节进行调整可能看不到性能的明显提升, 但是我觉得在开发中注意这些,更多的是可以保持一种性能优先的意识,对一些敲代码时间比 ...
- 使用ThinkPHP开发中MySQL性能优化的最佳21条经验
使用ThinkPHP开发中MySQL性能优化的最佳21条经验讲解,目前,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更 ...
- 在 Android开发中,性能优化策略十分重要
在 Android开发中,性能优化策略十分重要本文主要讲解性能优化中的布局优化,希望你们会喜欢.目录 示意图 1. 影响的性能 布局性能的好坏 主要影响 :Android应用中的页面显示速度 2. 如 ...
- C++研究之在开发中你可能没有考虑到的两个性能优化
1:多余的存储引用导致性能减少. 2:利用局部性提高程序性能: 先来说说引用是怎么减少程序性能.个人觉得减少程序性能主要有两个原因,一是数据结构选择不合理,二是多层嵌套循环导致部分代码被多余反复 ...
- VR开发2015年终总结
本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/50617605 作者:car ...
随机推荐
- C++为什么不支持某些东西
1.学习C++的过程,经常发现C++不支持一些东西,思考下,为什么? 2.C++不支持一些东西,有两个原因: a.可以做到,但是会导致一些不合理的结果,这些结果往往与程序员的期望不一致. b.属于“臣 ...
- Spark Core源代码分析: Spark任务运行模型
DAGScheduler 面向stage的调度层,为job生成以stage组成的DAG,提交TaskSet给TaskScheduler运行. 每个Stage内,都是独立的tasks,他们共同运行同一个 ...
- 设置Delphi XE4默认界面样式
VCL BitMap Style Proceject Options->Application->Appearance 选择几个样式 使用代码设置 uses Vcl.Themes; ...
- 利用ajax获取到的网页源码不能执行js代码
今天觉得我的博客中加载腾讯微博的速度很慢,所以就想改写为js,本来以为直接新建一个页面,把获取函数移到新的页面中,原来的页面只要使用xmlhttp去GET一下,然后把div的innerhtml属性等于 ...
- perl详解
http://www.blogjava.net/qileilove/archive/2013/09/04/403646.html
- qsort函数、sort函数 (精心整理篇)
先说明一下qsort和sort,只能对连续内存的数据进行排序,像链表这样的结构是无法排序的. 首先说一下, qsort qsort(基本快速排序的方法,每次把数组分成两部分和中间的一个划分值,而对于有 ...
- System.Data.SQLite.EF6
2015.1.21 到目前为止这个破玩意不支持code first 建数据库 建表 代替方案 SQL Server Compact -------------------------------- ...
- linux【报错】userdel: user xiaoming is currently used by process 4713解决
学习linux的初学者肯定会遇到一些莫名其妙的问题,比如我,在学习删除一个用户的时候,就遇到上面的报错 userdel: user xiaoming is currently used by proc ...
- ASP.NET MVC and jqGrid 学习笔记 1-基本配置
新建一个mvc项目后
- Android之Handler探索
Handler背景理解: Handler被最多的使用在了更新UI线程中,但是,这个方法具体是什么样的呢?我在这篇博文中先领着大家认识一下什么是handler以及它是怎么样使用在程序中,起着什么样的作用 ...