Android性能优化之游戏引擎初始化ANR

近期,着手对bugly上的anr 处理,记录下优化的方向。

借用网上的一张图:
在这里插入图片描述

这里的anr 问题是属于主线程的call 耗时操作。需要使用trace 来获取发生anr前一些列的耗时方法调用时间,再次梳理业务,才可能解决。

问题1
java 调用栈:
在这里插入图片描述
从调用栈中发现onActivityResult()执行对游戏侧的初始化会造成anr。

因靠打印是不准确,存在多线程抢占cpu的缘故,因此考虑通过获取trace来记录方法的真正执行时间。

记录oppo渠道包的冷启动到登录页面的sample trace文件,总览trace中存在的耗时点:这里查看主线程中执行方法。
在这里插入图片描述
淡绿色是app中的代码,长方形占用面积越大,越耗时。

查看onActvityResult的逻辑执行时间:
在这里插入图片描述
发现Show_GLView()执行耗时最多,其中NativeInit()函数中调用若干方法,游戏C++层初始化了一大堆的逻辑。

问题2

anr发生的调用栈
在这里插入图片描述
通过调用栈oppo渠道中发现onResume执行对渠道初始化发生anr。

通过trace,来看下onResume中执行时间:
在这里插入图片描述
发现,onResume中初始化聚合渠道任务初始化,耗时100多毫秒。该任务可能并不是真正引起anr的真凶,可能是onActivityResult()耗时过多,间接导致onResume()过程中被系统判定anr。

方案优化

耗时任务的解决有三种方式:

  • 将耗时任务放到异步线程中执行
  • 将耗时任务 lazy延后策略执行或者 提前选择空闲时间执行。

当界面1 跳转其他界面2后,当界面2调用finish()销毁时:

先执行界面2的onStop()–>界面1的onActivityResult()->界面1的onResume()–>界面2的onstop()–>界面2的onDestroy()。

尝试将nativeInit()和Show_GLView_Two() 放到onActvivityResult()和onResume()之后执行。为了不阻塞onResume()执行,利用hanlde的空闲机制:
在这里插入图片描述
在onActivityResult之后执行空闲任务:
在这里插入图片描述
Onresume 之后添加延迟任务:
在这里插入图片描述
按照以上调整逻辑,再次编译渠道包,来看下优化效果

优化效果

查看onActivityResult()中onResume()执行时间:

在这里插入图片描述
同时也反馈给游戏侧c++层的同事,初始化根据业务,进行延迟、异步等操作细分调用时间。

资料借鉴:

  • https://www.zhihu.com/tardis/bd/art/552305686?source_id=1001

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

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

相关文章

14 Linux实操篇-进程管理(重点)

14 Linux实操篇-进程管理(重点) 文章目录 14 Linux实操篇-进程管理(重点)14.1 进程的基本操作14.1.1 进程和程序14.1.2 父进程和子进程14.1.3 常见的Linux进程14.1.4 显示系统执行的进程-ps14.1.5 终止进程-kill/killall14.1.6 查…

LeetCode 75 第十二题(11)盛最多水的容器

目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 配合着示例给出的图片我们可以得知找出盛水最多的容器是什么意思,给一个数组,找出数组中两个元素能围成的最大的矩阵面积是多少. 比较直观的想法是套两层for循环暴力解出来,但是这题是中等难度题,一般中等题是没法用暴力得…

【动态规划刷题 2】使⽤最⼩花费爬楼梯 解码⽅法

使⽤最⼩花费爬楼梯 746 . 使用最小花费爬楼梯 链接: 746 . 使用最小花费爬楼梯 给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。 你可以选择从下标为 0 或下标为 …

【JAVA】 String 类简述笔记

个人主页:【😊个人主页】 系列专栏:【❤️初识JAVA】 文章目录 前言String类创建一个String类 常用方法字符串长度 length() 方法连接字符串 concat() 方法创建格式化字符串 format()功能 前言 string是C、java、VB等编程语言中的字符串&…

安卓:百度地图开发(超详细)

一、百度地图介绍 百度地图SDK是一套供开发者使用的软件开发工具包(SDK),用于在Android应用程序中集成和使用百度地图功能。通过使用百度地图SDK,开发者可以实现在自己的应用中显示地图、获取定位信息、进行搜索、导航等功能。 百…

办公软件巨头CCED、WPS迎来新挑战,新款办公软件已形成普及之势

办公软件巨头CCED、WPS的成长经历 众所周知,CCED和WPS是中国办公软件行业的两大知名品牌。 但它们的成长经历不是一蹴而就的,都是经历了漫长的发展过程的。 CCED是中国大陆早期的一款文本编辑器,它在上个世纪80年代末和90年代初非常流行。 …

数学建模-MATLAB三维作图

