2016 年初公司组建 VR-Tank 项目组,研发一款互动对战第三人称射击 VR 网络游戏——再战▪坦克大战。我也有幸加入该项目组进行相关测试工作,换句话说我也鉴证了此款 VR 游戏从出生到成长的全过程,中间也经历了各种困难与疑惑。不过最终在团队努力下也攻克了部分技术难题,下面我就针对如何解决 VR 眩晕问题进行讲解。

人为什么会产生 VR 眩晕?我想大家也通过网络或论坛查找到相关答案,我这里也做个总结:因为人的眼睛看到的 VR 画面与从耳朵前庭接收到的真实位置信息不匹配,导致脑负担加大,所以让人产生眩晕感。


解决 VR 眩晕方法尝试 “三部曲”:

提升游戏运行帧率,降低延迟!

造成游戏帧率偏低的因素比较多,比如硬件资源配置,美术资源设定,程序逻辑等等。

(1)第一步:硬件资源配置

我们来看一组 PC 端与 VR 视角下关于电影效果与高效果帧率测试数据比对:

根据图形处理器(GPU)厂商英伟达推出的 GTX Geforce VR Ready 计划,其推荐支持 VR 的电脑配置为:
处理器要达到 i5-4590 以上
8GB 以上内存
NVIDIA GTX 970 以上
Windows 7 SP1 及更高

基础的硬件资源配置不达标,帧率低、延迟大是在所难免的。所以在满足硬件资源,抛开低效与普通效果画面品质的情况下,我们还需要进一步在保持极限效果下提升运行帧率、降低延迟。
举个例子:低帧率状态下运行会带来残影效果(所谓的 “余晖效应”)。
顺便也科普下什么是余晖效应?如图所示:坦克在移动状态下,国旗会随风摆动。这里为了方便查看将其放大三倍。此时大家可以在国旗右边看到比较明显的画面扭曲残影,这就是余晖导致的结果。

提升帧率与调整 VR 视角下的所有资源物件移动速度,可以有效的防止眩晕的产生与画面的形变,相关美术人员在做后期优化时要注意此项。

说完基础电脑硬件配置后再来看一看头显设备。VR 游戏追求的就是沉浸感,这也受到分辨率的影响:分辨率越高画面就越清晰,玩家越容易产生身临其境的感觉。

结合目前我们手上现有的 HTC Vive 和 Oculus Rift 两款设备,发现其分辨率都是 1200X1080,通过二者信号定位难度、佩戴舒适度进行比较,个人建议公司在研发过程中以 Oculus Rift 为主;玩家单人游戏体验则以 HTC Vive 为主。
下面以两张图来看看 HTC Vive 与 Oculus Rift 在 VR 视角下的显示:

HTC Vive 视角

Oculus Rift 视角


(2)第二步:美术资源设定
游戏场景中包含建筑掩体、自然植被、角色人物、光照、阴影等等,这些内容都消耗 GPU 和 CPU,从而拉低帧率,影响用户体验。
通常人眼水平最大视角可超过 180°,而单眼舒适视角只有 60°左右,处在这个方位内人眼视力最敏感,超过这个范围人就会本能的转头或各角度搜索目标,导致关注点不集中。因此游戏过程中引入关卡推进机制,逐步加载显示场景物件(优先加载渲染靠近玩家的物件),从而分担资源加载、渲染消耗。

如上图所示:
人的水平视角 APB 维持在 60°左右,处在 CDFE 区域的场景在第一阶段刷新显示:包含可破坏墙体、树木植被及敌军坦克、直升机等,这些物件被摧毁后消失,减少资源占用。
CDFE 关卡进度完成后再进入到 EFHG 区域,以此类推。这也避免大地图场景中因为各物件与玩家距离不同而需玩家频繁调整瞳距查看物件,一定程度上降低了视觉疲劳。
如下图所示:
绿色光标区域为一阶段关卡触发条件,进入该区域才会刷新敌军不同类型坦克或直升机 和部分场景。

对于美术资源优化及设定原则:能不添加的资源就不要添加,能不移动的物件就不要移动。结合我们现有项目研发过程中遇到的问题,为大家着重讲一下细节方面处理方式:

