屏幕后处理特效性能分析—运动模糊

屏幕后处理特效性能分析—运动模糊

运动模糊是常见的游戏特效,不仅可以让高速运动的物体看起来很真实,也能让游戏中的运动画面更柔和平滑。不少开发团队为了实现运动模糊的效果使用了AmplifyMotion插件。那么该插件在移动端表现如何呢?今天我们就结合真机测试结果给大家分析下这款插件在性能上的利弊。

这是侑虎科技第44篇原创文章,感谢作者冯乐乐供稿。欢迎转发分享,未经作者授权请勿转载。同时如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。(QQ群465082844)

作者GitHub:https://github.com/candycat1992


UWA Tech Doc
地址:https://www.assetstore.unity3d.com/en/#!/content/4243

版本要求:
Unity 4.6.8及以上,推荐使用Unity 5.x 版本

硬件要求:
移动终端的GPU支持深度纹理(GL_OES_depth_texture)

AmplifyMotion的使用非常简单,我们只需要在场景中选中要添加运动模糊特效的Camera,点击Component->Image Effects->Amplify Motion为摄像机添加组件即可。如下图所示:
UWA Tech Doc

AmplifyMotion提供了一系列参数:

● Quality Level:共有四种等级,Mobile、Standard、Standard_SM3和Soft Edge_SM3,画面效果依次增强,但计算量也逐渐增大。对于移动设备一般选择Mobile等级。

● Auto Register Objs:AmplifyMotion的原理是为所有需要运动模糊的物体添加一个AmplifyMotionObject脚本。当勾选了该选项后,AmplifyMotion会为场景中的所有合适的物体(指那些含有MeshRender、SkinnedMeshRenderer或ClothRenderer的物体)自动添加AmplifyMotionObject脚本,把它们全部加入到运动模糊的计算中。我们可以选择不勾选该选项,然后在编辑器里为需要的物体添加AmplifyMotionObject脚本。当需要在运行时刻加载新的物体时,可以使用AmplifyMotionEffect.Instance或AmplifyMotionEffect.Instance.UpdateActiveObjects接口来把这些新的物体添加到运动模糊的计算中。

● Overlay Cameras:当游戏画面需要使用多个摄像机分层渲染时(例如制作FPS游戏),我们可以使用该选项避免某些摄像机的画面受运动模糊的影响。

● Culling Masks:允许用户决定哪些渲染层会受运动模糊的影响。

● Quality Steps:定义了模糊时使用的采样数目,数值越大,模糊程度越大,但也会大大影响性能。推荐使用的数值范围是1~3。

● Motion Scale:定义了真正的运动程度,可以直观地理解成运动模糊会把多少张连续图像加入计算中。下面两张图片分别对应了Motion Scale值为3和10的效果:
UWA Tech Doc

● Camera Motion Multiplier:如果把该值设成0就可以消除由于摄像机运动造成的模糊,但同时可以保留其他物体运动造成的模糊。

● Minimum Velocity:运动模糊的原理之一是根据物体的运动速度来决定模糊大小。该值定义了加入到运动模糊计算所需要具有的最小速度值,所有速度低于该值的物体不会产生运动模糊效果。

● Maximum Velocity:对应上面的Minimum Velocity,该值定义了加入到运动模糊计算所需要具有的最大速度值,所有速度高于该值的物体不会产生运动模糊效果。

● Depth Threshold:定义了运动模糊效果的深度阈值,范围在0~1之间。

● Work Threads:定义了用于SkinnedRenderer物体线程数目。当该值为0时,AmplifyMotion会使用一半可用线程。大多数情况下,设为1就足够了。

● System Thread Pool:当勾选了该选项后,AmplifyMotion会使用Unity的线程池,否则就会使用自己的线程池。这在特定的设备上(如主机平台)可以避免一些问题,例如在AmplifyMotion 1.5版本中,如果自定义的线程池无法初始化AmplifyMotion,就会自动使用系统线程池。

● Debug Mode:当勾选了该选项后,我们就可以看到当前场景的运动矢量图,以便于进行调试。一个运动矢量图如下图所示:
UWA Tech Doc


注意事项

1、对于使用SkinnedMeshRenderer或ClothRenderer的物体,需要开启Read/Write选项才可以正常工作。

2、不直接支持半透明物体。如果它们周围有其他运动的不透明物体,这些半透明物体也会被模糊,但它们自身的运动不会产生运动模糊的效果。

3、出于性能的考虑,应该只为那些重要的、快速运动的物体添加AmplifyMotionObject脚本。其他静止的或运动速度较低的物体可以直接依靠摄像机运动造成的模糊即可。这点对性能很重要,尤其是对于一些低端设备。例如,在下面的场景里,我们只为四个高速旋转的Cube手动添加了AmplifyMotionObject脚本(在Scene视图中这些物体会显示一个绿色的方块),而静止的墙壁则不需要添加,但当摄像机运动时墙壁也会因此而有模糊效果。
UWA Tech Doc


真机测试

手机:三星 Galaxy S4, iPhone 6
测试场景:上图所示的简单场景,为4个正方体的添加了AmplifyMotionObject脚本,Quality Level等级选择最低等级Mobile。

三星Galaxy S4使用插件后的Profiler截图:
UWA Tech Doc
UWA Tech Doc

iPhone 6使用插件前后的GPU Report(Xcode)
使用前
UWA Tech Doc

使用后
UWA Tech Doc


分析

从Graphics.PresentAndSync可以看出GPU渲染压力还是很大的,即便场景如此简单帧率还是受到了很大影响。Graphics.PresentAndSync是指主线程进行Present时的等待时间和等待垂直同步的时间,详情大家可以参考我们之前的文章:扒一扒Profiler中这几个占坑鬼。

总体来讲,AmplifyMotion是一款功能比较完备的运动模糊插件,但在移动设备尤其是安卓设备上性能不尽如人意,而且需要使用多张RenderTexture。对于手游来说,可考虑在高端iOS机上选择使用该插件实现运动模糊效果。