UE4 /UE5 PC/安卓优化

一、概述

       UE4/UE5场景中的资源越多,消耗的内存就越大,就会越卡顿。这里教大家如何进行场景优化,来减少内存,使得场景更加流畅。

二、模型优化

   2.1、使用3Dmax或者Maya制作的模型,面数最好不要太多,虽然UE4/UE5能支持百万级的面数,但是能减少的面数尽量减少,不需要的部分能删除就删除。

  2.2、材质ID,在Max或者Maya里面,一个模型材质过多的话会分配材质ID,但是在UE4里面如果材质过多,会加大渲染消耗资源。所以在UE里面如果模型简单的话尽量用一个材质解决。

  2.3、这个跟程序设计师有关,模型的坐标一定要在模型中心点的位置,这样后面做交互会更加方便一点。

  2.4、光照贴图和阴影贴图:在往UE4里面导入物体的时候我们一定要记住我们这个物体要有2UV,顾名思义就是两套UV 第一套UV我们是存放光照贴图的,第二套就是存放我们的阴影贴图的。这个在UE里面了则是UV0和UV1表示,默认的就是UV就是1,以及我们光影贴图的分辨率大小也是2的次幂。 

三、灯光优化

  3.1、Lightmass Importance Volume:大场景,不添加则全局构建光照贴图产生全局Indirect Lighting Cache;添加则在指定区域构建光照贴图Indirect Lighting Cache;

 3.2、点光源和聚光灯尽量不要开启Cast Volumetric Shadow;默认只有平行光开启了此选项。开启后的性能消耗为不开启的性能消耗三倍。不开启表示阴影计算方式使用Shadow Mapping,开启表示使用Shadow Volume,前者的阴影计算没有后者精准,但是计算量小;

 3.3、大气雾如果开启体积雾,建议将灯光改成静态光,这样在Build Lighting时会生成预计算的体积雾相关数据,这样可以显著提升体积雾性能。体积雾性能消耗巨大。

 3.4、静态光不用时禁用Static Lighting 

3.5、关闭Support Global clip plane for Planar Reflections,默认关闭,开启后消耗巨大。

 3.7、Ambient Occlusion开启之后,如果是动态光的情况下会消耗资源,开启AO后(Project Settings -> Rendering -> Default Settings ->Ambient Occlusion),引擎默认的AO为SSAO(Screen Space Ambient Occlusion), SSAO无法进行预计算,所以GPU性能开销较大,可以修改为DFAO(Distance Field Ambient Occlusion)以提升性能,因为DFAO可以预计算,代价是增加显存开销;

 四、材质优化

  4.1、材质的复杂度不宜过高,尽量少使用半透明材质,会很消耗资源,材质类型的性能,从快到慢:Opaque -> Masked -> Translucent。

  4.2、材质使用时要提前规划好,相同材质的物体公用一个材质,尽量避免从网上下载的多个材质,每个都用一遍,提高复杂度。

五、植被优化

  5.1、在场景中有大量的植被时,可以使用HierarchicalInstancedStaticMesh进行优化,这样可以减少CPU的开销,因为使用HierarchicalInstancedStaticMesh,可以减少draw call次数,要想场景做到更好的优化,最好的办法是需要减少材质种类,提高材质复用率

  5.2、 为Instanced Mesh设置合适的Cull Distance。

六、碰撞优化

 6.1、在模型制作的所有的模型不需要碰撞,如果是加了碰撞,在引擎里移除碰撞。

 6.2、BoxComponent的 Generate Overlap Events 设置为false。如果不需要Overlap事件,那么就将该属性设置设置为false,默认为true。当BoxCompont达到一定量级时,开启Generate Overlap Events的性能消耗是关闭情况下的两倍。

 6.3、 不需要物理,将 Simulate Physics 设置为false。

 6.4、 不需要Hit事件,将 Simulation Generates Hit Events 设置为false。

 6.5、如果场景中物体类型(WorldStatic、WorldDynamic、Pawn等)很多,且每种数量也很多,则Collision 的 Object Response 通道设置的越少越好,把可以设置为 Ignore 的通道都设置为 Ignore 。如果场景中的物体类型比较单一,即使这种类型的物体在场景中有数百个,Object Response 即使都设置为Block 或者 Overlap,对性能也没有影响。

