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

解锁GPM 2.0「卡顿帧堆栈」|代码示例与实战分析

每个游戏开发者都有一个共同的愿望,那就是能够在无需复现玩家反馈的卡顿现象时,快速且准确地定位卡顿的根本原因。为了实现这一目标,UWA GPM 2.0推出了全新功能 - 卡顿帧堆栈,旨在为开发团队提供高效、精准的卡顿分析工具。在这篇文章中,我们将从三个方面详细介绍如何高效使用「卡顿帧堆栈」功能,并通过代码样本帮助开发者实现对玩家端卡顿问题的精细化定位。

定位卡顿细节三部曲

步骤 1:发现特定情况下的卡顿,以及顶层函数
在卡顿帧堆栈异常上报的条件下,GPM 2.0报告将显示玩家游戏时的卡顿帧堆栈信息及当时的画面截帧。例如,在Demo项目中,开发者可以查看如下堆栈表现图,详细展示了特定情况下的卡顿信息。以Demo项目为例,可以看到如下图的堆栈表现。

此处“调用栈深度”设置为5(默认为1)

步骤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.…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 ​ 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...

centos 7 部署awstats 网站访问检测

一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

浅谈不同二分算法的查找情况

二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况&#xf…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...

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

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

第八部分:阶段项目 6:构建 React 前端应用

现在,是时候将你学到的 React 基础知识付诸实践,构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段,你可以先使用模拟数据,或者如果你的后端 API(阶段项目 5)已经搭建好,可以直接连…...

《信号与系统》第 6 章 信号与系统的时域和频域特性

目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...