[UE4]性能优化指南(程序向)

零散记录

  1. GPUProfile来统计性能消耗的时候,在editor模式下不是很准,因为编辑器的消耗也算进去了,如果要用,最好以Game模式来查看。
  2. UE4不支持640X480的分辨率,如果在这个分辨率下运行程序,会导致程序崩溃(4.4版本,不知最新版本是否仍有此问题)。
  3. 如果角色身上有很多Component需要Attach,尽量在使用时Attach,不要一加载就全部attach,否则当场景中角色很多时,会有严重性能问题。
    比如:场景中有几百个角色,但不是每个角色都需要摄像机和弹簧臂,那么在构造函数中就不要创建摄像机和弹簧臂组件。
  4. 面数对UE4来说不敏感,即使在移动端。ipad 4上,50万的三角面,也能够以30fps帧率稳定运行,移动端主要对贴图大小、材质复杂度较为敏感。
  5. 地形编辑时,使用Instanced Static Meshes。Intancing会增加GPU的开销,但是可以显著降低CPU的开销。注意:Instancing不会减少CPU draw call次数,要减少draw call次数,需要减少材质种类,提供材质复用率。
  6. C++ 比 蓝图快100到1000倍
    [Test] Blueprint vs C++ Performance vs Nativized BP
    https://www.reddit.com/r/unrealengine/comments/6qtxy3/test_blueprint_vs_c_performance_vs_nativized_bp/
  7. 开启Occlusion Culling (Project Settings -> Engine -> Rendering -> Occlusion Culling,默认已开启)。如果需要强化遮挡剔除的力度(代价是剔除效果比较突兀)以提升渲染效率,将以下属性值增大:
    Min Screen Radius for Lights
    Min Screen Radius for Early Z Pass
    Min Screen Radius for Cascaded Shadow Maps

灯光优化

  1. 3种光源的性能消耗从低到高:
    定向光/平行光(Directional Light) < 点光源(Point Light) < 聚光灯(Spot Light)。
    这个标准不局限于UE4,其他引擎也是这样。当光源数量在场景中达到一定量级时,3种灯光的性能差距也是数量级上差距。
  2. 在建构光照贴图时,若场景中没有给予Lightmass Importance Volume,会对整个场景做间接光照的采样,产生Indirect Lighting Cache,这对大型游戏场景是相当的浪费,像是游戏角色到不了的中、远景不需要产生Indirect Lighting Cache,这时候就可以在场景中置入Lightmass Importance Volume,指定特定区域内才会产生Indirect Lighting Cache,节省不少建构光照的时间。
  3. 点光源和聚光灯尽量不要开启Cast Volumetric Shadow。开启后的性能消耗为不开启的性能消耗三倍。
  4. 如果开启体积雾,建议将灯光改成静态光,这样在Build Lighting时会生成预计算的体积雾相关数据,这样可以显著提升体积雾性能。体积雾性能消耗巨大。

阴影优化

  1. 如果使用了Stationary Directional Light,场景中有大量单位时,一定要开启Dynamic Shadow Distance StationaryLight(默认为0,表示关闭)。
    测试用例: 500 个 Actor 同屏,摄像机高度4000,DirectionalLight 的属性Dynamic Shadow Distance StationaryLight的值要大于摄像机到Actor的直线距离(注意:是到每个Actor的直线距离,所以值尽量要设置的大一些,比5000),否则帧率从200 fps 下降到 100 fps。
    Dynamic Shadow Distance StationaryLight开启后能提升性能的原因:
    Dynamic Shadow Distance StationaryLight 表示在多少距离内使用动态阴影,超过这个距离之外Fade成静态阴影,而Fate成静态阴影后就可以提升性能

材质优化

  1. 材质类型的性能,从快到慢:Opaque -> Masked -> Translucent。
  2. 若场景中有大量单位,比如500个,那么这些单位一定要做材质LOD,并尽可能多的去掉半透明材质(比如在最后两级直接去掉半透明效果),否则性能消耗呈指数级增长。

Performance Guidelines for Artists and Designers
https://docs.unrealengine.com/latest/INT/Engine/Performance/Guidelines/

