UE4中性能优化和检测工具

UE4中性能优化和检测工具合集

  • 简述
  • CPU
    • Unreal Insight
    • Unreal Profiler
    • Simpleperf
    • Android Studio
    • Perfetto
    • XCode Timeprofiler
    • Best Practice
  • GPU
    • Adreno GPU
    • Mali GPU
    • Android GPU Inspector (AGI)
  • 内存
    • 堆内存分析
      • Android Studio
      • LoliProfiler
      • UE5 Memory Insights
      • Unity Mono 内存
      • Memreport
      • RHI Memory
      • XCode Allocations
  • 功耗
    • 硬件方案
      • 电流计
    • 软件方案
      • Perfdog
      • Android 的 Snapdragon Profiler
      • Ios 的 Instruments
  • 包体
    • SizeMap
    • Unreal PakViewer
    • Custom Built Profiler With CI
  • 代码崩溃 & 稳定性
    • Address Santizer
    • StompAllocator
    • Vulkan

简述

总结UE4中性能优化工具合集,之前转过一篇LLM内存统计工具,非常详细,这里会总结全面,包括了CPU/GPU/内存/功耗/包体/代码稳定的各类工具,方便筛选使用

对于每一帧来说,执行顺序依次为:Game Thread → Draw Thread → GPU Thread
Game Thread 首先会对整个游戏世界进行逻辑层面的计算与模拟(e.g.Spawn 多少个新的 actor、每个 actor 在这一帧位于何处、角色移动、动画状态等等),所有这些信息会被输送到 Draw Thread;
Draw Thread(也叫 Rendering Thread) 会根据这些信息,剔除(Culling)掉不需要显示的部分(e.g. 处于屏幕外的物体),接着创建一个列表,其中包含了渲染每个物体必备的关键信息(e.g. 如何被着色、映射哪些纹理等等),再将这个列表输送给 GPU Thread;
GPU Thread 在获取了这个列表之后,会计算出每个像素最终需要如何被渲染在屏幕上,形成这一帧的画面。

CPU

Game Thread 造成的开销,可以使用stat game显示 Tick 的耗时情况 ;dumpticks:可将所有正在 tick 的 actor 打印到 log 中

Unreal Insight

Unreal Insight在 Unreal Engine 4.24.3版本中开始支持移动平台性能数据录取。数据直接写入文件,GUI工具采集结束后离线解析数据文件。(平时使用较多)

优势:可长时间录制数据,数据在时间轴上以进程调度的形式展示,比较容易分析Game、RenderThread与WorkerThread的调度情况,从整体上结合时间连贯性对CPU瓶颈进行初步的定位。也可用于分析有规律的卡顿掉帧的情况。

劣势:所记录的调用堆栈较浅(可手动打点),较难定位到具体出问题的代码,人工分析需要时间与经验
在这里插入图片描述

Unreal Profiler

UE5已删除此模块

(平时使用较多)Unreal Engine 中的 Profiler则是分析CPU端性能情况的一个老工具,与Unreal Insights相比它缺少了线程间调度情况的数据,优点在于其记录的调用堆栈深度较深,可与Insights结合使用 UE4引擎窗口中菜单DeveloperTools下SessionFrontend界面即为Profiler所在的窗口 可通过两种方法抓取数据:

启动程序时增加参数:-messaging

游戏中使用命令: stat startfile, stat stopfile

/sdcard/UE4Game/YourProject/UE4CommandLine.txt
../../../YourProject/YourProject.uproject -messaging
# 数据存放于
/sdcard/UE4Game/FPSDemo/FPSDemo/Saved/Profiling/UnrealStats

在这里插入图片描述

Simpleperf

Simpleperf可录制很深的CPU调用堆栈,可用于详细分析问题时间内的CPU代码执行情况,其将数据聚合,输出类似于Instrument TimeProfiler的形式,可以看到不同函数在一段时间内的贡献、占比情况,及调用次数,方便对其进行更有针对性的优化。但这种聚合模式没有单帧的概念,主要用于宏观统计。因此可以与Profiler、Insights等工具结合使用。建议使用Test包进行数据分析,避免Development版本额外代码所造成的性能压力影响真实数据

Android Studio

使用Android Studio的 ProfileAPK 功能,即可较为自动的生成性能数据
在这里插入图片描述

Perfetto

Perfetto可以拿到simpleperf、systrace等数据

可用于分析APP、系统整体CPU调度,渲染节奏等问题

XCode Timeprofiler

XCode Timeprofiler 与Simpleperf原理相同的CPU性能分析工具,功能强大

Best Practice

粗粒度工具:FramePro、UnrealInsight 用于开发期CI暴漏明显问题

发现问题后,使用细粒度工具进行深度分析:Simpleperf、Streamline、TimeProfiler

