规则解读(四)| 本地资源检测 For Unreal

规则解读(四)| 本地资源检测 For Unreal

在UWA推出的适用Unreal项目的本地资源检测版本中,研发团队可以将其作为规范和完善项目资源品控流程的重要一环,添加到Unreal项目的研发持续集成、持续交付流程中,实现本地资源检测的“资源场景全覆盖,一键式自动扫描”。

《规则解读(三)| 本地资源检测 For Unreal》中,我们 为大家介绍了Unreal版本地资源检测的部分规则。本文中,我们将针对“全局设置检测”模块中剩余的规则,为大家进行讲解。

Part1、移动端动态光照数量上限超过阈值

在Unreal中,从光源的移动性上,一般可以分为“静态”、“固定”和“可移动”三类。

1. 静态光源
顾名思义,是在运行时完全无法更改或移动的光源。简单理解,在使用静态光源时,场景中各种光照效果会在项目运行前完成各种计算和阴影烘焙,在项目运行时就直接使用存着光照信息的光照贴图,不会对性能有进一步的影响。所以很适合静态物体的阴影效果表现。

但面对场景中的移动对象时,就会出现“没有影子”或“人走了,但影子留在原地不动”的情况,在画面表达效果上出现违和感。所以在使用上存在比较明显的局限性。

在三种光源的可移动性中,静态光源的质量中等、可变性最低、性能成本最低。适用于移动平台上的低性能设备。

2. 固定光源
是保持固定位置不变的光源,但可以改变光源的亮度和颜色等。简单来讲,固定光源可以在一定程度上,满足场景内移动对象的实时阴影效果需求。在固定光源中非“动态Actor”的光照计算(间接光照)都是像静态光源那样提前处理好并放在光照贴图里,所以在项目运行时对性能造成的影响也会比较小。

在三种光源的可移动性中,固定光源一般拥有最好的品质、中等的变化程度以及中等的性能开销。

3. 可移动光源
可移动光源能够投射完全动态的光照和阴影,并且可以修改位置、旋转、颜色、亮度、衰减和半径等所有属性。与静态、固定光源不同,可移动光源下的各种光照效果都是在项目运行时实时计算的,所以在带来更好的动态光影效果反馈的同时,也会对项目运行造成极大的压力。

场景内每一个可移动光源都会对范围内所有对象的光影效果进行独立的实时计算,所以场景内可移动光源数量越多,移动对象的实时光影效果就越复杂,相关的计算需求就会越高,导致项目运行时的压力也会越大,进而极大影响项目的运行表现。

所以UWA设立本条规则,提醒团队在项目开发时,要注意场景内光源的合理使用。在Unreal中,“最大可移动聚光源/点光源”的选择范围为0~4。团队在使用UWA本地资源检测时,可以通过阈值设置,设定符合项目需求的阈值。

Part2、设置开启了天空大气高度雾

Unreal的“天空大气”组件是一种基于物理的天空和大气渲染技术。它相当灵活,可以创造类似地球的大气层,同时提供包括日出和日落的一天时间,还可以创造奇特的外星大气层。它还提供空气透视,从中可利用相关行星曲率来模拟从地面到天空再到外太空的过渡。


在Unreal官方文档中,这张图很好地展示了这种效果

通俗地说,就是可以模拟出现实中,我们在地面抬头仰望寰宇、在卡门线低头俯瞰地球时的各种天空气象效果。

而“指数高度雾”组件,概括地讲,可以模拟现实中那种朦胧的雾霭现象。而且在地图上较低位置处密度较大,而在较高位置处密度较小。其过渡十分平滑,随着海拔升高,也不会出现明显切换。

在开启“支持天空大气影响高度雾”后,“天空大气”组件会影响“指数高度雾”的表现效果。此时,项目运行时会产生相当大的计算量和性能压力。

项目勾选“支持天空大气影响高度雾”,虽然能带来更为拟真的环境表现效果,但同时也产生了额外的采样/纹理绑定的开销。所以团队要注重平衡展示效果和性能表现之间的关系。

Part3、设置中未关闭“支持平面反射的全局剪切平面”

在之前的《规则解读(三)| 本地资源检测 For Unreal》内我们提到:Unreal中,“反射”相关的功能和设置,是模拟现实世界中的光学现象的重要组成部分。

在实际运用中,在物体表面实现镜面效果,是项目中较为常见的需求。比如玻璃对物体的反射,或者大面积水域对周遭环境的倒映。最简单的情况下,通过为对象添加镜面材质,就可以在项目中实现默认的屏幕空间镜面反射。

如果相关物体不在镜头的视锥范围内,那么有些物体就不会在镜面中被正常显示出来。在一些高标准的项目中,团队为了避免这类不符合现实逻辑的情况,就会选择开启“支持平面反射的剪切平面”,用更高阶的相关设置,来实现更清晰、更真实的反射效果。


左侧为简单镜面材质,右侧添加了反射平面

此时项目就会产生相当高的额外计算和性能开销,给项目的运行带来压力。而且不管项目中是否真的使用到了平面反射,这部分开销都会因选项的开启而存在。

所以在本条规则检测后,项目团队要仔细考量平面反射的需求和项目整体开销,在必要时进行取舍。

Part4、移动端设置开启了MSAA且倍数较大

