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

使用 UWA Gears 定位游戏内存问题

UWA Gears 是UWA最新发布的无SDK性能分析工具。针对移动平台,提供了实时监测和截帧分析功能,帮助您精准定位性能热点,提升应用的整体表现。

内存不足、内存泄漏和过度使用等问题,常常导致游戏出现卡顿、崩溃,甚至影响用户体验。本文将详细介绍Gears-Realtime模式中Memory Detail参数,并通过实例演示如何定位和解决游戏中的内存问题。

1. 深入分析内存细节:Memory Detail

要深入地理解内存问题,我们可以借助Memory Detail参数,查看应用内存的具体分布和使用情况。

总体内存使用情况

  • PSS Total
    PSS Total(Proportional Set Size)是衡量进程实际占用物理内存的重要指标,它通过按比例分配共享内存来计算应用的物理内存占用情况。PSS Total通常在应用加载大量资源或数据时增长,如启动新场景或关卡。如果PSS Total持续增长,可能意味着存在内存泄漏或资源未及时释放的问题,长此以往可能导致设备内存耗尽,进而导致应用崩溃。

  • Unknown
    Unknown内存表示未归类的内存使用,通常代表应用中没有明确分类的内存分配。当应用中某些资源或数据无法被现有分类系统识别时,Unknown内存可能会增长。持续的Unknown内存增长可能表明有资源未能及时释放,或某些内存分配没有被合理管理,这可能导致内存泄漏和资源浪费。

堆内存使用情况

  • Native Heap
    Native Heap是由C/C++代码分配的堆内存,主要用于存储应用中的原生对象和数据。Native Heap通常在应用使用复杂的C/C++算法或加载大型原生资源(如音频、视频文件)时增长。如果Native Heap占用持续增加,可能意味着存在内存泄漏,或者分配的内存未能及时释放,这将导致内存碎片化和应用性能的下降。

  • Dalvik Heap
    Dalvik Heap用于表示Dalvik虚拟机管理的Java对象的内存占用情况,是Java应用中内存使用的主要指标。Dalvik Heap会在创建大量Java对象或加载大量Java资源时增长,例如运行复杂逻辑或大量实例化对象时。如果Dalvik Heap增长过快,可能引发频繁的垃圾回收(GC),导致应用性能下降和用户体验不佳。

图形渲染内存使用情况

  • GL mtrack
    GL mtrack监控与OpenGL图形渲染相关的内存使用,包括纹理和渲染缓冲区的内存分配。在加载高分辨率纹理、大型3D模型或在高负载的渲染场景中,GL mtrack的内存占用会显著增长。如果增长过快且未及时释放,可能导致GPU内存不足,引发帧率下降、渲染延迟甚至应用崩溃。

  • EGL mtrack
    EGL mtrack与EGL(OpenGL ES的原生窗口系统接口)相关,监控EGL资源的内存使用。在应用中频繁创建和销毁EGL上下文时,EGL mtrack的内存占用会增长。如果这些资源未能及时释放,会导致内存浪费,并影响图形渲染的性能。

  • Gfx Dev
    Gfx Dev表示与图形设备相关的内存使用,通常用于管理GPU的渲染资源。在进行复杂的图形操作或处理大量图形数据时,Gfx Dev的内存占用会增加。如果增长过快,可能导致GPU资源紧张,进而影响渲染性能。