七、阴影优化

  7.1、Directional Light:Dynamic Shadow Distance(默认为0,表示关闭)。提升性能的原因:Dynamic Shadow Distance 表示在多少距离内使用动态阴影,超过这个距离之外Fade成静态阴影,而Fade成静态阴影后就可以提升性能。

八、UI优化

  8.1、游戏线程优化

    1.GridPanel会遍历所有的ChildWidgets,r然后计算Draw Elements,最后Grid Panel返回一个或者多个Draw Elements进行渲染,如果是是一个复杂的控键数,这个开销也是比较大的。解决的办法是使用Invalidation Box缓存Draw Elements (Vertex Buffer),用Invalidation Box封装GridPanel。

 

这个有一点需要注意的是一个Volatile的概念,如果标志成Volatile的Widget每帧都会重新计算,一些属性的Widget Binding会使得Widget变成Volatile,Check Box放在Invalidation Box下会不起作用,需要设置成Volatile,建议自定义User Widget,用Button实现对应功能。

可见性:HitTestInvisible 可见、当前控件不可点击、所有子控件不可点击,SelfHitTestInvisible 可见、当前控件不可点击、不影响子控件,Hidden 不可见、占用布局空间,Collapsed 不可见、不占用布局空间。

 果大量的Visible会导致点击响应太慢,这个也会消耗很大的性能,Button设置成Visible,其它Widgets可以设置成Self Hit Test Invisible或Hit Test Invisible,Collapsed不占用布局空间, 略优于Hidden,Show/Collapse要优于AddToViewport/RemoveFromViewport。

这里还要讲一个是Widget Binding,某些属性上Widget Binding会导致对应Widget被放入Volatile List,这些属性发生变化,表示对应的控件需要重新计算Vertex Buffer,所以我们尽量避免这个Widget Binding。另外还有一点是Widget Binding会每帧Tick执行,这一点也会带来比较大的性能开销,所以手机上面建议使用C++ Event设置Widget属性。

 8.2、渲染线程优化

渲染线程优化,渲染线程首先介绍一个合并批次,我们在左图看到的是UI的有些可以合并批次,有些不可以合并批次,像不合并批次Canvas Panel、合并批次Grid Panel、Uniform Grid Panel、Vertical Box、Horizontal Box。

 Retainer Box,将UI渲染到Render Target,再将Render Target 渲染到屏幕,另外引擎处理了点击响应区域的映射,鼠标点击区域引擎已经自动在屏幕上面映射了相应的测试。

Widget Render:将UI渲染到Render Target,Slate Render: 使用缓存的Render Target渲染Back Buffer,每隔3帧一个循环进行Retainer Box的更新,将1帧的UI渲染工作量分配到3帧去处理。

九、程序优化

       蓝图的话其实在大多数情况下性能都是没有问题的,但是如果我们要在低端机上面需要追求很好性能的话,其中有计算量比较大的逻辑,我们是不建议放在蓝图里面做,因为毕竟中间有很多的分装,建议可以把一些计算量比较复杂的逻辑下放在C++里面做,运行效率比蓝图高,更灵活,很多C++接口并未开放成蓝图接口,除了UI动画,其它代码都能用C++实现。

对于UI开发,我们建议开发者有Widget Manager,可以在蓝图中,也可以在C++中,就是管理所有User Widget,Brush、Font等资源也可以在Widget Manager中统一管理,这样的项目比较好管理,特别是UI比较多的时候。

对于3DRTT,这个小技巧并不需要每帧Tick,只要和动画频率大致同步就可以,所以我们要把每帧去渲染的两个选项关闭,同时这个蓝图我们设置成0.03秒Tick一次,产生在蓝图当中Tick这样的RTT,另外还有一个小细节就是Render Target的尺寸不要太大,会影响显存和渲染效率。

猜你喜欢

转载自blog.csdn.net/qq_43021038/article/details/127314100