GOT Online|解密游戏性能优化秘籍

news2024/11/25 21:32:21

随着UWA GOT Online功能的不断迭代,GOT Online为解决各种游戏性能问题(如内存占用、CPU耗时、GPU耗时和卡顿)提供了丰富的高效、准确且便捷的数据获取方式和分析建议。本文总结了GOT Online(SDK 2.4.7版本)中的关键优化要点,涵盖了数据获取、数据分析和性能优化等方面。不论你是哪个段位的工程师,这篇文章都是一本值得仔细研读的宝典。

阅读引导

  1. 卡顿优化 
  2. GPU优化 
  3. 内存优化
  4. Lua性能优化
  5. 能耗优化
  6. 更多提升使用体验的优化项

卡 顿 优 化

卡顿分析
在卡顿点分析功能下,UWA在每帧耗时曲线中列举出了运行过程中的所有卡顿帧。选中任意卡顿点,即可在查看这一帧的详细数据。除了耗时、占比、调用次数外,在Timeline中还可以清晰地看到主线程和子线程的进程情况,便于开发者对这些异常节点的耗时情况进行详细分析。

在重点函数分析页签下,UWA对测试过程中容易发生卡顿的重点函数进行了分类和整合,开发者可以更高效地排查项目中的卡顿情况,定位卡顿原因。

>> 如何快速定位你的卡顿

>> 卡顿分析界面:重点函数分析和卡顿点分析

>> GPU Counter、Timeline功能

资源管理
在资源管理模块下,UWA列出了各个资源的加载耗时、频率情况,开发者可以准确定位到是哪个资源造成的耗时瓶颈,查看到每个资源的加载/卸载、每个GameObject的实例化/激活等具体耗时情况。

>> GOT Online Resource模式下的资源管理模块

在Resource模式下,或在Overview模式开启Resource模式时,勾选资源管理模块,即可在资源管理模块查看到AssetBundle加载&卸载、资源加载&卸载、资源实例化&激活的四大模块。

在资源管理汇总界面,UWA将需要注意的加载耗时、频率TOP 10的问题资源直接列出,通过对这些重点对象快速处理,能在短时间内达到立竿见影的优化效果。同时,也可以重点分析不同加载接口的使用情况,比如在“资源加载&卸载”界面,用户可以看到被加载的资源属于哪个AssetBundle,用了哪个接口以及加载的耗时、次数等。


GPU 优化

SoC信息
在SoC GPU信息模块下,开发者可以从更宏观的角度对设备的GPU运行情况进行监控,在观察GPU运行状态、判断是否存在GPU降频情况的同时,也可以快速定位GPU压力较大的场景,更有针对性地进一步分析这些场景的性能压力来源。

>> GPU篇:SoC GPU信息、GPU Counter性能指标

GPU Counter
经过对GPU Counter功能不断的完善和迭代,GPU Counter模块已经支持Mali、Adreno、PowerVR三个品牌芯片的设备,包括九个重要GPU参数模块。开发者可以通过GPU耗时、GPU活动来定位项目哪些场景的性能瓶颈来自GPU,并通过GPU着色、带宽、图元这些详尽的参数,更高效便捷地定位GPU压力来源、制定性能标准。

>> GPU Counter、Timeline功能

>> Mali GPU Counter模块新增GPU图元处理和GPU Shader Cycle

>> GPU Counter支持Adreno、PowerVR芯片

>> SoC GPU信息、GPU Counter性能指标


内 存 优 化

PSS显存 & 内存占用 & 资源内存
在运行信息页下的PSS内存模块中,开发者可以查看测试过程中的PSS显存数据,结合资源内存数据,对项目的闪退风险进行管控。

在内存占用页,开发者可以快速总览项目中纹理、网格、动画、音频等各类资源的内存占用情况和趋势、了解项目的内存分布,以及细分定位到哪些资源存在问题,大幅节省逐个资源排查的时间。