内存映射使用情况

  • SO mmap
    SO mmap用于表示共享库的内存映射,主要涉及.so文件的内存使用。在应用加载多个共享库或动态链接库时,SO mmap的内存占用会增长。如果共享库数量过多或未能及时卸载,可能导致内存占用增加,并影响应用的启动时间和运行性能。

  • JAR mmap
    JAR mmap表示JAR(Java ARchive)文件的内存映射,主要用于管理Java类库的内存分配。在应用加载大量Java类库或资源时,JAR mmap的内存占用会增加。如果未能合理管理和释放这些资源,可能导致内存占用不断增加,影响应用的性能和响应速度。

  • APK mmap
    APK mmap表示APK(Android应用程序包)文件的内存映射,主要涉及应用自身资源的内存使用。在加载应用的资源文件(如图片、音频、视频)时,APK mmap的内存占用会增加。如果这些资源未能高效管理,可能导致内存占用增加,影响应用的启动速度和运行效率。

  • DEX mmap
    DEX mmap表示DEX(Dalvik Executable)文件的内存映射,包含应用经过编译的字节码。在应用加载多个DEX文件或扩展包时,DEX mmap的内存占用会增加。如果这些字节码未能有效管理,可能导致内存占用增加,影响应用的性能和稳定性。

  • OAT mmap
    OAT mmap表示OAT(Optimized Android Runtime)文件的内存映射,包含优化后的应用程序代码。在应用运行时,加载优化的OAT文件会占用一定的内存。如果OAT文件过大或加载过程不够高效,可能导致内存占用增加,并影响应用的运行速度。

  • ART mmap
    ART mmap表示ART(Android Runtime)虚拟机的内存映射,主要涉及ART虚拟机运行时的内存使用。在ART虚拟机处理Java字节码和优化操作时,ART mmap的内存占用会增加。如果ART内存管理不当,可能导致内存占用增加,影响应用的执行效率。

  • Other mmap
    Other mmap表示其他类型的内存映射,未被归类到特定类型的内存使用。在应用加载非标准资源或使用特殊内存映射时,Other mmap的内存占用会增长。如果这些内存区域未能及时释放,可能导致内存占用增加,影响系统的整体性能。

其他内存使用情况

  • Dalvik Other
    Dalvik Other表示Dalvik虚拟机的其他内存使用,涵盖了非堆内存的部分。通常在Dalvik虚拟机执行非堆内存操作时,这一参数的内存占用会增长。如果虚拟机内存管理不当,可能导致内存浪费,并影响应用的响应速度。

  • Other Dev
    Other Dev表示与设备相关的其他内存使用,通常用于管理与设备特性相关的数据存储。在应用使用特殊硬件功能或与设备进行频繁交互时,Other Dev的内存占用可能增长。如果未能高效管理这些资源,可能导致设备性能下降或内存占用增加。

  • Stack
    Stack表示堆栈内存的使用情况,主要用于存储线程的堆栈信息。在创建新线程或执行复杂操作时,Stack的内存占用会增长。如果线程管理不当或堆栈内存使用过多,可能导致应用的响应速度下降,甚至引发崩溃。

  • Ashmem
    Ashmem(Anonymous Shared Memory)表示匿名共享内存的使用情况,主要用于跨进程共享内存数据。在应用需要在多个进程间共享数据时,Ashmem的内存占用会增加。如果共享内存未能及时释放或管理不当,可能导致内存浪费,并影响系统的稳定性。

通过分析这些细节数据,大家可以更准确地定位内存问题的根源,并采取相应的优化措施,如优化资源加载策略、及时释放不必要的对象等。

2. 实例分析

为帮助大家更好地通过Gears定位内存问题,我们来结合一个具体的游戏实例进行分析,并深入解读相关的性能参数。

背景信息
测试人员在游戏测试的过程中发现,游戏在特定的关卡游玩了10分钟后,出现了闪退现象,初步怀疑可能是因为内存问题导致。

首先,获取性能数据:
我们使用Realtime模式对该游戏进行一定时间的性能测试,获取部分性能数据,便于后续分析。

优化前的性能测试数据趋势图

优化前开始时的测试数据展示图

优化前结束时的测试数据展示图

接着,分析性能数据:
我们可以从上图中观察到,优化前的性能测试数据趋势线成阶梯形增长,而从具体数据来看:

  • PSS Total内存占用在应用运行过程中显著增加,最终达到1.27GB。这表明应用存在严重的内存累积问题,可能是由于内存泄漏或资源未及时释放导致的。

  • Unknown内存增长尤为显著,从135.32MB增长至577.89MB。Unknown内存通常代表未能被归类的内存分配,其大幅增长通常意味着应用中存在未被正确管理的资源或隐性的内存分配问题。这是内存管理的关键问题,可能导致系统内存紧张,从而影响应用的性能和稳定性。

  • GL mtrack内存从163.55MB显著增长至630.84MB,这表明在应用的图形资源管理方面存在严重问题。内存的快速增长可能是由于图形资源未能及时释放或频繁加载大规模图形资源所致。这种内存的急剧增加可能会导致GPU内存压力增大,从而影响渲染性能,最终可能导致帧率下降、画面卡顿,甚至应用崩溃。

结合以上的数据,我们可以发现主要问题集中在PSS Total和Unknown内存的显著增长,以及GL mtrack内存的急剧上升。这些问题表明应用存在严重的内存管理不足,尤其是在图形资源管理方面,可能导致内存泄漏、资源未能及时释放,以及GPU内存过度消耗。这些问题如果不及时优化,可能会导致系统内存不足、应用性能下降,甚至导致应用崩溃。