建议使用Test包,排除Cache、冗余代码、Profiler本身对性能的影响

尝试:离线计算、ParallelFor、异步化、SOA化等方案

并使用CacheSim、Streamline进行 Cache Miss 分析,压榨出最后的水分

GPU

如果是在PC平台上可以使用ProfileGPU命令或者使用快捷键Ctrl+Shift+,影响GPU瓶颈最主要的是BasePass和PrePass

现代Mobile GPU通常使用 TBR、TBDR 硬件架构
在这里插入图片描述
在有限的功耗下提供尽可能多的性能空间
除了控制 运算负载、动态分支、全精度运算 等天然GPU不友好的指标之外
Mobile GPU因其On-chip Memory较小的原因
需要严格控制寄存器数量,避免Register Spill产生额外IO带宽

Adreno GPU

Adreno GPU
使用Snapdragon Profiler进行Counter数据抓取 提供python脚本进行Counter数据汇总与分类

Mali GPU

Android GPU Inspector (AGI)

Android GPU Inspector (AGI)

在这里插入图片描述
系统性能分析
执行系统级跟踪和分析,以深入了解游戏和系统服务使用的资源,例如 GPU、CPU、内存、电池和 GPU 计数器。支持 Qualcomm® AdrenoTM、Arm® MaliTM 和 Imagination® PowerVRTM GPU
帧性能分析
从单个应用帧捕获跟踪记录,然后对游戏的 GPU 使用情况执行深入分析。其中包括对 Vulkan 和 OpenGL ES API 调用进行更深入的介绍和分析

内存

Android、iOS内存管理核心:

  1. 分页(Paging)
  2. 内存映射(Memory Mapping)

CPU & GPU 公用一套内存硬件(GPU有少量OnChip Memory)
当内存不足时触发分页(Page Out)释放内存:触发 内存压缩; 删除Clean Page; 当剩余内存低于阈值,系统将开始杀进程

堆内存分析

Android Studio

Android Studio 支持 Native(C++) 堆内存分配的分析工作
在这里插入图片描述

Perfetto组件可使用Heapperfd进行Native内存分析工作

LoliProfiler

LoliProfiler支持整合至 UE、Unity 引擎分析 Native(C++)内存
在这里插入图片描述

UE5 Memory Insights

UE5 Memory Insights

在这里插入图片描述

Unity Mono 内存

Mono虚拟机(IL2CPP)提供内存快照接口

UnityMemPerf用C++&QT完美还原了Unity IL2CPP内存工具PerfAssist的体验,无需Unity、无需SDK,连接USB拉起APP即可抓取托管内存快照,进行内存分析、快照Diff

Memreport

提供 UE4 Memreport 数据解析、Diff与可视化功能:(经常使用)

RHI Memory

可针对性的对 UE Vulkan、GL、Metal RHI层内存申请接口结合 FRHIResource 的DebugName

实现一套数据Dump机制,以链接 RHI 内存与 UE RHI资源,深入分析RHI内存

XCode Allocations

类似 Simpleperf 在 iOS 可查看堆内存分配数据的工具
iOS Memory Deep Dive

功耗

手机硬件集成度高,重度手游发热明显,发热与功耗的关系越来越受到开发者的重视
功耗统计难点:

  1. 硬件集成度高,被动散热上限低
  2. 难以测量单模块功耗
  3. 静态、动态功耗叠加
  4. 能耗和利用率、频率呈线性关系,和电压呈二次关系
    综合导致:功耗数据获取难度大,功耗数据体现非线性,数据分析难度也很大

优化建议:均衡CPU利用率;多线程使用;空间换时间;注意屏幕耗电;实时查询响应能耗发热;与硬件厂商合作

硬件方案

电流计

设备充满电(100%),将电流计与充电头连接。
在系统的蓝牙管理面板中查找设备,配对连接并且获取其Mac地址记下。

软件方案

Perfdog

支持基于驱动上报的功耗数据获取, iOS直接解析了XCode Energy的数据

Android 的 Snapdragon Profiler

Snapdragon Profiler
使用实时指标识别潜在问题区域,从 150 多个硬件性能计数器中进行选择
分析跨 CPU、GPU 和 DSP* 的系统、图形和 ML 工作负载
使用 Snapshot 捕获捕获和调试图形工作负载,从而实现更深入的帧和着色器分析
对任何 DirectX、Vulkan、OpenCL 和 OpenGL ES 工作负载进行详细分析
在这里插入图片描述

Ios 的 Instruments

Instruments 是 Xcode 的一个工具集,为我们提供了强大的程序性能分析及测试能力。可以进行CPU 性能测试、图形性能测试、内存性能测试等

包体

