如何改善虚幻引擎中的游戏线程CPU性能表现

您游戏中的帧频率是不是太低? 您了解为什么会发生这种现象吗? 这是不是由于您同时生成了太多敌人?还是由于某个特定敌人过于消耗系统资源? 是由于您设置了过多的视觉特效,还是由于您所设计的战斗系统所造成的?

放松一下,不要一下子就得出结论!

尝试修复任何性能问题的第一步是收集信息,这样您可以做出明智的决策,以确定下一步该怎么做。 有些人会很自然地说这样的话“当然慢啦! 这个关卡有100,000个actor耶!”,但如果您没有收集适当的数据,您可能就会尝试在关卡中花费大量时间来降低actor的数量,而没有尝试修复真正造成性能表现瓶颈的问题,这些问题可能是完全无关的问题,而且修复起来要容易得多。

明白! 可是从哪里开始着手呢?

您要采集的第一份数据是需要了解,您的性能瓶颈到底是出现在游戏线程中、在渲染(描画)线程中、还是出现在GPU中。 要了解具体原因,您需要以非调试版本来启用游戏,然后输入控制台命令“stat unit”,从而显示完成各项任务需要花费多少时间。

CPU Performance

您的时间指的是生成游戏中每一帧所需要花费的总体时间。 由于在完成一帧前会同时同步游戏和描画线程,时间常常接近于这些线程中的时间。 GPU时间衡量的是显卡需要多长时间来渲染场景。 由于GPU时间与帧同步,它的值很可能也类似于时间。

如果时间非常接近于游戏时间,那么您的瓶颈是游戏线程。 如果时间非常接近于描画时间,那么您的瓶颈是渲染线程。 如果两者都与GPU时间不怎么接近,那么您的瓶颈就是显卡。

本文中,我们仅仅讨论如何处理游戏线程中的问题。

哇!现在我知道游戏的瓶颈是游戏线程啦、 接下来怎么做?


查看游戏线程的性能表现的最佳工具是使用统计数据分析程序。 您可以在控制台输入“stat startfile”来启用分析,您可以按下键盘上的波浪键 (~)来打开控制台。 让我们至少运行10秒左右,这样可以获得许多帧间的良好平均值。 更长的分析时间也很好,而且我们可以使用它们来检测间隙时间较长的问题,但一般不推荐让分析时间超过30分钟,因为这样文件就太大了。 当您获得良好的时间样本后,您可以输入“stat stopfile”来终止分析。 在路径Saved/Profiling/UnrealStats下,会有关于您项目文件夹的ue4stats文件。

好的,我进行了分析。 我该如何打开这个分析文件?

如果需要打开您捕获的分析文件,您必须使用UnrealFrontend(虚幻前端),它和UE4Editor位于同一个文件夹,或者您也可以打开窗口菜单中的编辑器的Session Frontend(会话前端)选项卡。 当您打开了会话前端选项卡后,您需要切换到Profiler(分析程序)的小选项卡。 在该处,您可以选择载入您最近捕获的ue4stats分析文件。

Device Manager

我现在打开了分析文件,我现在应该查看哪些数据?

很重要的信息就是位于底部的功能树。 展开GameThread(游戏线程)项目,然后往下拉,直到您看到超过几毫秒的“Inc Time”(包含时间)条目,而且其不包含许多子项或不包含任何子项。 同时关注一下“Calls”(调用)数列,它显示了每帧调用的统计数据的平均次数。 不要被“CPU Stall”(CPU停滞时间)项目弄糊涂了。 它们显示的是线程等待处理其他内容时所花费的时间,所以不是主要数据,而且仅仅会在帧频率受限或者游戏进程不为瓶颈时才会显示出来。 在下方的分析数据中,我们发现了存在问题的字体缓冲时间。

CPU Stall

这是本周在Fortnite中发现的真正问题! 在本例中,我们显示了基于相机和重要游戏对象间距离而变换大小的许多文本。 由于我们在每一帧都对文本调整大小,所以在Slate和虚幻引擎用户界面系统中的字体缓存中充满了上百个相同的字符串。 修复的方法是停止基于距离来动态缩放文本,也可以根据特定间距的阀值来分别变更文本大小。

这个方法对于Fortnite很好用,但我出现的问题不是“字体缓存”。

您需要关注一些固定的需要注意的数据。

其中一个重要的项目是FTickFunctionTask。 此项目下是正在更新的每个actor和组件。 一般来说,降低每帧更新的actor和组件的数量都可以很好地加速游戏。

FTickFunction Task

如果您的游戏中存在着应永不更新的actor并且您正在使用C++代码,您可以将其放置在actor的构造函数中,以完全防止其更新:

PrimaryActorTick.bCanEverTick = false;

如果actor仅在某些时候进行更新,您可以转而将其放置在构造函数中:

PrimaryActorTick.bCanEverTick = true;

PrimaryActorTick.bStartWithTickEnabled = false;

然后您可以使用SetActorTickEnabled函数来启用和禁用更新。