然后,优化性能问题:
在分析了存在内存问题的性能数据后,我们发现Unknown内存的大幅增长是主要的内存问题之一。Unknown内存并不是某种特殊的内存,而是指无法明确分类的内存部分。大部分的性能分析工具都无法直接识别和定位Unknown内存的具体来源,那么我们该如何去定位并解决Unknown内存问题呢?

主要可以从以下几点来优化:

  • 分析内存增长的时间点
    通过观察内存曲线,识别出内存问题开始的时间点,并回溯到该时段前后执行的代码段,初步判断可能导致内存问题的操作。

  • 关联代码与测试场景
    对照测试场景的步骤,列出在内存增长明显的时间点所执行的操作,并将其与相关代码段对应,初步锁定可疑代码区域。

  • 逐步禁用功能模块
    禁用初步锁定的可疑模块或功能特性,并重新运行测试,观察内存问题是否改善。通过这一过程,进一步缩小问题范围。

  • 细化代码调试
    在可疑代码段内逐行或逐函数分析内存分配操作,特别是涉及到动态内存分配、对象创建等部分,加入日志记录,跟踪内存操作的细节。

  • 内存快照对比
    在内存增长的关键时刻使用内存快照工具捕获内存状态,对比不同时间点的快照,识别出内存增长的具体对象或数据结构,以进一步锁定问题代码。

  • 使用二分法进一步定位
    通过二分法调试将可疑代码区域逐步划分为更小的部分,逐步排查,直到找出具体导致内存问题的代码段,并进行针对性修复。

  • 重复测试验证
    每次定位并修改代码后,重新运行测试场景,验证内存问题是否解决,逐步收窄问题范围,直到彻底消除内存问题。

最后,验证优化结果:

在对游戏进行优化后,我们需要重新进行性能测试来验证优化的结果。

优化后的性能测试数据图

通过查看优化后的数据趋势,我们可以发现优化措施显著改善了应用的内存管理,PSS Total和Unknown内存的稳定性验证了内存累积和泄漏问题得到了解决。同时,系统可用内存的增加进一步确保了应用在长时间运行后的性能和稳定性。

希望这篇文章能够帮助大家使用Gears-Realtime模式快速定位内存问题,在优化内存的道路上披荆斩棘。


如果您在使用过程中遇到任何问题,可以通过私信找到我们,或者前往问答社区进行提问,我们将竭诚为您提供支持。

问答社区链接:UWA问答 | 游戏开发者互动问答社区 | 侑虎科技

相关文章:

使用 UWA Gears 定位游戏内存问题

UWA Gears 是UWA最新发布的无SDK性能分析工具。针对移动平台,提供了实时监测和截帧分析功能,帮助您精准定位性能热点,提升应用的整体表现。 内存不足、内存泄漏和过度使用等问题,常常导致游戏出现卡顿、崩溃,甚至影响…...

OpenRestry(一个Nginx集成工具)的安装与使用

文章目录 一、OpenRestry介绍1、什么是Nginx呢?2、Nginx的反向代理3、Nginx的作用4、什么是OpenRestry? 二、OpenRestry的安装三、OpenRestry中nginx的使用1、Ngnix可以当做web服务器2、Nginx中可以编写Lua脚本 一、OpenRestry介绍 要想了解什么是OpenR…...

linux操作系统的基本命令

1.linux下的文件系统 在linux操作目录下没有像window操作系统下盘符的概念,只有一个根目录/,所有文件目录都在它的下面 linux的目录结构: 在Linux系统中: 文件都从跟目录开始的,用/表示文件名称区分大小写路径都是以/俩进行分隔(windown用\分隔)以.开头的文件为隐藏文件 Li…...

通过UV快速计算品牌独立站网络流量

背景: 品牌独立站项目交付过程中,我们需要为客户提供“云资源” 成本报价,其中“计算资源” 及CPU、内存、存储 参数相对固定,而互联网网络成本需要进行评估报价,以海外TOP云平台 AWS、AZURE、GCP 为例都是以“不限带…...

使用Kong开源API网关的保姆级教程

什么是Kong? Kong是一个开源的、云原生、高性能的API网关,可以轻松地为任何服务提供管理、保护和扩展。它提供了一个可扩展的插件生态系统,可以满足各种各样的需求,如身份验证、授权、限流、监控等。 安装Kong 1. 环境准备 操作系统: CentOS、Ubuntu等主流Linux发行版D…...

