解锁GPM 2.0「卡顿帧堆栈」|代码示例与实战分析
每个游戏开发者都有一个共同的愿望,那就是能够在无需复现玩家反馈的卡顿现象时,快速且准确地定位卡顿的根本原因。为了实现这一目标,UWA GPM 2.0推出了全新功能 - 卡顿帧堆栈,旨在为开发团队提供高效、精准的卡顿分析工具。在这篇文章中,我们将从三个方面详细介绍如何高效使用「卡顿帧堆栈」功能,并通过代码样本帮助开发者实现对玩家端卡顿问题的精细化定位。
定位卡顿细节三部曲
步骤 1:发现特定情况下的卡顿,以及顶层函数
在卡顿帧堆栈异常上报的条件下,GPM 2.0报告将显示玩家游戏时的卡顿帧堆栈信息及当时的画面截帧。例如,在Demo项目中,开发者可以查看如下堆栈表现图,详细展示了特定情况下的卡顿信息。以Demo项目为例,可以看到如下图的堆栈表现。
步骤2:根据出现时机及函数,细化相关逻辑打点
使用GPM SDK提供的API,开发者可以根据游戏特性和性能瓶颈,合理制定打点策略。例如,对高频调用的函数、资源加载流程、复杂运算逻辑等进行重点打点。
以Demo项目为例,从步骤1的结果可以看到,DOTweenComponent.Update 自身的耗时较高,说明很可能是DOTween动画插件的更新触发的回调带来高耗时,结合截图和时机看,可以判断出可能是启动画面结束,切换场景的逻辑,从而找到对应代码进行打点。
以下是通过Push/Pop的成对调用,对其中的逻辑进行打点。

也可通过using+Auto的方式,对作用域中的逻辑打点。

步骤3:获取玩家端耗时细节
将进行了逻辑打点的新版本更新至玩家端后,在新的异常报告中即可以看到打点部分的详细耗时。
此时我们发现,耗时的主要部分来自于自定义PlayerPrefs的初始化检测,以及LuaManager的清理操作。

通过上述分析,开发者可以更高效地定位和解决卡顿问题,提升玩家体验。
详细拆分卡顿模块
- 核心模块耗时拆分
核心模块通常包括游戏的主要业务逻辑部分,如角色同步、寻路、网络消息处理、UI动画等。拆分后我们就可以在卡顿堆栈中初步判定高耗时的主要原因,以及明确下一步的排查方向。
如观察下图中的卡顿堆栈,可以看到耗时主要和NPC的预加载有关,同时单帧内处理了较多的网络消息等。

- 子线程耗时拆分
当项目中存在子线程任务,且有主线程同步等待的机制时,可以针对这部分耗时进行打点,当主线程中的卡顿耗时集中在同步等待时,就可以在子线程中查看与什么任务有关。


注意:子线程中函数的开始时间可能早于主线程当前帧的开始时间,所以有可能会出现总耗时大于帧耗时的情况。
各引擎/平台使用方式及调用方式
为了更好地利用卡顿帧堆栈功能,我们需要了解不同引擎和平台的使用方式及调用方式。
- C#(适用于Unity)
在Unity中,开发者可以使用Push/Pop成对调用的方式对逻辑部分进行打点,这种方式要注意中间避免出现提前return的if分支。

以及通过using+Auto触发作用域打点的方式进行打点,这种方式即使包含了return逻辑也不影响。

对于Unity中HybridCLR的C#热更新框架,可以直接使用GpmSample打点,通过热更即可快速迭代上线,使打点堆栈生效;非热更的部分则需要通过版本更新生效。
- C++(适用于Unreal)
在Unreal中,开发者也可以通过Push/Pop成对调用的方式来进行打点。

以及通过GpmSampleAuto析构触发作用域打点的方式,可以配合{}的使用,指定作用范围,这种方式同样不受提前return的影响。

- Lua(适用于Unity/Cocos/Unreal)
Lua脚本语言在多个游戏引擎中都有广泛应用。在Unity、Cocos和Unreal中,开发者都可以在Lua中使用GPM SDK提供的API进行打点。

在Cocos中,GPM SDK会自动完成C和Lua的绑定。


而Unity和Unreal,开发者可以通过函数导出的方式绑定Lua接口。
- JS(适用于Cocos)
在Cocos引擎中,开发者可以直接在JS代码中使用GPM SDK提供的API进行打点。Cocos中GPM SDK会自动完成C和JS的绑定。