导出图片用无压缩tif会更清晰 帮助文档:doc 函数名 matlab代码导出为PDF 新建实时脚本或右键文件转换为实时脚本实时编辑器-全部运行-内嵌显示保存为PDF

githack的安装步骤+一次错误体验

一.githack的安装步骤 1.要在Kali Linux上安装GitHack工具,您可以按照以下步骤操作: 打开终端并使用以下命令克隆GitHack存储库: git clone https://github.com/lijiejie/GitHack.git2.进入GitHack目录: cd GitHack3.安装依赖项…

Linux下安装RabbitMQ教程

官方安装指南:https://www.rabbitmq.com/install-rpm.html 我们将要安装的RabbitMQ的版本是3.8.2 el/7/rabbitmq-server-3.8.2-1.el7.noarch.rpm - rabbitmq/rabbitmq-server packagecloud 不需要单独安装Erlang环境。 2. 环境配置: 前提&#xff…

RabbitMQ 教程 | RabbitMQ 入门

👨🏻‍💻 热爱摄影的程序员 👨🏻‍🎨 喜欢编码的设计师 🧕🏻 擅长设计的剪辑师 🧑🏻‍🏫 一位高冷无情的编码爱好者 大家好,我是 DevO…

自动驾驶之轨迹规划8——Apollo参考线和轨迹

1. abstract 本文主要讲解routing和planning模块中的reference line,我之前一直搞不明白这个reference line是如何生成的,有什么作用,和routing以及planning的关系。现在有了一些心得打算梳理一下: 决策规划模块负责生成车辆的行…

6、Kubernetes核心技术 - Pod

目录 一、概述 二、Pod机制 2.1、共享网络 2.2、共享存储 三、Pod资源清单 四、 Pod 的分类 五、Pod阶段 六、Pod 镜像拉取策略 ImagePullBackOff 七、Pod 资源限制 八、容器重启策略 一、概述 Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。P…

flutter:animate_do(flutter中的Animate.css)

简介 做过web开发的应该大部分人都知道Animate.css,它为开发者提供了一系列预定义的动画效果,可以通过简单的CSS类来实现各种动画效果。而animate_do 相当于flutter中的Animate.css,它提供了很多定义好的动画效果 基本使用 官方地址 https://pub-web.…

【C++】-多态的经典题目

💖作者:小树苗渴望变成参天大树🎈 🎉作者宣言:认真写好每一篇博客💤 🎊作者gitee:gitee✨ 💞作者专栏:C语言,数据结构初阶,Linux,C 动态规划算法🎄 如 果 你 …

单机环境下定时任务的基本原理和常见解决方案(二)之时间轮原理分析

单机环境下定时任务的基本原理和常见解决方案之时间轮原理分析 时间轮Netty时间轮使用Netty 时间轮 HashedWheelTimer 源码分析向时间轮里添加taskWorkerThread线程执行时间轮任务 多层时间轮总结 时间轮 生活中的时钟想必大家都不陌生,而时间轮的设计思想就是来源…

智能家居是否可与ChatGPT深度融合?

​ ChatGPT自2022年面世以来,已为亿万网民提供智能问答服务。然而我们是否曾想到,这一人工智能驱动的聊天机器人,是否可为智能家居赋能? 要实现ChatGPT与智能家居设备之间的无缝对话,单单依靠一台终端是远远不够的。ChatGPT必须…

【快应用】通用方法getBoundingClientRect的使用

【关键词】 快应用开发、通用方法、getBoundingClientRect 【背景】 快应用通用方法中提供了getBoundingClientRect方法来获取当前组件的布局位置,之前处理的快应用问题中,有个cp却把这种场景误解为可以获取到文字的宽度和高度,这是不合理的…

会议OA项目之会议发布(一)

目录 前言: 会议发布的产品原型图: 1.会议发布 1.1实现的特色功能: 1.2思路: 使用的数据库: 我们要实现多功能下拉框的形式选择可以参考原文档:https://hnzzmsf.github.io/example/example_v4.html#down…

Java-方法的使用

目录 一、方法的概念和使用 1.1方法的含义 1.2 方法的定义 1.3方法调用的执行过程 1.4实参和形参的关系 1.5没有返回值的方法 二、方法重载 2.1方法重载的含义 2.3 方法签名 三、递归 3.1 递归的概念 3.2递归的执行过程 3.3递归练习 一、方法的概念和使用 1.1方法的含义 方…

无符号数和有符号数的“bug”

1. 起因 在实现kmp算法时&#xff0c;出现了诡异的现象&#xff0c;看下面的代码&#xff1a; int KMP (const char *s, const char *t) {int lenS strlen (s);int lenT strlen (t);int next[lenT];get_next (next, t);int i 0;int j 0;while (i < lenS && j …