当前位置: 首页 > 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.…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...