①标志物的设定:为什么要设定一个标志物?这个问题暂且不回答,先问大家一个问题:进入 VR 视角下进行游戏,当你快速移动或者转向的时候,你是否觉得整个世界都在晃动?如果回答 “是”,那么一段时间后你就会产生非常严重的眩晕感。
再问大家一个问题:我们人在晃动头部的时候,相对于我们的眼睛,眼前所有的事物都在晃动。但实际上为什么这时却感觉不到眩晕呢?
因为我们的鼻子!无论眼睛怎么动,鼻子相对于眼睛来讲是永远保持静止的,它存在的意义就是帮助我们感知运动,告诉自己是头部在运动而不是整个世界在运动。所以抛开前面提到的刷新率和分辨率等硬件相关,还有很重要的一点就是游戏制作过程中忘记了 “鼻子” 这样东西。
因此 VR 游戏在制作时要考虑设定标志物,通过锁定玩家视角来减轻眩晕感。

举个例子,如右图所示:

第一人称视角下玩家相当于驾驶着坦克,炮管和炮台与玩家视角始终保持相对静止,这样一来玩家驾驶移动坦克过程中,可以有效帮助玩家感知自己与坦克同步移动,从而减低眩晕感。这里面炮管与炮台就是我们设定的标志物。
但需要注意的是标志物的设定,最好是玩家主角本身的某个身体物件,不要尝试用复杂的第三人称物件去实现这个功能,在配置资源的时候尤其要引起重视。

②资源物件透明度设定及 LOD 的配置:需要根据不同物件的不同情况去选择透明度与 LOD 的距离。这里我也没法提供标准数值做参考,因为越接近完美的数值需要经过反复测试、调整。
除此之外,相关的还有贴图复杂度、定向光源重叠、光照复杂度等,这里先简单介绍下关于 Actor 的查看方法。
如下图所示:将不使用或者出现次数较低但面数与材质较复杂、分辨率较高、纹理及初始量复杂的物件作出相应的修改,以降低场景加载与渲染线程的压力,从而提升帧率,降低延迟,减少眩晕感。

美术资源设定包含但并不局限上面提到的两点。下面我将结合 GPU 性能分析器去解析问题所在下面,优化美术资源,提升游戏性能从而提高帧数。

如下图所示:粒子消耗性能图(查看命令为 stat particles),图中可以看到渲染一帧图片粒子模块所需要时间的最大值与平均值,通过该数据可以帮助分析粒子模块的性能及问题。

如下图所示:场景渲染所耗费时间图(查看命令 stat scenerendering):

值得说明的是在定位问题时,最好确保测试环境稳定:即游戏运行正常(帧数平稳)与游戏运行复杂(帧数波动),得出两组数据,通过两组数据比较从而能够更精准的定位问题所在。

GPU 性能分析器使用小技巧:快捷键 “ ctrl+shift+,” 打开,它是 UE4 引擎自带的一个功能,打开后界面如下图所示:

常见的数值包括:半透明、后期处理、基础通道、灯光及粒子模拟等,通过 GPU 可视化查看器可以帮助我们更好的分析各项数值对 GPU 性能的消耗。


(3)第三步:程序逻辑与 CPU 性能消耗
如下图所示:坦克在对战过程中场景渲染消耗时间。通过 stat game 与 stat scenerendering 命令组合查看游戏框架逻辑和场景渲染消耗时间,可以看出消耗较大。

如下图所示:敌方 AI 坦克集体刷新时 CPU 消耗数据。

注:整个游戏流程中此时的逻辑消耗是最大的。

通过 stat slow 0.01 10 命令查看在过去的 10 秒内所有运行时间超过 10 毫秒的循环统计数据。

对于场景消耗与逻辑消耗的优化,可以结合上述三方面得出的数据去分析,定位问题所在。


结束语
如上内容基于平时测试工作总结分析和参考官网说明梳理出来的,可能还在不足之处希望大家多多指正,推进 VR 游戏测试行业发展~


↙↙↙阅读原文可查看相关链接,并与作者交流