在资源内存页,UWA会根据测试时是否开启Resource模式、是否手动dump等情况,不同程度地展示资源的具体信息。在这个页面下,开发者可以在采集Overview模式数据的同时,也能获取到和Resource模式一样全面的资源数据。

>> PSS显存、内存占用、堆内存对象快照

>> 内存篇:PSS显存、内存占用、堆内存对象快照

>> GOT Online支持多模式采集、Mono分析支持IL2CPP打包

当测试中未开启Resource模式时,资源统计模块会统计主要场景(测试起始帧、每千帧、场景切换帧和结束帧等)中纹理、网格、Shader、字体、RenderTexture、粒子系统等主流资源的数量和大小;而当开启Resource模式后,则会对上述资源的使用详情做更详细的采集。

以纹理资源为例,开启Resource模式后,可以在报告中获取纹理资源的内存占用、数量峰值、宽度、高度、生命周期和是否开启了R/W等属性,以便开发者对纹理的使用情况做更详细地排查。

当在Overview模式下发现Mono存在问题时,就可以使用Mono模式,对Mono的分配和驻留情况进行具体分析。

多线程统计Mono分配
Mono模式除了主线程外,也可以获取到子线程的堆内存分配情况。使用Mono模式,开发者可以更全面地对项目的Mono分配和驻留进行分析,也能够更放心地使用子线程来分担主线程的性能压力。

>> 多线程统计

Mono倒序调用分析
在堆内存具体分配模块下,可以使用倒序调用分析功能对Mono分配情况进行查看。开发者可以通过这个功能,更便捷地定位到分配Mono堆内存的深层子函数,定位内存问题的瓶颈。

>> Mono堆内存倒序调用分析

驻留堆内存分配函数
在堆内存泄漏分析下,即可查看驻留堆内存分配前10位的函数。通过对两次采样间的内存变化比较,开发者可以快速地捕捉具体的泄露函数、泄露的具体内存和变量数据。

>> GOT Online新版本中暗藏的小心机

堆内存对象快照
通过堆内存对象快照,开发者可以对场景中的堆内存对象情况进行详细采样。在对场景中的Mono驻留问题有一个直观了解的同时,高效锁定Mono堆内存瓶颈,并着手优化。

>> 堆内存对象快照

“堆内存泄漏分析”中的“驻留堆内存分配函数”以及“堆内存对象快照”页,方便开发者对运行时的堆内存对象驻留情况进行详细地分析。

在测试时,根据测试开始前设置的Dump规则,在每固定间隔帧或手动Dump时,UWA会对堆内存对象进行数据采集。

开发者可以在“堆内存对象快照”页中的堆内存对象柱状图表中,从“堆内存对象大小”和“堆内存对象个数”两个维度,快速定位到哪些场景中存在需要优化的堆内存驻留问题。

堆内存对象分为Managed Object和内存碎片两部分,其中内存碎片中包含了“空闲激活内存”和“空闲碎片内存”。进行堆内存分配时,会优先使用“空闲激活内存”中可用的内存块,其次才会从“空闲碎片内存”中查找可用的内存块。

在柱状图下方,会显示选中帧所有类型的Managed Object大小、对象类型总数、对象类型个数、内存碎片占比。右侧饼状图会展示前10位和其他类型的对象和的占比,以便开发者对这一帧的堆内存对象情况有一个更直观的了解的同时,快速锁定Mono堆内存瓶颈。

同时,在饼图下方的对象类型表中,也将展示出这一帧所有对象的类型、大小、占比、对象个数等信息。在展开对象类型后,开发者就可以快速定位到调用此对象类型的所有函数和选中函数的倒序调用路径。

通过这张表格,可以更精确地定位堆内存分配的出处,并通过在代码中搜索对应的子函数,更高效地对其堆内存分配进行优化。


Lua 性 能 优 化

