解锁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 多维数据与实时截帧完美结合》

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【人工智能】蓝耘智算平台盛大发布DeepSeek满血版:开创AI推理体验新纪元

📝个人主页🌹:Eternity._ 🌹🌹期待您的关注 🌹🌹 ❀ 蓝耘智算平台 蓝耘智算平台核心技术与突破元生代推理引擎快速入门:三步调用大模型接口,OpenAI SDK无缝兼容实战用例文…

用Python+Flask打造可视化武侠人物关系图生成器:从零到一的实战全记录

用PythonFlask打造可视化武侠人物关系图生成器:从零到一的实战全记录 一、缘起:一个程序小白的奇妙探索之旅 作为一个接触Python仅13天的编程萌新,我曾以为开发一个完整的应用是遥不可及的事情。但在DeepSeek的帮助下,我竟用短短…

Mac远程桌面软件哪个好用?

远程桌面软件能帮助我们快速的远程控制另一台电脑,从而提供远程帮助,或者进行远程办公。那么,对macOS系统有什么好用的Mac远程桌面软件呢? 远程看看是一款操作简单、界面简洁的远程桌面软件,支持跨平台操作&#xff0…

华为云 | 快速搭建DeepSeek推理系统

DeepSeek(深度求索)作为一款国产AI大模型,凭借其高性能、低成本和多模态融合能力,在人工智能领域崛起,并在多个行业中展现出广泛的应用潜力。 如上所示,在华为云解决方案实践中,华为云提供的快速…

Unity 内置渲染管线各个Shader的用途和性能分析,以及如何修改Shader(build in shader 源码下载)

文章目录 所有Shader分析路径:Standard路径:Nature/路径:UI/路径:Particles/Particles/Standard SurfaceParticles/Standard Unlit 路径:Unlit/Unlit/TextureUnlit/ColorUnlit/TransparentUnlit/Transparent CutoutUnl…

概率分布与概率密度

前言 本文隶属于专栏《机器学习数学通关指南》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见《机器学习数学通关指南》 正文 🔍 1. 概率分布基…

【C++】类与对象:深入理解默认成员函数

类与对象:深入理解默认成员函数 引言1、默认成员函数概述2、构造函数与析构函数2.1 默认构造函数2.2 析构函数 3、拷贝控制成员3.1 拷贝构造函数3.2 赋值运算符重载 4、移动语义(C11)4.1 移动构造函数4.2 移动赋值运算符 5、三五法则与最佳实…

LINUX网络基础 - 网络编程套接字,UDP与TCP

目录 前言 一. 端口号的认识 1.1 端口号的作用 二. 初识TCP协议和UDP协议 2.1 TCP协议 TCP的特点 使用场景 2.2 UDP协议 UDP的特点 使用场景 2.3 TCP与UDP的对比 2.4 思考 2.5 总结 三. 网络字节序 3.1 网络字节序的介绍 3.2 网络字节序思考 四. socket接口 …

夸父工具箱(安卓版) 手机超强工具箱

如今,人们的互联网活动日益频繁,导致手机内存即便频繁清理,也会莫名其妙地迅速填满,许多无用的垃圾信息悄然占据空间。那么,如何有效应对这一难题呢?答案就是今天新推出的这款工具软件,它能从根…

Apache nifi demo 实验

Apache nifi 是个数据流系统,可以通过配置 自定义的流程来实现数据的转换。 比如可以配置一个流程,读取数据库里的数据,再转换,最后保存到本地文件。 这样可以来实现一些数据转换的操作,而不用特地编写程序来导入导出。…

VSCode知名主题带毒 安装量900万次

目前微软已经从 Visual Studio Marketplace 中删除非常流行的主题扩展 Material Theme Free 和 Material Theme Icons,微软称这些主题扩展包含恶意代码。 统计显示这些扩展程序的安装总次数近 900 万次,在微软实施删除后现在已安装这些扩展的开发者也会…

Java自动拆箱装箱/实例化顺序/缓存使用/原理/实例

在 Java 编程体系中,基本数据类型与包装类紧密关联,它们各自有着独特的特性和应用场景。理解两者之间的关系,特别是涉及到拆箱与装箱、实例化顺序、区域问题、缓存问题以及效率问题。 一、为什么基本类型需要包装类 泛型与集合的需求 Java…

蓝桥杯复盘记录004(2023)

涉及知识点 1.深搜 2.单调队列滑动窗口 3.位运算 4.并查集 题目 1.lanqiao3505 思路: dfs(index, weight, cnt) index表示瓜的索引, weight等于买瓜的重量, cnt表示买了多少瓜。 递归终止条件:1.如果瓜买完了,归…

【银河麒麟高级服务器操作系统】服务器测试业务耗时问题分析及处理全流程分享

更多银河麒麟操作系统产品及技术讨论,欢迎加入银河麒麟操作系统官方论坛 https://forum.kylinos.cn 了解更多银河麒麟操作系统全新产品,请点击访问 麒麟软件产品专区:https://product.kylinos.cn 开发者专区:https://developer…

【现代深度学习技术】卷积神经网络03:填充和步幅

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重…

FPGA开发,使用Deepseek V3还是R1(3):系统级与RTL级

以下都是Deepseek生成的答案 FPGA开发,使用Deepseek V3还是R1(1):应用场景 FPGA开发,使用Deepseek V3还是R1(2):V3和R1的区别 FPGA开发,使用Deepseek V3还是R1&#x…

【含文档+PPT+源码】基于SpringBoot和Vue的编程学习系统

项目介绍 本课程演示的是一款 基于SpringBoot和Vue的编程学习系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 3.该…

网页复制小妙招

当你遇到网页时不能复制时,不要慌,教你一招可让你为所欲为。 平时你们在网上查找资料想复制时,总是会出现付费限制提示(我也是qwq),这时不要慌,在空白处右击选择检查 按开检查,然后…

聆听PostgreSQL数据库的使用

参考:(1)零基础入门PostgreSQL教程 (2)菜鸟教程 文章目录 一、PostgreSQL是什么?二、基本使用1.下载2.操作(1)数据库(2)表 一、PostgreSQL是什么?…

内核进程调度队列(linux的真实调度算法) ─── linux第13课

目录 内核进程调度队列的过程 一个CPU拥有一个runqueue(运行队列在内存) 活动队列(active) 过期队列(expired) active指针和expired指针 重绘runqueue linux内核O(1)调度算法 总结 补充知识: 封装链式结构的目的是: 仅使用封装链式结构可以得到全部的task_struct的信…