GPM 2.0「卡顿帧堆栈」功能为游戏研发团队提供了精准、直观的卡顿分析能力,让开发者能够快速锁定卡顿根因,优化游戏性能。无论是Unity还是其他游戏引擎,都可以通过自动或手动打点的方式,深入剖析各个环节的性能开销。如果你对游戏性能优化有更高要求,不妨试试GPM 2.0,让你的游戏体验更流畅!
关于GPM 2.0
GPM 2.0 是一款专为上线或测试阶段的游戏项目打造的高效性能监测工具。它不仅深入捕捉宏观性能数据,还通过其独特的性能无损截图功能,让开发者在不影响玩家体验的前提下,全面掌握玩家运行时的关键细节,从多个维度优化游戏的性能表现,提升整体用户体验。
如果您的项目也希望体验GPM 2.0的强大功能,欢迎随时与UWA取得联系。我们将为您提供免费试用机会,并在试用期间全程支持服务搭建、数据分析与反馈,确保您能够充分体验GPM 2.0带来的价值。
联系UWA:
邮件:sales@uwa4d.com
GPM 2.0新功能 集锦
《GPM 2.0 全新发布「卡顿帧堆栈」功能|精准高效定位游戏玩家端性能》
《深入解析「卡顿帧堆栈」》
《GPM 2.0 重新定义性能监测与优化|从未知到已知,从被动到主动》
《UWA GPM 2.0 重新定义性能监测与优化|如何高效预警和定位玩家端的性能问题》
GPM 2.0案例精讲 集锦
《我们的目标是不耗电、不发烫、不闪退》
《冒险闯关类玩家关注的四大体验》
《玩家端性能数据 一手掌握》
《造成设备功耗高的罪魁祸首》
《海外市场设备适配性优化实战》
《5000人测试背后的秘密》
GPM 2.0实操篇 集锦
《GPM 2.0 实操之Session篇之如果闪退是因为内存崩了》
《GPM 2.0 应用场景实例之解决让人头疼的问题》
《GPM 2.0 助力设备监测、行为分析与性能优化|玩家共测新体验》
《GPM 2.0 API 功能助力定制你的性能优化》
《GPM 2.0 驱动优化与投放决策|硬件性能一目了然》
《GPM 2.0 多维数据与实时截帧完美结合》
相关文章:
解锁GPM 2.0「卡顿帧堆栈」|代码示例与实战分析
每个游戏开发者都有一个共同的愿望,那就是能够在无需复现玩家反馈的卡顿现象时,快速且准确地定位卡顿的根本原因。为了实现这一目标,UWA GPM 2.0推出了全新功能 - 卡顿帧堆栈,旨在为开发团队提供高效、精准的卡顿分析工具。在这篇…...
Python:类型转换和深浅拷贝,可变与不可变对象
int():转换为一个整数,只能转换由纯数字组成的字符串 浮点型强转整型会去掉小数点及后面的数,只保留整数部分 #如果字符串中有数字和正负号以外的字符就会报错 float():整形转换为浮点型会自动添加一位小数 .0 如果字符串中有…...
Redis——缓存穿透、击穿、雪崩
缓存穿透 什么是缓存穿透 缓存穿透说简单点就是大量请求的 key 根本不存在于缓存中,导致请求直接到了数据库上,根本没有经过缓存这一层。举个例子:某个黑客故意制造我们缓存中不存在的 key 发起大量请求,导致大量请求落到数据库…...
8.1.STM32_OLED
4.STM32_OLED 跟着江协科大的视频,无法点亮OLED屏幕解决办法 每个人使用的0.96寸OLED屏幕信号不一样,存在很多兼容性问题 归根结底就是驱动的问题! 本人的OLED是SSD1306,在淘宝店铺找了驱动文件后成功点亮,示例见文末 请针对自…...
Gartner发布安全运营指标构建指南
如何为安全运营指标构建坚实的基础 安全运营经理需要报告威胁检测、调查和响应计划的有效性,但难以驾驭大量潜在的 SOC 指标。本研究提供了设计针对 SOC 的指标系统的示例和实践。 主要发现 需要清晰、一致的衡量标准来向董事会成员或服务提供商等更广泛的团队传达…...
【赵渝强老师】监控Redis
对运行状态的Redis实例进行监控是运维管理中非常重要的内容,包括:监控Redis的内存、监控Redis的吞吐量、监控Redis的运行时信息和监控Redis的延时。通过Redis提供的监控命令便能非常方便地实现对各项指标的监控。 一、监控Redis的内存 视频讲解如下 【…...
【Unity】搭建HTTP服务器并解决IP无法访问问题解决
一、核心目标与背景 在Unity中搭建本地HTTP服务器,可以用于实现Web与游戏交互、本地数据接口测试、跨设备通信等场景。但在实际部署中,开发者常遇到以下问题: 本机IP无法访问:服务绑定localhost时,局域网设备无法连…...
如何远程访问svn中的URL
简介: 主要opencascade相关知识学习 格言: 万丈高楼平地起 要远程访问 SVN(Subversion)仓库中的 URL,通常需要以下步骤和注意事项: 1. 确认远程 SVN 服务器的访问协议 SVN 支持多种协议访问远程仓库&…...
Free Auto Clicker - 在任意位置自动重复鼠标点击
“想让鼠标自己动起来,解放双手去做更有趣的事?”Free Auto Clicker 就像你的数字小助手,能在任意位置自动重复点击鼠标。从玩游戏到刷网页,这款免费工具让你告别枯燥的重复操作,效率瞬间起飞! 你有没有想…...
0005__PyTorch 教程
PyTorch 教程 | 菜鸟教程 离线包:torch-1.13.1cpu-cp39-cp39-win_amd64.whl https://download.pytorch.org/whl/torch_stable.html...
Unity Burst编译
官网文档:https://docs.unity3d.com/Packages/com.unity.burst1.8/manual/index.html Unity 之Burst 底层原理:https://zhuanlan.zhihu.com/p/623274986 Burst 编译器入门(五):https://developer.unity.cn/projects/5e…...
软件测试中的BUG
文章目录 软件测试的生命周期BugBug 的概念描述 Bug 的要素案例Bug 级别Bug 的生命周期与开发产生争执怎么办?【高频面试题】先检查自身,Bug 是否描述的不清楚站在用户角度考虑并抛出问题Bug 的定级要有理有据提⾼自身技术和业务水平,做到不仅…...
LabVIEW基于IMAQ实现直线边缘检测
本程序基于 NI Vision Development 模块,通过 IMAQ Find Straight Edges 函数,在指定 ROI(感兴趣区域) 内检测多条直线边缘。用户可 动态调整检测参数 或 自定义ROI,实时观察识别效果,适用于 高精度视觉检测…...
C#:LINQ学习笔记01:LINQ基础概念
一、LINQ 架构体系 1. LINQ 的核心思想 统一查询模型:对对象、XML、数据库等不同数据源使用一致的语法。强类型检查:编译时类型安全,减少运行时错误。 2. 核心组件 技术数据源典型场景LINQ to Objects内存集合 (IEnumerable)过滤/排序集合…...
15Metasploit框架介绍
metasploit目录结构 MSF ——the metasploit framework 的简称。MSF高度模块化,即框架结构由多个module组成,是全球最受欢迎的工具 是一筐开源安全漏洞利用和测试工具,集成了各种平台上常见的溢出漏洞和流行sheellcode,并且保持…...
NLP如何训练AI模型以理解知识
一、自然语言处理(NLP)的定义与核心目标 1. 什么是自然语言处理? NLP是计算机科学与人工智能的交叉领域,旨在让机器具备以下能力: • 理解:解析人类语言(文本或语音)的语法、语义和…...
【树莓派学习】树莓派3B+的安装和环境配置
【树莓派学习】树莓派3B的安装和环境配置 文章目录 【树莓派学习】树莓派3B的安装和环境配置一、搭建Raspberry Pi树莓派运行环境1、下载树莓派镜像下载器2、配置wifi及ssh3、SSH访问树莓派1)命令行登录2)远程桌面登录3)VNC登录(推…...
python连接neo4j的方式汇总
python连接neo4j的方式汇总 1.官方驱动(neo4j)特点代码示例 2. 全功能ORM(py2neo)特点代码示例 3. 领域驱动设计框架(neomodel-odm)特点代码示例 4. 异步高性能驱动(asyncneo4j)特点…...
Graph RAG 迎来记忆革命:“海马体”机制让问答更精准!
随着生成式 AI 技术的快速发展,RAG(Retrieval-Augmented Generation)和 Agent 成为企业应用大模型的最直接途径。然而,传统的 RAG 系统在准确性和动态学习能力上存在明显不足,尤其是在处理复杂上下文和关联性任务时表现不佳。近期,一篇论文提出了 HippoRAG 2,这一新型 R…...
Spring(三)容器-注入
一 自动注入Autowire 代码实现: package org.example.spring01.service;import org.springframework.stereotype.Service;Service public class UserService {}package org.example.spring01.controller;import lombok.Data; import lombok.ToString; import org.…...
英飞凌AURIX TC3XX GPIO驱动配置与LED呼吸灯实现
1. 认识AURIX TC3XX的GPIO模块 第一次接触英飞凌AURIX TC3XX系列MCU时,我被它强大的GPIO功能惊艳到了。这不仅仅是一个简单的数字输入输出接口,而是集成了多种高级特性的硬件模块。在实际汽车电子项目中,比如氛围灯控制、状态指示灯等场景&a…...
【24年最新算法】首发CPO-XGBoost回归+交叉验证 基于冠豪猪优化算法-XGBoost多变量回归预测
✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…...
终极指南:如何使用LeetDown轻松降级A6/A7苹果设备系统
终极指南:如何使用LeetDown轻松降级A6/A7苹果设备系统 【免费下载链接】LeetDown a GUI macOS Downgrade Tool for A6 and A7 iDevices 项目地址: https://gitcode.com/gh_mirrors/le/LeetDown LeetDown是一款专为macOS设计的图形化降级工具,能够…...
从朱诺到威尼斯:一个可持续旅游模型如何‘开箱即用’解决你的美赛问题二
从朱诺到威尼斯:可持续旅游模型的跨场景迁移实战指南 模型迁移的核心挑战与解决框架 当我们将一个城市的可持续旅游模型迁移到另一个城市时,表面上看似乎只需要更换数据输入,但实际操作中会遇到三个维度的挑战: 1. 资源禀赋差异 自…...
如何突破Windows权限壁垒?系统管理专家的秘密武器
如何突破Windows权限壁垒?系统管理专家的秘密武器 【免费下载链接】NSudo [Deprecated, work in progress alternative: https://github.com/M2Team/NanaRun] Series of System Administration Tools 项目地址: https://gitcode.com/gh_mirrors/ns/NSudo 在W…...
Hutool CronUtil实战:5分钟搞定Spring Boot定时任务(含动态任务配置)
Hutool CronUtil实战:5分钟搞定Spring Boot定时任务(含动态任务配置) 在Java开发领域,定时任务几乎是每个项目都绕不开的基础需求。传统方案如Spring Scheduler虽然简单易用,但在动态任务管理和细粒度控制方面往往力不…...
从Shadertoy到Cesium:那些GLSL移植时没人告诉你的分辨率陷阱
GLSL跨平台移植中的分辨率适配陷阱与实战解决方案 当我们将Shadertoy上令人惊艳的GLSL效果移植到Cesium等三维引擎时,往往会遇到一个看似简单却影响深远的问题——分辨率适配。这个问题不仅关乎视觉效果还原度,更直接影响着色器在不同设备上的表现一致性…...
DAMOYOLO-S效果展示:低光照、模糊、遮挡图像下的鲁棒检测能力
DAMOYOLO-S效果展示:低光照、模糊、遮挡图像下的鲁棒检测能力 1. 引言:当目标检测遇上“坏天气” 想象一下,你正在开发一个智能安防摄像头系统,或者一个自动驾驶的视觉模块。白天光线充足、画面清晰的时候,一切都很完…...
SDMatte抠图实战教程:玻璃/薄纱/羽毛一键去背景,保姆级Web部署指南
SDMatte抠图实战教程:玻璃/薄纱/羽毛一键去背景,保姆级Web部署指南 1. 为什么选择SDMatte进行专业抠图 在日常设计工作中,抠图是最基础也最耗时的环节之一。特别是遇到玻璃制品、薄纱材质、羽毛边缘这类复杂对象时,传统Photosho…...
OpenClaw自动化周报生成:Qwen3-32B私有镜像精准提取Git提交记录
OpenClaw自动化周报生成:Qwen3-32B私有镜像精准提取Git提交记录 1. 为什么需要自动化周报生成 每周五下午,我都会面临同样的困扰:需要从零散的Git提交记录中手动整理本周工作内容,再拼凑成一份结构化的周报。这个过程不仅耗时&a…...