Lua性能分析
在Lua报告中,开发者可以看到测试时总体堆内存、堆内存具体分配和Mono对象引用的数据,开发者可以在此页签中对项目的Lua内存的分配和占用情况进行分析。

>> Lua,是时候和你走走心了!

>> UWA支持Lua CPU耗时分析

Lua倒序调用分析
Lua报告支持倒序调用分析,在倒序调用分析页下,开发者可以直接定位到最底层的Lua堆栈,一眼挑出耗时最大、分配最多的始作俑者,高效地解决问题。

>> GOT Online新版本中暗藏的小心机

在倒序模式下,某结点展开后的直接函数列表为对该结点函数有所调用、并产生堆内存的父函数,因此可以直接定位到最底层的原因,再也不用为深不见底的堆栈而无脑“点点点”了。

Mono 对象引用
在Mono对象引用模块下,开发者可以直观地查看Mono端已经被Destroy但Lua端却依然被索引的变量的对象的数量和走势,并通过对比模式将采样点做比较,更便捷地定位C#层的内存泄漏问题。

>> Lua代码优化

在任意一种Lua插件中,都存在类似的机制:在C#层维护一个Cache来引用那些被Lua访问过的C#层对象,防止出现以下的问题:当Lua中再次访问该C#对象时,该对象可能已经被C#层的GC回收掉了,从而导致逻辑错误。所以,在Lua中始终保留某个C#层对象的引用,将会导致其无法被释放,当这样的引用越来越多,就会导致C#层的内存泄漏。

为了便于用户排查这种情况,我们在Mono对象引用的报告页面中对上述的Cache中C#层对象进行了汇总,统计了Cache中出现的对象类型和各个类型的对象总数。当该对象继承自UnityEngine.Object时,还将统计该类型中已经被Destroy的对象数量,如下图所示:

所以,对于判断Lua引用导致Mono泄露的一个简单的方法就是查看Destroyed总数是否为零。因为它表示的是Mono端已经被Destroy但Lua端却依然被索引的变量总数,理论上应该是趋向于0的。如果它持续很高,甚至还有不断走高的趋势,那么很大概率是泄露了,如下图所示:

对于某些数量持续上涨的对象类型,包括Destroy数量和走势等,还可以在图表下通过对比两个不同采样点的对象引用,从而进一步定位Lua中不合理的引用,分析增量的合理性。

补充说明:关于排查泄露的需求,建议长时间测试,毕竟泄露问题一旦发生,聚沙成塔就很快了。


能 耗 优 化

功率
在耗电量页,可以查看测试过程中的功率数据。便于开发者通过观察测试过程中设备的功率和电流情况,对项目的功耗情况进行分析。

>> GPU Counter功能支持Adreno、PowerVR芯片

温度变化量
在温度变化量页,UWA支持CPU温度、GPU温度和电池温度数据,开发者可以通过这些硬件的温度情况,定位设备发热原因。

>> Mali GPU Counter模块新增GPU图元处理和GPU Shader Cycles


更 多 提 升 使 用 体 验 的 优 化 项

自定义参数
使用UWA自定义参数截取需要分析的代码,即可在自定义参数下的自定义代码段和自定义变量页对代码进行检测和跟踪后。通过这个功能,开发者可以更灵活地定位代码瓶颈和反馈代码问题。

>> 支持自定义变量和代码段检测

函数释义Tips
在Overview报告的各个模块的函数堆栈下,UWA结合结合丰富的优化经验,UWA对优化过程中的常见函数进行了标注。有了这些贴心的Tips,开发者就可以快速归因并给出整改方法,让优化的效率更上一层。

>> 对比分析、Batches数量、函数释义Tips

在Overview报告的各个模块的函数堆栈下,新增了函数释义的Tips。结合丰富的优化经验,UWA对优化过程中的常见函数进行了标注。将鼠标移动到函数名右侧的“ ! ”上,即可查看函数的释义、耗时来源、优化方式等信息。