物理与碰撞优化

  1. BoxComponent的 Generate Overlap Events 设置为false。如果不需要Overlap事件,那么就将该属性设置设置为false,默认为true。当BoxCompont达到一定量级时,开启Generate Overlap Events的性能消耗是关闭情况下的两倍。
  2. 如果不需要物理,将 Simulate Physics 设置为false。
  3. 如果不需要Hit事件,将 Simulation Generates Hit Events 设置为false。
  4. 如果场景中物体类型(WorldStatic、WorldDynamic、Pawn等)很多,且每种数量也很多,则Collision 的 Object Response 通道设置的越少越好,把可以设置为 Ignore 的通道都设置为 Ignore 。如果场景中的物体类型比较单一,即使这种类型的物体在场景中有数百个,Object Response 即使都设置为Block 或者 Overlap,对性能也没有影响。
  5. 如果是大型RTS游戏,场景有海量单位时(比如星际2中大规模的虫族小狗),能不用UE4的 Collision 就不要用 Collision,否则帧数狂泻。
    建议自己实现一个简易的自定义Collision,比如球形Collision,然后计算该 Collision 与单位之间的直线距离,来判断是否是否发生了碰撞,并且降低检测间隔,比如 0.1秒一次。

动画优化

  1. 打开角色蓝图 -》 MeshComponent -》 Detail 面板中的 Optimization 类别下 -》 勾选 Enable Update Rate Optimizations
  2. 只对渲染的 SkinnedMesh执行 Tick 和 RefreshBoneTransforms
    USkinnedMeshComponent::MeshComponentUpdateFlag = OnlyTickPoseWhenRendered;
    默认是AlwaysTickPoseAndRefreshBones,表示不管是否被渲染(在可见区域内),都执行 Tick 和 RefreshBoneTransforms。
    旧版本中MeshComponentUpdateFlag叫做SkinnedMeshUpdateFlag

    如果关闭动画Tick,和Tick相关的逻辑就会失效,比如Transform (Modify) Bone
  3. 动画蓝图的逻辑尽量直接访问成员变量,引擎默认开启了优化选项:动画蓝图中的成员变量在编译时会被复制到Native Code中,从而避免在运行时进入蓝图虚拟机(Blueprint Virtual Machine)执行蓝图代码,因为蓝图VM运行效率低。
    默认会被编译优化的参数类型包括:
    member variables;
    negated boolean member variables;
    members of a nested structure;
    具体说明见官方文档:
    Animation Optimization
    https://docs.unrealengine.com/en-us/Engine/Animation/Optimization
    Animation Fast Path Optimization
    https://docs.unrealengine.com/en-us/Engine/Animation/Optimization/FastPath

UI优化

  1. 能用HUD解决的就不要用UMG,等到需要显示时才创建Widget对象,不显示时则销毁,UMG对象较多时性能消耗巨大。
    比如场景内有一千个单位,每个单位上都创建有WidgetComponent,即使这些WidgetComponent没有显示任何东西,也会产生巨大的GPU开销。

Epic Games工程师分享:如何在移动平台上做UE4的UI优化?
http://youxiputao.com/articles/11743

位移优化

  1. 海量Pawn(比如500个)单位移动,如果是在 Tick 中使用 AddMovementInput 移动,帧率直接下降一半(比如从90帧下降到40多帧)。对于无法移动的单位,最好停止执行 AddMovementInput() ,以提升性能。

特效优化

  1. 尽量不要使用 Volume domain,使用后会显著增加GPU开销。可以通过 profilegpu 检测 Volume 开销。

AI优化

  1. 如果角色不需要 Controller ,就不要给它 Spawn Controller。如果一个角色长时间停止,则先给他Unpossesed() ,等到可移动时再PossessedBy()
    测试:500个角色,AI Controller Class 设置为:null、 AIController、PlayerController 的帧数分别为 120 fps、 100 fps、75 fps。