玩家之所以能看到“游戏世界”,通俗地讲,是因为Unreal等开发工具会通过项目内的摄像头捕捉到当前视域内的各种信息(比如是山是海,是方是圆,是红是绿等),这些信息会经过一系列的处理后,最终变成一张指定规格的画,呈现在电脑或者手机屏幕上,为玩家展示出虚拟世界内的具体画面。

这一系列的处理步骤,包含了集合处理、光栅化、像素处理等众多过程,有兴趣的话可以通过计算机图形学相关知识去仔细了解。当中有个很重要的过程,就是像素采样。

简单来说,系统会在由一个个像素块构成的“原画”上,找到相关像素,填充到对应位置上的一个个小三角面片里去,实现最终画面的“上色”。

此时当三角形面片边缘位置的像素块的中心在三角形面片区域内,那么整个像素块就会被画进去;反之,其中心不在面片区域内,对应像素块就会被舍弃。


三角面片涉及到的像素区域中,有部分像素被舍弃

如此一来,“上色”完成后的三角形面片,其展现出的,并不是一个涂满颜色的三角区域,而是一个带有明显横竖边缘的类似品字形的区域。而由一个个小三角形面片组成的最终画面里的人物、环境道具等,其边缘就不是柔和的线条,而是会出现这种棱角分明的锯齿状边缘。

在一些画面细节要求较高的项目内,这种“锯齿化”会很明显对画面的展示效果造成负面影响。所以就有了“抗锯齿”的需求。简单的做法是在“A——采样——B”时,先进行“A——采样——N倍B大小”,然后再压缩到B的规格。


更趋向于一个金字塔结构,最终压缩后就能更加拟合三角面片

这种“不要就扔,撑大压缩”的做法其实相当简单粗暴,适用范围也会比较局限。所以在Unreal等开发工具内,会用更多、更好的算法,来对采样过程进行优化,使得画面内人、物、景等的边缘更为柔和自然,从而带来更好的表现效果。

MSAA(多重采样抗锯齿)就是很普遍的做法。其具体原理可见相关的知识资料,在此我们就将其简单概括为“在同一区域内,用更多的采样点,得到更符合当前区域的采样结果”。

如果是“单个像素单个采样点”,那么当三角面片未覆盖到这个像素的采样点时,这个像素区域就被简单判定为“不要”。

而使用MSAA,那么当一个像素点内有部分采样点被覆盖在三角面片内,Unreal等开发工具就会基于这个像素点中被覆盖的采样点数量,计算得出一个数值,可以简单理解为“按原来想要的颜色的百分比,调出个新的颜色涂上去”。

如此,对象的边缘区域在展示效果上就会显得更为平缓顺滑,整体画面中人、物、景相互之间会更为和谐,割裂和突兀感能明显下降。当然,以上只是简单示意,MSAA的实际使用还是建议大家通过相关资料去仔细了解。

不过采样点数量的上升,也就意味着最终在处理时,会成倍地加大计算量和内存占用,为画面的渲染带来更大的压力。这一点在移动设备上,由于运行平台本身性能的限制,项目MSAA的启用对项目运行时带来的压力也就会更明显。

所以建议项目团队要仔细斟酌项目性能压力和项目表现效果之间的关系,慎重决定是否要开启移动端MSAA,并通过对本条规则的阈值修改,及时发现不合理的MSAA倍数设定。

Part5、设置中未开启遮挡剔除

项目在运行时,最终展现在玩家面前的,其实是项目中相机在指定方向的一个锥形视觉区域。排除部分特殊的需求外,比如透视、声波反射、击穿物体等,在模拟现实光学的条件下,被不透明物体挡住的区域,在画面效果呈现上,就是不可见的,不会对展示效果带来正面的影响。


除非换个角度,不然呈现在玩家面前的,就是只有一个立方体

这种情况下,最经济、最合理的方式,就是在项目运行时,直接就不加载、不计算不可见区域内的那部分对象。

所以Unreal提供了“遮挡剔除”的选项,可以在项目运行时,剔除掉不可见区域内的网格体,不对其进行渲染,从而节省下相应的内存和性能开销,降低项目运行压力。

Part6、设置关闭了TextureStreaming

在之前的《规则解读(一)| 本地资源检测 For Unreal》中,我们简单提到过“纹理流送”(Texture Streaming):这是Unreal在纹理处理时的一种机制——基于纹理的Mipmap技术,为了优化Texture对于内存的占用而存在。

对于生成了Mipmap的纹理,Unreal会根据一套规则来计算纹理资源所需要的理想的Mipmap层级,结合内存池的大小,来对纹理进行动态流式送入、送出内存的操作,这样就避免了纹理的所有Mipmap都进内存。

而关闭了“纹理流送”,意味着纹理所有的Mipmap就会像俄罗斯套娃拆开一样,一股脑全塞进缓存池中,从而占据大量内存空间,进而影响项目性能。

所以除部分特殊需求外,建议项目团队保持“纹理流送”功能的开启。

以上,便是对“全局设置检测”模块中剩余部分规则的讲解,希望能对大家在Unreal项目的本地资源检测使用带来帮助。Lua模块内的各项规则,在使用上,与Unity版本地资源检测的相关规则类似,大家直接查看之前的相关文章即可了解,在此就不再赘述。

未来,我们会继续持续更新和完善Unreal版本地资源检测的功能和使用体验,力争为广大项目团队在项目开发上带来更大帮助与推动。