对比分析
通过报告右侧的快捷入口,即可对Overview报告中不同的场景进行全面地对比分析。开发者可以在快速定位问题的同时,便捷且充分地在团队内部搭建起监控流程,定期对项目的性能情况进行数据汇总,形成更高效便捷的性能数据监控闭环。

>> 对比分析、Batches数量、函数释义Tips

场景分割
通过使用场景概览-场景管理下的场景分割的功能,开发者即可针对不同场景、UI 界面等模块,更精细化地统计具体场景的耗时情况,进一步为数据分析带来便利。

>> 支持资源加载分析、场景分割

可通过在“场景概率-场景管理”中点击“新增场景分割线”按钮,输入分割的位置和场景名,即可在页面上看到最新的数据分析。


更多UWA GOT Online使用技巧等待你的探索,也欢迎大家提出建议和需求!免费试用可以前往www.uwa4d.com,注册用户即可获得15天的试用权益!

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

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

相关文章

fps php,帧率60帧是什么意思

帧率60的意思是每秒屏幕刷新60次,帧率是用于测量显示帧数的量度。所谓的测量单位为每秒显示帧数即Frames per Second,简称FPS或“赫兹”,此词多用于影视制作和电子游戏。 本文操作环境:Windows7系统,Dell G3电脑。 帧…

计算机网络模型

计算机网络模型 网络模型网络模型中各层对应的协议封装与分用TCP/IP协议簇的组成 网络模型 OSI 七层模型 应用层、表示层、会话层、传输层、网络层、数据链路层、物理层 TCP/IP四层模型 应用层、传输层、网络层、网络接口层 TCP/IP五层模型 应用层、传输层、网络层、数据链路…

【SpringCloud Alibaba】(二)微服务环境搭建

1. 项目流程搭建 整个项目主要分为 用户微服务、商品微服务和订单微服务,整个过程模拟的是用户下单扣减库存的操作。这里,为了简化整个流程,将商品的库存信息保存到了商品数据表,同时,使用商品微服务来扣减库存。小伙…

【简单认识MySQL主从复制与读写分离】