Dedicated Server优化

  1. 服务端cook时剥离动画数据
    Project Settings -> Engine -> Animation -> 勾选 Strip Animation Data on Dedicated Server.
    如果在动画中添加了触发修改数据的 Notify Event,勾选此选项会有问题。请确保动画中挂载的 Notify 只是表现相关,不涉及游戏逻辑。
  2. Server模式下禁用角色物理模拟
    FBodyInstance->bSimulatePhysics 设置为false。默认为false。
    SkeletalMeshComponent::bEnablePhysicsOnDedicatedServer 设置为 false , 默认为 true 。但这样会导致物理验算以客户端为准,有被外挂hack的风险。bEnablePhysicsOnDedicatedServer 在 run-time 修改不生效。
  3. Server模式下禁用 Collision
    UPrimitiveComponent->bGenerateOverlapEvents 设置为false,角色蓝图中的 CollisionComponent 默认为true。
  4. Server模式下Detach角色身上所有的装饰性组件

参考资料

通过优化在UE4中实现良好性能和高质量视觉效果
http://gad.qq.com/program/translateview/7160166

CPU Profiling
https://docs.unrealengine.com/en-us/Engine/Performance/CPU

GPU Profiling
https://docs.unrealengine.com/en-us/Engine/Performance/GPU

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/432224.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

武汉大学2013年数学分析考研试题参考解答

来源 [尊重原有作者劳动成果] 一&#xff1a; 1&#xff1a;解&#xff1a;\[\because \underset{x\to 0}{\mathop{\lim }}\,\ln (1x)x\] \[\therefore \underset{x\to 0}{\mathop{\lim }}\,\frac{\sqrt[n]{1x}-1}{\ln (1x)}\underset{x\to 0}{\mathop{\lim }}\,\frac{\sqrt[n]…

[UE4]性能优化指南(美术向)

参考自官方文档&#xff1a; Performance Guidelines for Artists and Designershttps://docs.unrealengine.com/en-us/Engine/Performance/Guidelines 但是官方文档写的太粗燥&#xff0c;对UE4没有一定了解&#xff0c;很难理解文档的意图。这里我在官方文档的基础上&#x…

HTTP协议中返回代码302的情况

http协议中&#xff0c;返回状态码302表示重定向。 这样的情况下&#xff0c;server返回的头部信息中会包括一个 Location 字段&#xff0c;内容是重定向到的url 转载于:https://www.cnblogs.com/mengfanrong/p/4059628.html

UE4 Fix – “Lighting build failed. Swarm failed to kick off.”

Hello! Have you encountered the “Swarm Failed to Kick Off” error on an Unreal Engine project when trying to build a level? I did, after we switched to a custom engine build. Since most of the resources on the web were not helpful. Here’s a really simpl…

贪吃蛇 WPF

贪吃蛇 WPF using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Threading; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Wind…

Linux修改开机启动logo

默认开机LOGO会在液晶屏的左上脚显示一只小企鹅&#xff0c;分辨率为80*80&#xff0c;具体在kernel/drivers/video/logo下会有logo_linux_clut224.ppm这幅图像&#xff0c;程序会根据这幅图像生成logo_linux_clut224.c和 logo_linux_clut224.o两个文件&#xff0c;最终将小企…

sqlite3使用简介(内含解决sqlite内存的方法)

一&#xff0e;使用流程 要使用sqlite&#xff0c;需要从sqlite官网下载到三个文件&#xff0c;分别为sqlite3.lib&#xff0c;sqlite3.dll&#xff0c;sqlite3.h&#xff0c;然后再在自己的工程中配置好头文件和库文件&#xff0c;同时将dll文件放到当前目录下&#xff0c;就完…

动态更新纹理

1. 创建C类继承自AStaticMeshActor 2. 定义用于渲染队列的数据结构 struct FUpdateTextureData {FTexture2DResource* Texture2DResource;FUpdateTextureRegion2D* UpdateTextureRegion;uint8* DynamicColors;int32 w; }; 3. 增加成员变量 UMaterialInstanceDynamic* mDynam…

阿旺wifi智能系统源码

系统简介本系统适合DD-WRT固件路由器和OoenWrt固件路由器或者任何带有WIFIDOG插件的路由器。系统基于ThinkPHP框架PHPMySQL的技术开发。系统主要功能: 1.无密码认证&#xff1a;只点击按钮或强制看广告1.验证码认证&#xff1a;招待券认证、一次性账号、指定时间限制3.用户名密…