浅谈Spring Cloud:认识微服务

SpringCloud就是分布式微服务架构的一站式解决方案,是微服务架构落地的多种技术的集合。 目录 微服务远程调用 Eureka注册中心 搭建Eureka Server 注册组件 服务拉取 当各种各样的服务越来越多,拆分的也越来越细,此时就会出现一个服务集…...

mac命令行分卷压缩与合并

对当前目录内的文件压缩的同时分卷 //语法:zip -r -s 1m 压缩文件名.zip 当前路径 zip -r -s 1m split.zip . //解压 zip -s 0 split.zip --out unsplit.zip unzip unsplit.zip 将一个zip文件进行分卷 一个900k的压缩包名为hello.zip,将其分割为每500K一个zip zip - hello.…...

在 Linux (aarch64) 编译 OpenJDK 8

环境信息 操作系统:Rocky Linux 9.4 (aarch64)Open JDK:OpenJDK 8u422Boot JDK:jdk8u421-linux-aarch64 编译 OpenJDK 需要有一个 JDK。 解压后当前目录结构如下: /opt/ ├── jdk1.8.0_421 │ ├── COPYRIGHT │ ├──…...

如何有效检测住宅IP真伪?

在当今的互联网时代,住宅IP(即家庭用户通过宽带服务提供商获得的IP地址)在跨境电商、广告投放、网络安全等多个领域扮演着重要角色。然而,随着网络环境的复杂化和欺诈行为的增多,如何有效检测和辨别住宅IP的真伪成为了…...

springboot acuturator

SpringBoot使用Actuator - 基础使用步骤 Spring Boot 监控端点 Actuator 入门 - 系统学习 Spring Boot Admin入门 - 基础学习 Spring Boot 监控工具 Admin 入门 - 进阶学习 Spring Boot 监控平台 Prometheus Grafana 入门 Spring Boot 链路追踪 SkyWalking 入门...

什么是SaaS软件?有哪些常用的SaaS软件?

SaaS(Software as a Service,软件即服务)是一种通过互联网提供软件的模式,用户无需安装和维护任何复杂的基础设施,只需通过网络连接即可使用软件。SaaS 供应商负责软件的维护、升级和可用性,用户则通过订阅…...

QT Layout布局,隐藏其中的某些部件后,不影响原来的布局

最近在工作时,被要求,需要将布局中的某些部件隐藏后,但不能影响原来的布局。 现在记录解决方案! 一、水平布局(垂直布局一样) ui中的布局 效果: 按钮可以任意隐藏,都不影响其中布…...

WPF自定义Dialog模板,内容用不同的Page填充

因为审美的不同,就总有些奇奇怪怪的需求,使用框架自带的对话框已经无法满足了,这里记录一下我这边初步设计的对话框。别问为啥要用模板嵌套Page来做对话框,问就是不想写太多的窗体。。。。 模板窗体(XAML)…...

[数据集][目标检测]智慧养殖场肉鸡健康状态检测数据集VOC+YOLO格式4657张2类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):4657 标注数量(xml文件个数):4657 标注数量(txt文件个数):4657 标注…...

Linux 应用安全

1 怎样使用 nmcli 创建新连接,并为其配置静态 IP 地址等参数? # nmcli connection add con-name "连接名" ifname "接口名" type ethernet # nmcli connection modify "连接名" ipv4.method manual ipv4.address "…...

优化内存工具 | RAM Saver Pro v24.9 便携版

RAM Saver是一款专业的RAM优化工具,旨在提高计算机的性能和运行速度。它通过多种优化技术,如内存碎片整理、CPU和主板缓存效率提升、恢复内存等,为应用程序提供更多的内存资源,从而使系统运行更加流畅。适合所有需要优化内存使用和…...

后台数据管理系统 - 项目架构设计-Vue3+axios+Element-plus(0920)

十三、文章分类页面 - [element-plus 表格] Git仓库:https://gitee.com/msyycn/vue3-hei-ma.git 基本架子 - PageContainer 功能需求说明: 基本架子-PageContainer封装文章分类渲染 & loading处理文章分类添加编辑[element-plus弹层]文章分类删除…...

众数信科AI智能体政务服务解决方案——寻知智能笔录系统