文章目录 一、MySQL主从复制1、配置主从复制的原因:2、主从复制原理1、 MySQL的复制类型2、 MySQL主从复制的工作过程;1、 MySQL主从复制延迟2、优化方案:3、 MySQL 有几种同步方式: 三种4、异步复制(Async Replication&#xff0…

【初始C语言】多种输入格式的优劣

多种输入格式的优劣【初始C语言】 一.多种输入格式的不同(只针对输入字符,字符串)1.scanf("%s",字符数组名)2.scanf("%[^\n]s",字符数组名)3.gets(字符数组名)4.fgets(字符数组名,规定…

光耦参数设置

2.1发光二极管电阻的选择 数据手册中,IF是发光二极管的允许最大正向电流,值是80mA。这是需要考虑的第一个条件。 再看第二张图,VF是二极管上的电压,图中给出,当IF是10mA的时候,VF的值最大是1.4V。这是需要考…

【python工具】html中表格转化为excel

背景 大家在实际的工作中可能会遇到这样的场景,查看某个统计的页面数据,其中一些数据是表格形式展示的,比如这是国家统计局关于人口统计的数据: 你想将表格内容下载下来根据自己的需要进行二次加工,但是页面没有提供下载功能或者需要你登陆才能下载。那么重点来了~~ 操…

初识 Spring (存储和获取 bean)

目录 初识 Spring总结 DI(依赖注入)Spring 项目的创建创建一个 Maven 项目添加 Spring 框架支持添加启动类 存储 bean 对象创建 bean将 bean 注册到容器中 获取并使用 bean 对象获取 bean 的方法一获取 bean 的方法二获取 bean 的方法三 ApplicationCont…

【雕爷学编程】Arduino动手做(55)--DHT11温湿度传感器模块2

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…

Cesium态势标绘专题-位置点(标绘+编辑)

标绘专题介绍:态势标绘专题介绍_总要学点什么的博客-CSDN博客 入口文件:Cesium态势标绘专题-入口_总要学点什么的博客-CSDN博客 辅助文件:Cesium态势标绘专题-辅助文件_总要学点什么的博客-CSDN博客 本专题没有废话,只有代码,代码中涉及到的引入文件方法,从上面三个链…

RocketMQ教程-(4)-领域模型-消费者分组ConsumerGroup

定义​ 消费者分组是 Apache RocketMQ 系统中承载多个消费行为一致的消费者的负载均衡分组。 和消费者不同,消费者分组并不是运行实体,而是一个逻辑资源。在 Apache RocketMQ 中,通过消费者分组内初始化多个消费者实现消费性能的水平扩展以…

练习——动态内存分配的笔试题

今天我们分享几道经典的笔试题,做完直接变成陈泽 第一题 ~~ --------------------------------------------------------------------------------------------------~~ void GetMemory(char* p) {p (char*)malloc(100); } void Test(void) {char* str NULL;Get…

计算机网络第一章概述

第1章 网络概述 因特网(Internet) 是世界上最大的互连网络【小写i的internet是通用名词,互连的网络都叫internet】 因特网的前身是1969年创建的第一个分组交换网:ARPANT 普通用户如何接入因特网? 通过ISP接入因特网。ISP可以从因特网管理…

C/C++ 程序 IDE 开发工具 CLion

下载地址: https://www.jetbrains.com/clion/ https://www.jetbrains.com/clion/ 下载地址: https://www.jetbrains.com/clion/download/ https://www.jetbrains.com/clion/download/ 历史版本(老版本)下载地址: h…

基于RASC的keil电子时钟制作(瑞萨RA)(4)----使用串口进行程序烧写

基于RASC的keil电子时钟制作4_使用串口进行程序烧写 概述硬件准备视频教程软件准备hex文件准备UART串口与瑞萨开发板进行接线烧录 概述 本篇文章主要介绍如何使用UART串口烧写程序到瑞萨芯片,并以实际项目进行演示。 硬件准备 首先需要准备一个开发板&#xff0c…

Docker 续

Docker 续 一、Docker 网络1.1 Docker 网络实现原理1.2 Docker 的网络模式1.2.1 Docker 网络模式分类 1.3 如何创建各类网络模式1.4 host模式1.5 container模式1.6 none模式1.7 bridge模式1.8 自定义网络 二、资源控制2.1 Cgroup2.2 CPU 资源控制2.2.1 设置CPU使用率上限2.2.2 …

Attention详解(自用)

encoder-decoder 分心模型:没有引入注意力的模型在输入句子比较短的时候问题不大,但是如果输入句子比较长,此时所有语义完全通过一个中间语义向量来表示,单词自身的信息已经消失,可想而知会丢失很多细节信息&#xff0…

科技UI图标的制作

科技UI图标的制作,效果图如下: 一、新建合成 1、新建合成,命名为合成1,参数设置如下: 2、新建纯色,命名为分形 二、添加分形杂色 1、添加分形杂色 为纯色层“分形”,添加分形杂色&#xff0c…

Oracle根据日志执行相应的存过处理逻辑

背景: 项目上有两个不同的MPP数据库(HIVE、oceanbase),目前的问题是需要把hive的数据迁移到ob中。数据体量大于4000亿,文件容量有300T,hive作为计算库(大于120节点的集群)把结果数据计算出,存放在DWD层,hive的表有近40张,大部分是大宽表(大于100个字段),里面字段…

从C到C++ | C++入门(三)

目录 内联函数 auto 关键字 范围for 指针空值nullptr 内联函数 以inline修饰的函数叫内联函数&#xff0c;编译时C编译器会在调用函数的地方展开&#xff0c;没有函数调用建立栈帧的开销&#xff0c;可提升程序的运行效率。 例子&#xff1a; #include <iostream> …