VR丨挥别读取丢帧!如何实现虚拟场景的转换?
译者:刘鸿(lewis2012)
审校:王玥亭(玥亭)
几个月前,我们制作了一个关于如何正确使用SteamVR过渡场景的视频,我们想也许可以做一个书面版本的教程,所以接下来我们将带领大家一步学习。
通常在Unity中,当你尝试加载一个关卡时,有一个非常方便的API,就是调用SceneManager.LoadLevel(string levelname)。假设你已经确定将场景文件添加到了项目的Build Settings中,那么你将转换到你命名的场景里。
Unity里面的Build Settings界面
对于移动设备,或者是部分个人电脑来说,在游戏场景转换期间,可能会遭受一些帧的丢失,因为你的设备在场景转换期间,内存中很多东西需要交换。对于这样的设备来说,通常不是一个大问题,对终端用户来说也几乎察觉不到。对于场景过渡需要较长时间,可以很容易地添加令人讨厌的加载界面。
然而,对于VR游戏来说,即使在0.5秒内,也不能接受一些帧丢失。对于患有模拟晕动症的用户来说,帧波动的体验会变得非常不好,它会不断提醒用户他们处于模拟体验中,从而减少了他们的存在感,沉浸感。事实上,如果VR头盔检测到丢帧时候体验是非常糟糕的,应该弹出当前的应用程序直到它VR头盔渲染合格。
解决这个问题的一个简单方法是将当前场景淡化为黑色,然后在黑色场景中过渡FPS下降。然而,对于SteamVR开发者来说,有一种更好的方式。
实现
作为SteamVR的一部分,有一个SteamVR_LoadLevel.cs的c#脚本。为了测试这个脚本,你可以将它添加到任何GameObject上的组件,启用自动触发器,当你点击play时,你将转换到你指定的场景。在我们的视频中(链接底部),我们谈论脚本中更多的属性,所以如果你想要了解更多的细节。
正如您可能已经猜到的,这是一个脚本,你可以使用它来加载关卡而不必导致FPS下降。这里的诀窍是,当你在内存中加载场景时,SteamVR会将场景转换为Compositor,然后在准备就绪时将转换回你的新场景。
这是真的!!
Compositor是一个后台进程,它充当虚拟现实的“集线器”,你可以从它那里得到通知,转换到不同的应用程序,或者像ReVive一样添加驱动程序。用计算机的术语来说,把Compositor看作你的虚拟现实桌面。
通过使用Compositor,当您加载关卡时,你将有效地使用自定义的低功耗桌面,从而避免了FPS值下降。这是在场景之间转换的建议方法,虽然它在文档中没有明显的说明,但它将为你节省大量时间,避免你去思考为什么会丢失帧。
未来的改进
正如现在所做的那样,SteamVR_LoadLevel脚本不是非常灵活,使用起来有点混乱。幸运的是,它是一个开源项目,任何人都可以参与其中。我希望看到的是CubeMap支持Skybox和其他自定义比如在转换过程中可以播放视频。如果有人比我早实现这个,我会很兴奋的。
结论
如果你正在开发虚拟现实,尤其是SteamVR,务必使用SteamVR_LoadLevel。
【版权声明】
原文作者未做权利声明,视为共享知识产权进入公共领域,自动获得授权。
----------------------
今日推荐
添加小编微信,可享双重福利
1.加入GAD游戏VR交流圈
获取行业干货资讯,观看大牛分享直播
2.领取GAD独家VR资料库,地址在小编朋友圈
包括研究报告、游戏制作、项目分享等全套资料
↓长按添加小编GAD-安琪↓