伊酷科技技术合伙人朱稼萌,前段时间分享了他们在Unreal Engine VR移动端进行优化的经验,从多个角度剖析影响VR游戏画面优化的原因。
以下为演讲实录:
大家下午好,我是来自伊酷科技的主讲朱稼萌。
今天主要是给大家讲一下关于Unreal移动端优化。因为我们公司之前做的游戏基本上都是PC VR游戏,所以在把这些游戏移植到移动端的时候碰到很多问题。今天主要是针对这些问题,把我们的解决方案跟大家分享一下。
为了让逻辑更清楚一点,我们先把可以优化的部分解剖一下。在VR游戏中影响优化的画面因素主要有三个方面:
第一个是元素相关:相当于模型的材质本身
第二个是渲染相关:主要是指除了元素模型之外的其他模型,包括灯光、特效、阴影、后期、体积物和反射
第三个帧率相关:需要将帧率稳定在一个比较高的阶段
下面讲一讲VR游戏在PC端与移动端有何不同?
首先因为在移动端中如果需要打光的话,需要禁用HDR、体积物,使用OpenGL ES3.1,所以大部分后期的项处于不可用的状态:灯光只能使用静态灯光,特效的使用也需要非常克制。所以今天的内容主要针对如何使用简单的操作把上述失去的东西弥补回来。
这个场景是我们目前正在做的一个体育类拳击VR游戏场景为例。
这是一张在PC中的效果展示图:
然后下面(右边)这张是去掉HDR效果,使用ES3.1渲染通道的效果图:
通过画面的对比可以看出进入移动端之后:
既然这些效果在进入移动端之后消失,那么我们需要想办法通过别的途径把它加回去。有两种办法,一种做法,是修改图层的渲染通道,这种方法相对麻烦,我们通常使用另一种相对简单的做法。
视觉效果优化-场景
首先讲一下Unreal的渲染途径。
Unreal的静态灯光渲染之后会把场景模型的阴影存放在WholeScene的LightMap,其中有HQ和LQ两种,LQ里面就是我们移动端会用到的LightMap和AO,我们可以将它解析出来,或者通过第三方的三维软件像MAX、Maya之类的拿出来,然后将这些效果加强到材质中的漫反射和自发光里,下图有具体的效果图:
还可以导入一个LightColor参数,方便后期整体调节色彩范围,这是为了弥补失去后期之后没有办法整体调整场景颜色。
下图为视图演示:
然后是角色的皮肤,如何在移动端让角色皮肤显得更真实一点。
视觉效果优化-角色
下图为正常情况下,光线照射到物体上的反射路径:
正常情况下,部分光线会直接反射掉,光线是在物体上有一部分是直接反射掉,那还有另一部分光线会进入到物体内部进行一些计算,然后最后反射到空气中。一般,我们把这种反射称为次表面反射。
我们来看一下在移动端使用不开光的一个效果。
可以看到在移动端即使在使用动态灯光下:
这种方法使用比较广泛,但在VR游戏中用处更大,它不仅可以让皮肤的过渡更合理更饱满,而且可以模拟动态灯光实时的照射,而不需要真正使用动态灯光。
正常情况的灯光模拟是通过芯片进行模拟,这里只是通过统计简单的预积分的原理,简单地把光线在正常情况下的颜色、亮度体现在这张图上。这里相关的信息是光线的入射角度、模型曲率,所以我们只要控制这两个变量,就能得到那个点实际的颜色。
这里通过导入一个材质参数,从外部传入一个我们自己做的模拟灯光的组件,然后再增加一个曲率的参数,然后找到这张图上的点。相当于是自己做的一个模拟灯光的组件,转到刚才那个参数。
下图是在一个球体上实际的效果,暂时没有将曲率的效果体现在上面,只是一个简单光照控制的效果。
下面这张是增加了曲率统计之后的效果,虽然没有动态灯光照射,但通过预积分的处理方式,让人皮肤应该有的光泽过渡和透澈的效果都有体现。用这个方式可以达到一定预期效果,又避免动态灯光损耗掉一些性能。
视觉效果优化-阴影
Unreal中动态物体的阴影效果一般使用调制阴影,级联阴影和胶囊体阴影三种,其中调制阴影,级联阴影必须使用动态灯光才能调制,胶囊体阴影虽然能够使用静态灯光,但对ES3.1效果不是太好,因此准备自行做一个简单阴影系统,通过材质实行。最后实现的效果如下图:
通过球形遮罩,暴露一个拟角色位置的参数,通过球形遮罩实时计算它应该出现的位置和大小,相当于做一个组件,或在需要投影的角色身上做一个参数,然后在扩充函数过程中把位置参数传给刚才的函数,最后就能得到这样的效果。
视觉效果优化-反射
进入ES3.1之后,反射效果不是很理想,因此想通过简单的方法实现反射,但目前暂时没有找到特别合适的方法。
目前采用的方法就是不使用反射,但如果必须使用反射的话,在角色下面放一个重复的角色,然后在你需要反射的地板上增加一个绘制功能,直接去绘制他的透明度。
虽然正常的反射,通过打开动态灯光可以得到一定的增强,但我们这边没有选择打开动态灯光,主要是因为开了动态灯光之后,会让场景处于一个非常不稳定的状态,损失很多性能。我们测试之后发现,可能这种光对性能的损失更小一点,因为我们发现移动端对模型面数的承受力比想象中要稍高一点,而且下面的模型可以将LOD尽量降低一点。
这个方式我们一般推荐在场景比较大的时候使用,比如一整个房间地板做反射。在模型制作的时候把房间做镜像,在美术方面把下面部分做简化,美术在哪边就在哪边进行涂抹。
方法虽然取巧,但实践效果还不错。
视觉效果优化-动态灯光
尽量不要使用动态灯光,虽然动态灯光可以直观提升阴影和反射,但存在很大的不稳定性,因为永远不知道玩家什么时候会进行操作,生成一些粒子,或者动态灯光与其他灯光产生影响。但如果是比如单一的游戏,或者能确定玩家去做什么操作时,可以尝试使用。
视觉效果优化-粒子特效
在制作的过程当中,发现特效粒子占用了很多游戏硬件的性能,该注意的地方为以下几点:
媒体
如果是短暂重复利用的视觉效果可以优先使用粒子,但如果是常期一直占用画面,只是起到一个场景气氛作用的话,可以试着使用一些视频特效,只需要把特效分为黑、白蒙版跟正常特效,在材质中做一个切割,把它变成一个透明的材质。总体来说,它对场景的性能消耗会小一点,此外,它受取消HDR和ES3.1用户端渲染的影响很小。
雾效
除非情况特殊,否则尽量不要使用粒子去模仿雾效,如果需要,可以先建一个蓝图类,然后在蓝图类中去做两个错位之间的移动,去检测本身和角色之间的距离,去调整它的透明度,或者控制他的生命周期。
景深
在VR游戏中用的比较少,一般在远景的时候,如果需要用到景深,把远景变成贴图,在不同距离间做一定的模糊处理即可
帧数优化-分析
帧数的优化,主要在以下四点。Stat unit,Frame 每帧所花费的时间;Game CPU游戏逻辑线程,这个主要和程序相关;Draw CPU渲染线程,是CPU去采取产品中需要渲染的东西他所花的时间;GPU CPU渲染线程,代表实际渲染所花的时长,可以通过在游戏中打出指令,看到底是哪块需要做调整。
帧数优化-DrawCall
帧数优化-DrawCall的影响因素主要在四个方面:首先是模型数量,模型数量太多,会导致性能下降,如果是在较大的场景中,合并需要考虑到物品剔除是否方便;第二个是材质数量,需要确定一个模型中的不同材质会出现多种状况;第三是Actor中的Component数量,我们测出来对Drawcall第二部分有一定影响;第四个是SceneCaptureActor的调用,场景采集一般用于做镜子之类的东西,最好不要调动,万一需要调用,要注意控制生命周期,降低它接触的大小。
帧数优化-Game
在帧数优化-Game的优化上,要尽量少调用敏感程序,比如:Forloop, GetallActorsOfClass, SpawnActor, Tick,会对Game的速度产生影响;在使用资源读表调用的时候没有设置为软引用。
帧数优化-GPU
最后一点是关于帧数优化-GPU ,要考虑着色器的复杂程度。着色器和使用材质有关系,建议使用不透明的材质,优先级高于带蒙版的材质高于使用透明度的材质;还要考虑模型的面数,以及灯光的调用,尽量使用动态灯光,不要使用静态灯光。
基本上就是以上内容,谢谢。
投稿/爆料:tougao@youxituoluo.com
稿件/商务合作: 六六(微信 13138755620)
加入行业交流群:六六(微信 13138755620)
元宇宙数字产业服务平台
下载「陀螺科技」APP,获取前沿深度元宇宙讯息