开发者必知,Oculus Go的完整官方建议及新工具、技术特色
文章相关引用及参考:oculus
映维网将向大家分享为Oculus Go开发内容的Oculus官方建议,以及介绍Oculus为这款设备准备的新工具和技术特色
(映维网 2018年04月23日)Oculus Go是一款全新的VR一体机,与三星Gear VR一样兼容相同的Mobile SDK,Unity和Unreal SDK。大部分Gear VR应用无需进行修改即可运行在Oculus Go之上。在本文中,映维网将向大家分享为Oculus Go开发内容的Oculus官方建议,以及介绍Oculus为这款设备准备的新工具和技术特色。
1. 兼容Gear VR
Oculus Go提供对Gear VR的二进制兼容支持,而大部分支持Gear VR的应用无需进行任何更改即可在Oculus Go上启动。但Oculus指出了两款移动VR头显之间的关键不同,而开发者需要对此进行考量:
-
Google Play Services:与运行Gear VR的三星Galaxy设备不同,Oculus Go未安装Google Play Services。在Oculus Go上运行应用时,你不能依赖于Google Play Services,如Google Firebase,Google Cloud Messaging等等;或者依赖于Google Play Services的第三方库,如OneSignal。
-
2D表面:Oculus Go没有2D手机显示器,因此一些应用行为在Oculus Go上没有任何意义,如推送通知或通过单独的安卓应用程序进行验证。
- 摄像头:Oculus Go没有摄像头,无法运行需要访问摄像头的应用。
-
头显触控板:Oculus Go没有头显触控板。当在Oculus Go运行时,你的应用不应该使用头显触控板。
-
不同的控制器:Oculus Go控制器和Gear VR控制器共享相同的输入:都是支持可点击触控板和食指扳机器的3自由度控制器。虽然这两款设备提供了相同的输入,但每个设备的物理设计都有所不同。如果你的应用程序显示可见控制器,则应根据你是在Gear VR还是Oculus Go上运行来更改显示的模型。或者,你可以选择不同于Oculus Go控制器和Gear VR控制器的程式化控制器模型。
-
需要最新的SDK:部分老Gear VR应用仍然是允许Mobile SDK的1.0预发行版本,而Oculus Go并不支持这种应用程序。
2. 推荐的开发环境
Oculus推荐使用以下工具为Oculus Go和Gear VR开发内容:
-
使用Oculus 1.24.1或更高版本的Unity 5.6.5p2或2017.4.2(这里描述的很多新功能都需要用到)。
-
从Oculus的GitHub镜像中提取的Unreal4.18。
-
对于原生代码应用,建议采用Mobile SDK 1.21或更高版本。
请注意,在消费者设备上运行的Oculus Go应用程序不需要“osig”文件。但如果要启用对adb的访问以将应用版本推送到Oculus Go设备,你需要打开“Developer Mode(开发者模式)”,这反过来需要你在Oculus Developer Dashboard(开发者控制面板)上创建了一个Organization(组织)。
3. 固定注视点渲染与其他新功能
Oculus Go为用户提供了一些独特的功能与优化,包括Fixed Foveated Rendering(固定注视点渲染),Dynamic Throttling(动态节流)和72 Hz模式。更多关于这三种技术的信息请参阅“榨取最大潜力,详细解读Oculus Go三大关键技术:动态节流,72Hz模式、固定注视点渲染”(点击前往)。
以下是关于所涉及API的概述:
3.1 固定注视点渲染
在Unity中,开发者可以通过OVRManager.tiledMultiResLevel属性启用或禁用固定注视点渲染。
OVRManager.tiledMultiResLevel = OVRManager.TiledMultiResLevel.{Off/LMSLow/LMSMedium/LMSHigh};
如果要在Unreal中启用固定注视点渲染,请调用:
void UOculusFunctionLibrary::SetTiledMultiresLevel(ETiledMultiResLevel level)
原生开发者应该调用:
// 0 - off, 1 - low, 2 - medium, 3 - high
vrapi_SetPropertyInt(&m_jni.m_java, VRAPI_FOVEATION_LEVEL, {0/1/2/3})
如果想知道固定注视点渲染是否能为你应用程序提供帮助,你可以对比功能启用前后的总GPU利用率。请注意,如果应用程序本来的GPU利用率就不高,固定注视点渲染无法为你的应用提供太大的帮助。如果是这样的情况,我们建议你将眼睛缓冲区的大小增加至1280×1280或更高。操作系统在logcat中每秒报告一次GPU利用率,类似:
11-08 18:46:58.860 1698 1762 I UtilPoller: GPU Util 0.713356 / CPU Util 0.938144 (avg 0.839895)
3.2 动态节流
Oculus Go包含一种名为动态节流的热量和电池管理新方法(具体请参阅“榨取最大潜力,详细解读Oculus Go三大关键技术:动态节流,72Hz模式、固定注视点渲染”一文)。动态节流不需要任何新的API,其采用现有的CPU level和GPU level界面来定义最低时钟级别。但对于性能调试,关闭Dynamic Throttling非常有用,因为这样它就不会影响性能计时。你可以通过adb来做到这一点:
adb shell setprop debug.oculus.adaclocks.force 0
系统将保持关闭直到你重启设备,或者直到你将以上属性设置回1以回到动态节流。
如果你正在把Oculus Go作为自己的主要开发套件,我们建议你关闭动态节流(和固定注视点渲染),从而为Gear VR寻找合适的CPU和GPUlevel。
3.3 72Hz模式
你可以为Oculus Go选择72fps的运行速度以提升亮度和颜色清晰度.在Unity中,你可以通过OVRDisplay中的displayFrequency属性来启用72Hz模式。你同时可以通过OVRDidplay.displayFrequenciesAvailble来获取设备支持的显示器频率列表。
OVRManager.instance.display.displayFrequency = 72.0f;
在Unreal中,SetDisplayFrequency Blueprint节点可以设置显示器频率(通过GetAvailableDisplayFrequencies来获取设备支持的列表)。如果喜欢,你同时可以选择调用ovrp_SetSystemDisplayFrequency()。
对于原生代码开发者,你可以通过vrapi_SetDisplayRefreshRate()来设置刷新率。
vrapi_SetDisplayRefreshRate( app->GetOvrMobile(), 72.0f );
要查询支持的刷新率,你可以选择vrapi_GetSystemPropertyInt()函数,通过VRAPI_SYS_NUM_SUPPORTED_DISPLAY_REFRESH_RATES来获取支持频率的数字,选择vrapi_GetSystemPropertyFloatArray()函数,通过VRAPI_SYS_PROP_SUPPORTED_DISPLAY_REFRESH_RATES来获取支持的实际频率阵列。
4. 性能调优
正如Gear VR应用一样,你应该为所有的Oculus Go应用实施以下基本的设置:
-
总是通过Multi-View进行渲染(亦即Unity所说的“Single-Pass Stereo”渲染)。在Unreal中,请确保你正在使用“Mobile Multi-View”和Mobile Multi-View Direct”。
-
在Unity中,使用OVRManager,禁用Enable Adaptive Resolution。
-
在Unity中,请确保在Player Settings中启用Dynamic Batching和Static Batching。不应该使用Graphics Jobs。
你可以使用OVR Metrics Tool来在头显中渲染实时的性能图表叠加。在Oculus Go中使用OVR Metrics Tool需要设置一些系统属性(通过adb shell setprop命令),从而改变相应的显示信息。如下所示:
-
debug.oculus.omms.enableGraph (true|false):显示或隐藏整体性能图表
-
debug.oculus.omms.enableGraph2 (true|false):显示更详细的图表集
-
debug.oculus.omms.enableStats(true|false):显示或隐藏统计列表
-
debug.oculus.omms.pitch/.yaw/.distance/.scale(number):控制头显位置
-
debug.oculus.omms.headLocked(true|false):是否锁定头显或将其定位在空间中
下面是一些可以用于性能调优的系统属性,尤其是观察增加眼睛缓冲区和固定注视点渲染的影响(无需为每次测试重新构建应用)。
-
debug.oculus.textureWidth(number):设置默认眼睛缓冲区的宽度。必须重启应用程度才能看到效果。默认是1024。
-
debug.oculus.textureHeight(number):设置默认眼睛缓冲区的高度。
-
debug.oculus.foveation.level(0/1/2/3):将固定注视点渲染调至特定的级别(0为关闭固定注视点渲染)。可以实时切换。
通过结合这些命令和在adb logcat找到的利用率信息,你可以根据GPU负载来调优眼睛缓冲区大小和固定注视点渲染级别。以下是一个示例:
首先,在启动应用之前我们可以将默认的眼睛缓冲区大小改成1280×1280,并且关闭注视点渲染:
adb shell debug.oculus.textureWidth 1280adb shell debug.oculus.textureHeight 1280adb setprop debug.oculus.foveation.level 0
现在我们启动应用程序,并且扫描日志以寻找性能信息。
adb logcat | grep -e UtilPoller -e VrApi
这将产生:
GPU Util 0.916190 / CPU Util 0.640000 (avg 0.543814)
FPS=42,Prd=47ms,Tear=0,Early=0,Stale=39,VSnc=1,Lat=1,CPU2/GPU=2/3
这意味着我们的运行帧率是42fps,而GPU利用率大约为91%,所以我们正受限于GPU。现在,随着应用正在运行,我们可以启用固定注视点渲染,并看看会发生什么:
adb setprop debug.oculus.foveation.level 1
adb logcat | grep -e UtilPoller -e VrApi
这样的结果是:
GPU Util 0.591578 / CPU Util 0.625000 (avg 0.506702)
FPS=60,Prd=47ms,Tear=0,Early=0,Stale=0,VSnc=1,Lat=1,CPU2/GPU=2/3
在这种情况下,即便是最低级别的固定注视点渲染都可以将GPU利用率降低至大约60%,并且将帧率提升至60fps。在调优了固定注视点渲染和眼睛缓冲区值后,我就可以修改应用以在启动选项中设置这些值。
5. 为Oculus Go提交应用与更新
现在的Oculus Go应用提交与更新是通过现有的Oculus Developer Dashboard for Gear VR来执行。推动应用更新将同时推送至Oculus Go和Gear VR用户,而新应用程序提交的流程在很大程度上都保持一致。在提交应用或更新时,以下是需要注意的事项:
-
当你向Oculus Dashboard上传一个版本时,在发行方面你可以选择加入或选择退出特定的设备(Gear VR或Oculus Go)
-
当你上传一个应用时,Oculus将自动扫描造成Oculus Go不兼容的问题。如果发现任何相关的问题,Oculus将向你提醒。在这种情况下你可以选择在Gear VR上发行应用,但如果想在Oculus Go上发行应用,你需要提供一个已经解决了问题的新版本。
-
部分应用程序已经自动选择退出在Oculus Go上发行,这是因为它们存在兼容性问题。如果已经解决了额兼容性问题和上传了一个新版本,你可以重新选择加入在Oculus Go上发行应用。
-
Virtual Reality Checks(所有应用在提交时都需要通过这个检查)已经为Oculus Go进行了更新。所以在提交应用时请先行通过这个检查。