包体的大小、首包资源的大小对于玩家有较大影响

尽可能减少包体大小,也是开发者需要关注的重点问题

SizeMap

SizeMap介绍,可以将本地的pak包加载, SizeMap以TreeMap图的形式将资源分类,我们可以点击任意分类进入更深的层级来分析数据
在这里插入图片描述

Unreal PakViewer

Unreal PakViewer

Custom Built Profiler With CI

Asset Registry 中包含资源的 Meta 信息(AssetRegistrySearchable),可在Cook & Package 结束后使用 Commandlet 分析此信息

代码崩溃 & 稳定性

可通过addr2line翻译崩溃符号至具体代码行号

# android-ndk-r21d\toolchains\aarch64-linux-android-4.9\prebuilt\windows-x86_64\bin\aarch64-linux-android-addr2line.exe
addr2line.exe -f -C -e path/to/libUE4.so 0x009988ff

Address Santizer

Android、iOS平台原生支持 ASan,UE也已整合至引擎中
测试ASan包,提前发现内存越界、Use-after-free等常见内存问题
安卓使用ASan检查UE4内存问题

StompAllocator

Windows平台也支持ASan,不行的是至少4.27版本的引擎仍旧无法正常使用ASan功能
可使用替代品,UE内部的 Stomp Allocator(会占用巨量虚拟内存(60G+))

https://pzurita.wordpress.com/2015/06/29/memory-stomp-allocator-for-unreal-engine-4/

通过Page可以设置Read、Write保护的特性,在每次申请内存时,使用Page读写保护来保护内存区域
当越界读写时,就会触发保护,从而崩溃在问题出现的第一现场

Vulkan

Vulkan RHI在较新的移动设备中已全面支持
其RHI性能、驱动内存占用,可玩性、以及可优化性 远超 OpenGL RHI
包含Command的Trace工具,发现崩溃问题时,可通过Trace工具记录完整Command数据

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

QT基础 - 窗口弹窗

目录 零. 窗口简介 一. 普通窗口 二. 无边框窗口 三. 顶层窗口 四. 模态对话框 五. 非模态对话框 六. 消息对话框 七. 文件对话框 八. 颜色对话框 九. 进度对话框 十. 总结 零. 窗口简介 在 Qt中,普通窗口是指程序的整体界面,可以包含标题栏、…

低市值Pow赛道解析,探寻百倍潜力项目

随着铭文的火爆出圈,比特币减半的到来,关于Pow赛道的讨论也在变得火热,不少投资机构都将Pow赛道作为2024年分析的重点。Pow赛道又来已久,不少项目的市值都超过10亿美元,而对于大多数投资者来说,低市值高回报…

深度理解微信小程序技术架构:从前端到后台

在当今移动互联网的时代,微信小程序作为一种轻量级、便捷的应用形式,已经成为许多用户和开发者的首选。本文将深入探讨微信小程序的技术架构,从前端视角到后台支撑,为读者全面解析这一新兴应用形式的奥秘。 #### 一、微信小程序的…

SAP BC 换了logo后,其他人的logo都已经换了,但是其中有一台就是PRD 显示DEV的logo,从smw0上下载的是PRD

昨天终于发现是缓存的问题 GUI登录后 选项-本地数据-缓存 删除本地缓存文件,问题解决了

PEI是聚醚酰亚胺(Polyetherimide)在粘接使用时使用UV胶水的优势有哪些?要注意哪些事项?

PEI是聚醚酰亚胺(Polyetherimide)在粘接使用时使用UV胶水的优势有哪些?要注意哪些事项? 在使用UV胶水进行聚醚酰亚胺(Polyetherimide,PEI)粘接时,有一些优势和注意事项: …

结硬寨:联想服务器的向前之路

曾国藩曾经将自己的战略思想,总结为“结硬寨,打呆仗”。 这种稳健的策略,往往在真实的产业发展中能收获奇效。我们喜欢听颠覆性的产业创新,却往往忽视稳扎稳打,把每一个优势聚集起来形成整体优势,可能才是市…

【字符串解析】IP地址字段解析提取函数接口

在嵌入式业务逻辑中,我们有时需要从配置文件、串口或者服务端接收的消息数据中进行字符串解析,来提取需要的目标字符串字段。通常我们会调用字符串处理相关的函数,例如strstr,strchr,sscanf等,再结合指针偏…

HTML+CSS+PHP实现网页留言板功能(需要创建数据库)

话说前头&#xff0c;我这方面很菜滴。这是我网页作业的一部分。 1.body部分效果展示&#xff08;不包括footer&#xff09; 2、代码 2.1 leaving.php&#xff08;看到的网页&#xff09; <!DOCTYPE html> <html lang"en"> <head> <met…