政务服务解决方案 寻知智能笔录方案 融合民警口供录入与笔录生成需求 2分钟内生成笔录并提醒错漏 助办案人员二次询问 提升笔录质量和效率 寻知智能笔录系统 众数信科AI智能体 产品亮点 分析、理解行业知识和校验规则 AI实时提醒用户文书需注意部分 全文校验格式、内…...

OpenCV特征检测(4)检测图像中的角点函数cornerHarris()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 Harris 角点检测器。 该函数在图像上运行 Harris 角点检测器。类似于 cornerMinEigenVal 和 cornerEigenValsAndVecs,对于每个像素 (…...

Apache Doris 2.1.6 版本正式发布

亲爱的社区小伙伴们,Apache Doris 2.1.6 版本已于 2024 年 9 月 10 日正式发布。2.1.6 版本在 Lakehouse、异步物化视图、半结构化数据管理持续升级改进,同时在查询优化器、执行引擎、存储管理、数据导入与导出以及权限管理等方面完成了若干修复。欢迎大…...

csharp ef入门

全局安装 dotnet ef 命令行工具 要 全局安装 dotnet ef 命令行工具(即在任何项目目录下都能使用 dotnet ef 命令),请按以下步骤操作: ✅ 全局安装步骤(推荐) 在终端中运行以下命令: bash复制…...

AWS WebRTC:获取ICE服务地址(part 1)

建立WebRTC连接的第二步是获取ICE服务地址。 ICE全称:Interactive Connectivity Establishment,建立互动连接。 ICE 服务地址,主要是 TURN 和 STUN 服务器的地址,用于 WebRTC 在 NAT 网络环境中协商建立连接。 上代码&#xff…...

Android 开发 Kotlin 全局大喇叭与广播机制

在 Android 开发中,广播机制就像一个神通广大的 “消息快递员”,承担着在不同组件间传递信息的重任。Kotlin 语言的简洁优雅更使其在广播机制的应用中大放异彩。今天,就让我们一同深入探索 Android 开发中 Kotlin 全局大喇叭与广播机制的奥秘…...

力扣HOT100之动态规划:300. 最长递增子序列

这道题之前刷代码随想录的时候也刷过,现在又给忘完了。自己尝试着写了一下,发现怎么写都写不对,直接去看视频了。。我自己写的时候的定义是:考虑下标0 ~ i范围内索赔能取到的最长严格递增子序列的长度,后面发现在写递推…...

47道ES67高频题整理(附答案背诵版)

1.ES5、ES6(ES2015)有什么区别? ES5(ECMAScript 5)和ES6(也称为ECMAScript 2015)是JavaScript语言的两个版本,它们之间有一些重要的区别和改进: let 和 const 关键字: …...

Nacos实战——动态 IP 黑名单过滤

1、需求分析 一些恶意用户(‏可能是黑客、爬虫、DDoS ؜攻击者)可能频繁请求服务器资​源,导致资源占用过高。针对这种问题,可以通过IP‏ 封禁,可以有效拉؜黑攻击者,防止资源​被滥用,保障合法…...

Spring AI 系列2: Advisors增强器简介

一、Advisors简介 1.1 Advisors定义 Advisors 是在 AI 应用程序中处理请求和响应的拦截器。我们可以使用它们为提示流程设置额外的功能。例如,可以建立聊天历史、排除敏感词或为每个请求添加额外的上下文。 Spring AI的Advisor,本质上是一个拦截…...

MediaMtx开源项目学习

这个博客主要记录MediaMtx开源项目学习记录,主要包括下载、推流(摄像头,MP4)、MediaMtx如何使用api去添加推流,最后自定义播放器,播放推流后的视频流,自定义Video播放器博客地址 1 下载 MediaMTX MediaMTX 提供了预编译的二进制文件,您可以从其 GitHub 页面下载: Gi…...

Mac Python 安装依赖出错 error: externally-managed-environment

Mac Python 使用 ip3 install -r requirements.txt 出错 This environment is externally managed ╰─> To install Python packages system-wide, try brew installxyz, where xyz is the package you are trying toinstall.If you wish to install a Python library th…...

opengauss 数据库安装主备 非om方式

一. 准备两台服务器 192.168.141.130 --主 192.168.141.131 --备 1.关闭防火墙 systemctl stop firewalld systemctl disable firewalld 2.关闭 selinux 服务 setenforce 0 vim /etc/selinux/config #设置 SELINUXdisabled 3.关闭透明大页 echo never > /sys/kern…...