另一个要关注的是BlueprintTime(蓝图时间)。 找到这个值的最佳方法是切换到包含(合并)视图并在列表中找到它。 这样就可以把所有的BlueprintTime(蓝图时间)条目组合到单一行中。 如果您选择BlueprintTime(蓝图时间),然后切换回层次视图,则其会选择所有蓝图代码被执行的位置,这样能让您很好地了解花费时间进行处理的位置及其位于哪个蓝图中。

Average Speed

另一个常见的问题位置是TickWidgets(更新控件)。 如果这个统计数据值很高,这表示您可能同时显示了太多控件,或者这些控件上的属性代理过于复杂。 一些slate属性,比如可见性,可能会在每帧被调用好几次,这样它们的值必须要小而且能及时返回。

您是不是在游戏中有很多骨架网格物体? SkinnedMeshComp更新时间有时也会消耗很多系统资源。 请尝试降低显示在分析文件中的骨架中的骨骼数量,或者降低动画蓝图的复杂度。 如果您不需要在无法看到骨架网格物体时更新动画,请考虑将骨架网格物体组件上的MeshComponentUpdateFlag(网格物体组件更新标识)正确设置为OnlyTickPoseWhenRendered(仅在渲染时更新姿势)。 请注意,将此标识设置为AnimNotifies(动画通知)将使得这些网格物体不被渲染时不再对其进行触发。

实际上,我正在查找为何游戏不断地产生卡顿。

最好的方法是寻找时间轴中出现的顿卡,选择其周围的帧,然后将视图变更为“最大“,而不是“平均“。 这样会变更所有数字,从而在选择的帧数范围中显示峰值,而不是显示平均值。

Graph View

谢谢!

对总体游戏性能来说,使用分析程序是很关键的。这样可以通过防止您因无法了解真正的问题而过度猜测。 如需了解分析程序中所有功能的更多信息,请访问我们的文档页面。https://docs.unrealengine.com/latest/INT/Engine/Performance/Profiler/index.html

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

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

相关文章

mysql timeout

(待更新整理) 因为最近遇到一些超时的问题,正好就把所有的timeout参数都理一遍,首先数据库里查一下看有哪些超时: rootlocalhost : test 12:55:50> show global variables like "%timeout%"; -----------…

UE 光影参数

平行光的光影效果参数 天光的光影效果参数 让材质不反射光,也就是材质本身的颜色不起作用,只能使用自发光 去掉模型光影效果

《BI项目笔记》多维数据集中度量值设计时的聚合函数

Microsoft SQL Server Analysis Services 提供了几种函数,用来针对包含在度量值组中的维度聚合度量值。默认情况下,度量值按每个维度进行求和。但是,通过 AggregateFunction 属性,您可以修改此行为。聚合函数的累加性可确定度量值…

零基础Unreal Engine 4(UE4)图文笔记之粒子系统

1.我们需要创建两个东西,一个材质一个粒子。先打开材质,在制作粒子之前,我们首先需要自己创建一个粒子效果能用的材质 在材质编辑器中,修改细节中Blend Mode类型为Translucent,Shading Model 为Unit,这一步…

string.Format 指定字符串宽度

语法: { index[,alignment][:formatString]} index,为索引号,不用多说.alignment,是一个带符号的整数,绝对值的大小表示字段的宽度.formatString,格式字符串组件.需要注意的是,alignment对于字符串是不起作用的.转载于:https://www.cnblogs.com/listened/p/4052078.html

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

零散记录 GPUProfile来统计性能消耗的时候,在editor模式下不是很准,因为编辑器的消耗也算进去了,如果要用,最好以Game模式来查看。UE4不支持640X480的分辨率,如果在这个分辨率下运行程序,会导致程序崩溃&a…

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

来源 [尊重原有作者劳动成果] 一: 1:解:\[\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]性能优化指南(美术向)

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

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

http协议中,返回状态码302表示重定向。 这样的情况下,server返回的头部信息中会包括一个 Location 字段,内容是重定向到的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会在液晶屏的左上脚显示一只小企鹅,分辨率为80*80,具体在kernel/drivers/video/logo下会有logo_linux_clut224.ppm这幅图像,程序会根据这幅图像生成logo_linux_clut224.c和 logo_linux_clut224.o两个文件,最终将小企…

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

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

动态更新纹理

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.无密码认证:只点击按钮或强制看广告1.验证码认证:招待券认证、一次性账号、指定时间限制3.用户名密…

动态更新纹理闪烁问题

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

warning C4828问题的处理

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

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

一:description方法 description有对象方法和类方法两种,(是NSObject类的方法)1,-description(对象方法) 使用NSLog和%输出某个对象时,会调用对象的description方法,并拿…

修改场景默认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的输出端常用的神经元,然后重点是说明怎么使用BP来计算偏导数,在Hinton这一课中,他提供了他1986年参与写的《并行分布处理》一书的第8章,49页,这本书的编者是当你的认知神经界的Rumelh…