当前位置: 首页 > news >正文

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数据

相关文章:

UE4中性能优化和检测工具

UE4中性能优化和检测工具合集 简述CPUUnreal InsightUnreal ProfilerSimpleperfAndroid StudioPerfettoXCode TimeprofilerBest Practice GPUAdreno GPUMali GPUAndroid GPU Inspector (AGI) 内存堆内存分析Android StudioLoliProfilerUE5 Memory InsightsUnity Mono 内存Memre…...

大型ERP设计-业务与功能指引:外币折算与辅助账套

外币折算与辅助账套 前言:在对ORACLE和SAP的核心模块功能全面解读的基础上,给出大型ERP设计的建议-业务与功能指引,企业选型、开发大型ERP软件的公司和ERP顾问可以参考。模块包括财务、计划与制造、供应链、项目及设备(MRO),初步预…...

重学java 73.设计模式

本想送你一本沉思录,可该迷途知返的人是我 —— 24.6.18 设计模式 设计模式(Design pattern),是一套被反复使用、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码、保证代码可靠性、程序的重用性,稳定性。 1995 年&#x…...

线代的学习(矩阵)

1.矩阵的乘法 矩阵实现满足:内标相等 矩阵相乘之后的结果:前行后列 需要注意:1.矩阵的乘法不具有交换律:AB!BA 2.矩阵的乘法满足分配律:A(BC) AB AC 抽象逆矩阵求逆矩阵 方法1.凑定义法、 方法2.长除法 数字型矩阵…...

【Java基础5】JDK、JRE和JVM的区别与联系

JDK、JRE和JVM的区别与联系 Java是一种广泛使用的编程语言,它的跨平台特性得益于Java虚拟机(JVM)。然而,在Java的世界里,JDK、JRE和JVM这三个术语常常让人感到困惑。本文将阐述它们各自的功能,以及它们是如…...

2024年先进机械电子、电气工程与自动化国际学术会议(ICAMEEA 2024)

2024年先进机械电子、电气工程与自动化国际学术会议(ICAMEEA 2024) 2024 International Conference on Advanced Mechatronic, Electrical Engineering and Automation 会议地点:杭州,中国 网址:www.icameea.com 邮箱: icameeasub-conf.c…...

WPF 深入理解四、样式

样式 WPF中的各类控件元素,都可以自由的设置其样式。 诸如: 字体(FontFamily) 字体大小(FontSize) 背景颜色(Background) 字体颜色(Foreground) 边距(Margin) 水平位置(HorizontalAlignment) 垂直位置(VerticalAlignment)等等。 而样式则是组织和重用以上的重要工具。不是使…...

TCP相关细节

1. 常用TCP参数 1.1 ReceiveBufferSize ReceiveBuffersize指定了操作系统读缓冲区的大小, 默认值是8192(如图5-10 所示)。在第4章的例子中,会有"假设操作系统缓冲区的长度是8" 这样的描述,可通过socket.ReceiveBufferSize 8 实现。当接收端缓冲区满了的时…...

flutter实现UDP发送魔法包唤醒主机

魔法包 魔法包是用16进制表示的数据包,它是由固定的前缀数据(FFFFFFFFFFFF)以及固定重复次数(16次)的目标主机MAC地址组成。 假设目标主机的MAC地址是:"50:eb:f6:27:ae:a8" 那么魔法包就是[FFFFFFFFFFFF50EBF627AEA850EBF627AEA850EBF627AEA8…...

回溯算法练习题(2024/6/18)

1全排列 II 给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。 示例 1: 输入:nums [1,1,2] 输出: [[1,1,2],[1,2,1],[2,1,1]]示例 2: 输入:nums [1,2,3] 输出:[[1,…...

DSP——从入门到放弃系列2——PLL锁相环(持续更新)

1、概述 锁相环(Phase Locked Loop,PLL)是处理器的时钟源,控制着C6678处理器中C66x内核、各外围设备的时钟的时钟比、对准和选通功能。 2、功能描述 上图显示了PLL和PLL控制器的逻辑实现。PLL控制器提供通过软件可配置的分频器&#xff0…...

Altair 人工智能技术助力MABE预测消费者行为,实现设备性能优化

主要看点 行业: 家电行业 挑战: 企业面临的挑战是如何利用已收集的大量数据,深入了解消费者在产品使用过程中对某些保鲜程序的影响。 Altair 解决方案: Altair采用了Altair RapidMiner人工智能平台来解决问题,特别是…...

解决Spring Boot项目中数据源URL属性的问题

今天测试Springboot项目的时候,报错: . ____ _ __ _ _/\\ / ____ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | _ | _| | _ \/ _ | \ \ \ \\\/ ___)| |_)| | | | | || (_| | ) ) ) ) |____| .__|_| |_|_| |_\__, | / / / /|_||___…...

Java每日作业day6.18

ok了家人们今天我们继续学习方法的更多使用,闲话少叙,我们来看今天学了什么 1.重载 在同一个类中,可不可以存在同名的方法?重载:在同一个类中,定义了多个同名的方法,但每个方法具有不同的参数类型或参数个…...

mac如何检测硬盘损坏 常用mac硬盘检测坏道工具推荐

mac有时候也出现一些问题,比如硬盘损坏。硬盘损坏会导致数据丢失、系统崩溃、性能下降等严重的后果,所以及时检测和修复硬盘损坏是非常必要的。那么,mac如何检测硬盘损坏呢?有哪些常用的mac硬盘检测坏道工具呢? 一、m…...

怎么通俗理解概率论中的c r(cramer rao 克拉默拉奥)不等式?

还是推一下比较好记 视频链接 【数理统计学重要定理证明:C-R不等式——无偏估计的方差下界-哔哩哔哩】 https://b23.tv/4gk1AvU 【数理统计学重要定理证明:C-R不等式——无偏估计的方差下界-哔哩哔哩】...

Flask之模板

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 目录 一、模板的基本用法 1.1、创建模板 1.2、模板语法 1.3、渲染模板 二、模板辅助工具 2.1、上下文 2.2、全局对象 2.3、过滤器 2.4、测试…...

如何优化 Bash 脚本的执行效率?

要优化 Bash 脚本的执行效率,可以考虑以下几个方面: 减少命令执行次数:Bash 脚本中的命令执行是比较耗时的,在可能的情况下,可以尽量减少命令的执行次数。例如,可以将多个命令合并成一个,使用管…...

c语言---循环 、判断基础知识详解

if语句 else离最近的if语句结合。 if语句题目 //1. 判断一个数是否为奇数 //2. 输出1 - 100之间的奇数 #include <stdio.h> int main() {int n 0;scanf("%d", &n);if (n % 2){printf("奇数\n");}else{printf("不是奇数\n"…...

Opencv高级图像处理

文章目录 Opencv高级图像处理图像坐标二值化滤波高斯滤波中值滤波 开闭运算检测霍夫圆检测边缘检测Canny边缘检测findContours区别傅里叶变换-高/低通滤波 直线检测 相机标定视频处理视频格式 模板摄像头处理&#xff08;带参调节&#xff09;单图片处理&#xff08;带参调节&a…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分&#xff1a;机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域&#xff0c;衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标&#xff0c;自2002年由IBM的Kishore Papineni等人提出以来&#xff0c;…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案

在大数据时代&#xff0c;海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构&#xff0c;在处理大规模数据抓取任务时展现出强大的能力。然而&#xff0c;随着业务规模的不断扩大和数据抓取需求的日益复杂&#xff0c;传统…...