C++中的结构体——结构体案例2

案例描述 设计一个英雄的结构体&#xff0c;包括成员姓名&#xff0c;年龄&#xff0c;性别&#xff1b;创建结构体数组&#xff0c;其中存放五名英雄 通过冒泡排序的算法&#xff0c;将数组中的英雄按照年龄升序排列&#xff0c;最终打印排序后的结果 五名英雄信息如下&…

ionic 项目通过 android studio 打开报错 capacitor.settings.gradle 文件不存在

问题出现 原因分析 在程序相应的目录上面&#xff0c;没有找到对应的配置文件&#xff0c;但是这个文件不是我们自己生成的&#xff0c;而是通过 ionic 编译之后生成。 处理方案 先执行 ionic build&#xff0c;将 ionic 项目打包出来然后执行 npx cap sync 再使用 Android…

「51媒体」电视台媒体邀约采访报道怎么做?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 电视台作为地方主流媒体&#xff0c;对于新闻报道有着严格的选题标准和报道流程。如果您希望电视台对某个会议或活动进行报道&#xff0c;可以按这样的方法来做&#xff1a; 1.明确活动信…

Elasticsearch docker 安装及基本用法

创建网络 首先通过命令创建一个网络 docker network create es-net然后查看网络 [rootDocker ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 4e315f5e3ae7 bridge bridge local a501a9f3b4ee es-net bridge local ebca66b02e8c host …

OSPF开销、协议优先级、定时器(华为)

#交换设备 OSPF开销值 如果没有定义OSPF接口的开销值&#xff0c;OSPF会根据该接口的带宽自动计算其开销值。 计算公式&#xff1a; 接口开销 带宽参考值 / 接口带宽 &#xff08;取整数部分&#xff0c;结果小于1时取1&#xff09;通过改变带宽参考值可以间接改变接口的开…

Vue10-实战快速上手

实战快速上手 我们采用实战教学模式并结合ElementUI组件库&#xff0c;将所需知识点应用到实际中&#xff0c;以最快速度带领大家掌握Vue的使用&#xff1b; 1、创建工程 注意&#xff1a;命令行都要使用管理员模式运行 1、创建一个名为hello-vue的工程vue init webpack hel…

Transformer预测 | 基于Transformer的锂电池寿命预测(Pytorch,CALCE数据集)

文章目录 文章概述模型描述程序设计参考资料文章概述 Pytorch实现基于Transformer 的锂电池寿命预测,环境为pytorch 1.8.0,pandas 0.24.2 随着充放电次数的增加,锂电池的性能逐渐下降。电池的性能可以用容量来表示,故寿命预测 (RUL) 可以定义如下: SOH(t)=CtC0100%, 其中,…

如何使用GPT?初学者的指南

ChatGPT是一个非常先进的AI工具&#xff0c;它使用GPT-4架构&#xff0c;能够生成自然的语言回应。它的多功能性和理解复杂指令的能力&#xff0c;使得很多人用它来回答各种问题&#xff0c;就像用Google一样输入关键词。不过&#xff0c;ChatGPT还能做更多事情&#xff0c;下面…

TwinCAT3 Scope Y-T NC Project的使用方法(电机参数监控时序图)

TwinCAT3 Scope Y-T NC Project的使用方法 图中有两个电机 在程序中添加两个电机轴 右键点击解决方案&#xff0c;然后添加Scope YT Project 记录绝对位置&#xff0c;速度&#xff0c;相对位置&#xff0c;加速度&#xff0c;跟随误差 如果不是本地的虚拟轴&#xff0c;则可以…

HTML5休闲小游戏《城堡守卫传说》源码,引流、刷广告利器

HTML5休闲小游戏《城堡守卫传说》源码&#xff0c;直接把源码上传到服务器就能使用了&#xff01; 下载链接&#xff1a;https://www.huzhan.com/code/goods467802.html

MacOS - 启动台(LaunchPad)缺少应用软件图标

问题描述 MacOS 有时会遇到已安装的软件在启动台&#xff08;LaunchPad&#xff09;中找不到的 bug&#xff0c;这种情况在新安装软件时易出现。 原因分析 首先去访达&#xff08;Finder&#xff09;中的“应用程序”文件夹确认是否已安装某软件&#xff08;LaunchPad 中图标…

netty解决粘包半包之帧解码器LengthFieldBasedFrameDecoder参数介绍

LengthFieldBasedFrameDecoder的具体参数介绍&#xff1a; 常用参数&#xff1a; maxFrameLength&#xff1a;消息的最大长度LengthFieldOffset&#xff1a;消息的起始位置偏移量&#xff0c;从0的位置开始计算LengthFieldLength&#xff1a;消息体的长度字节数LengthAdjustm…