动态更新纹理闪烁问题

1. 模型旋转角度尽量取整数&#xff0c;保证线条不会出现锯齿 2. 修改反锯齿模型为FXAA方式&#xff0c;默认的TemporalAA方式会闪烁 3. 动态更新的纹理尺寸一般都不会是2的N次方&#xff0c;比如401X518。 解决方案是 动态更新一张1024x1024的贴图的其中401X518&#xff0c;…

warning C4828问题的处理

warning C4828: 文件包含在偏移 0x215 处开始的字符&#xff0c;该字符在当前源字符集中无效(代码页 65001)。 (编译源文件 XXXXXXcpp) 这提示是由于字符集的问题导致&#xff0c;解决方案如下 点击VS2017 文件->另存为->编码保存->65001 然后重新编译,警告问题解决…

OC中description、 SEL、类本质、self和super用法

一&#xff1a;description方法 description有对象方法和类方法两种&#xff0c;&#xff08;是NSObject类的方法&#xff09;1&#xff0c;-description&#xff08;对象方法&#xff09; 使用NSLog和%输出某个对象时&#xff0c;会调用对象的description方法&#xff0c;并拿…

修改场景默认pawn的方法

playstart方法 1. 放置playstart到场景中 2. 修改world settings的GameMode 直接放置pawn方法 1. 放置pawn到场景中 2. 修改world settings的GameMode 3. 修改pawn的Auto Possess Player为Player 0

lecture3-线性神经元和算法

Hinton第三课 这节课主要是介绍NN的输出端常用的神经元&#xff0c;然后重点是说明怎么使用BP来计算偏导数&#xff0c;在Hinton这一课中&#xff0c;他提供了他1986年参与写的《并行分布处理》一书的第8章&#xff0c;49页&#xff0c;这本书的编者是当你的认知神经界的Rumelh…

ubuntu开机出现错误“Error found when loading /root/.profile”解决

在刚修改完root权限自动登录后&#xff0c;发现开机出现以下提示&#xff1a; Error found when loading /root/.profile stdin:is not a tty 解决方法&#xff1a;在终端中用命令gedit /root/.profile&#xff0c;打开文件后找到“mesg n”&#xff0c; 将其更改为“tty -s …

DropBox 超实用的免费文件网络同步、备份、分享工具

http://www.iplaysoft.com/dropbox.html DropBox 就是一款非常好用的免费网络文件同步工具(当然它也算是一个服务)。当你在电脑A使用DropBox时&#xff0c;指定文件夹里所有文件的改动均会自动地“同步”到DropBox的服务器&#xff0c;当下次你在电脑B需要使用这些文件时&#…

8个有趣的Linux提示与技巧

我们时不时给你带来关于Linux的提示与技巧。这里我们总结了8个最有趣的提示和技巧。推荐学习Linux视频教程。 以它们的大小列出文件如果你想要一个基于它们大小排序的文件列表&#xff0c;你可以使用下面的命令。它会以递减顺序排列文件。# ls -l | grep ^- | sort -nr -k 5 | …

Ubuntu 14.04 文件服务器--samba的安装和配置

samba是Linux系统上的一种文件共享协议&#xff0c;可以实现Windows系统访问Linux系统上的共享资源&#xff0c;现在介绍一下如何在Ubuntu 14.04上安装和配置samba一、 一、更新源列表 打开"终端窗口"&#xff0c;输入"sudo apt-get update"-->回车--…

export LD_LIBRARY_PATH 的使用

对linux不是很熟&#xff0c;之前只是听说过可以设置程序共享库位置也就是 使用 “export LD_LIBRARY_PATH” 今天用了用&#xff0c;感觉还挺不错&#xff0c;也很常用。 比如你编译了一个so 而这个so 同时又依赖其他第三方库。如果你想把你编译的so 提供给别人用的话&#…

MongoDB命令及SQL语法对比

mongodb与mysql命令对比 传统的关系数据库一般由数据库&#xff08;database&#xff09;、表&#xff08;table&#xff09;、记录&#xff08;record&#xff09;三个层次概念组成&#xff0c;MongoDB是由数据库&#xff08;database&#xff09;、集合&#xff08;collectio…