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

news2024/9/24 11:30:12

近期,着手对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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java Servlet实现下拉选择查询(双表)和单列模式

0目录 1.Servlet实现下拉选择查询(双表) 2.单列模式 1.Servlet实现下拉选择查询(双表) 新建数据库和表 实体类 接口方法 实现接方法 Servlet类 Web.xml List.jsp 页面效果 加入功能 2.单列模…

批发零售进销存哪个好?盘点5款主流批发零售进销存软件!

在我看来,几乎没有批发零售行业不需要做进销存管理,哪怕是路边一个小摊贩,也需要做进销存管理,但是传统的进销存过程中存在很多问题: 前后方协作困难:采购/销售/财务工作相互独立,工作入口不一…

机器学习深度学习——多层感知机

👨‍🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习&&深度学习——感知机 📚订阅专栏:机器学习&&深度学习 希望文章对你们有所帮助 上一节…

Java阶段五Day14

Java阶段五Day14 文章目录 Java阶段五Day14分布式事务整合demo案例中架构,代码关系发送半消息本地事务完成检查补偿购物车消费 鲁班周边环境调整前端启动介绍启动前端 直接启动的项目gateway(网关)login(登录注册)atta…

DSA之图(4):图的应用

文章目录 0 图的应用1 生成树1.1 无向图的生成树1.2 最小生成树1.2.1 构造最小生成树1.2.2 Prim算法构造最小生成树1.2.3 Kruskal算法构造最小生成树1.2.4 两种算法的比较 1.3 最短路径1.3.1 两点间最短路径1.3.2 某源点到其他各点最短路径1.3.3 Dijkstra1.3.4 Floyd 1.4 拓扑排…

数据库表结构导出成文档

1.需求说明 在系统交付的过程中,有时候需要交付数据库的表结构,如果系统做的比较大,比如几百张表的时候,靠人力一张表一张的写,那就是一个奔溃啊。所以今天特意找了一下工具,小巧安装。比较好用。 2.安装…

新型恶意软件DecoyDog正大规模入侵DNS

安全厂商 Infoblox 的调查研究显示,一个名为 DecoyDog(诱饵狗)的复杂恶意工具包通过域名系统(DNS),从事网络间谍活动已达1年以上。 目前尚不清楚该恶意软件的幕后黑手是谁,但 Infoblox 的研究人…

通过REST API接口上传Nexus仓库

一、Nexus API文档 API文档链接:Components API 二、上传API接口说明 在Nexus中可以直接调试api接口,url参考:http://localhost:8081/#admin/system/api 三、上传请求案例 $ curl -X POST "http://localhost:8081/service/rest/v1/c…

营销系统积分数据库设计

营销系统总体数据-业务功能模型 在当今日益竞争的市场中,如何提高客户留存率和忠诚度,已成为各大企业迫切需要解决的问题。而积分商城/系统作为一种新型的营销方式,受到青睐。 积分商城/系统是指将用户在使用产品或服务时产生的积分&#xf…

2023扩散模型最新技术进展汇总

随着Stable Diffusion和Midjourney等图像生成模型的爆火,今年在模型领域,扩散模型稳占主导地位。因此,与之相关的新技术也层出不穷,短短1个月,扩散模型相关的论文就有上百篇了,可见其发展的火热趋势。 这次…

java注解@FeignClient修饰的类路径不在spring boot入口类所在的包下,有哪几种处理方式?

一、注解EnableFeignClients 修饰在spring boot入口类&#xff0c;使得openfeign的FeignClient注解生效。 我们进一步看看注解EnableFeignClients的使用方式。 String[] basePackages() default {};Class<?>[] basePackageClasses() default {};Class<?>[] clie…

额外题目第1天|1365 941 1207 283 189 724 34 922 35 24

1365 暴力解法也能过 class Solution { public:vector<int> smallerNumbersThanCurrent(vector<int>& nums) {vector<int> result(nums.size(), 0);for (int i0; i<nums.size(); i) {int count 0;for (int j0; j<nums.size(); j) {if (nums[j]<…

互联网时代,企业经营管理面临的挑战有哪些?

随着科学技术的进步和社会经济的发展&#xff0c;大数据已经被应用到各个行业领域中&#xff0c;尤其在企业经营管理方面。通过对企业内部数据信息的利用&#xff0c;企业内部经营管理能力得到提升&#xff0c;那么在大数据时代&#xff0c;企业经营管理面临的挑战有哪些呢&…

C/C++几个关键知识点记录

1.将一个数值作为函数执行 (*(void(*)())0x13)();同理也可以将数值换成一个变量&#xff1a; int var0x13; (*(void(*)())var)();2.断言assert 用于判断输入的参数是否正确&#xff0c;实际就是判断输入的参数是否为0&#xff0c;如STM32的固件库中常用的assert_param()&…

Ceph入门到精通- Linux 磁盘管理(block 与 inode)

1 硬盘 block 与 inode 详解 1.1 Sector&#xff08;扇区&#xff09;与 Block&#xff08;块&#xff09; 1&#xff09; 硬盘的最小存储单位&#xff1a;sector&#xff08;扇区&#xff09;&#xff0c;每个扇区储存 512 字节&#xff1b;操作系统会一次性连续读取多个…

抖音短视频seo矩阵系统源码开发部署技术分享

抖音短视频的SEO矩阵系统是一个非常重要的部分&#xff0c;它可以帮助视频更好地被搜索引擎识别和推荐。以下是一些关于开发和部署抖音短视频SEO矩阵系统的技术分享&#xff1a; 一、 抖音短视频SEO矩阵系统的技术分享&#xff1a; 关键词研究&#xff1a;在开发抖音短视频SEO矩…

cvc-complex-type.2.4.a: 发现了以元素 ‘base-extension‘ 开头的无效内容。应以 ‘{layoutlib}‘ 之一开头。

✍️作者简介&#xff1a;沫小北&#xff08;专注于Android、Web、TCP/IP等技术方向&#xff09; &#x1f433;博客主页&#xff1a;沫小北 CSDN、51cto博客、稀土掘金、简书、知乎、开源中国、博客园、慕课网 &#x1f310;系列专栏&#xff1a;码农小北 &#x1f514;如果文…

防止连点..

1.连点js文件 let timer; letflag /*** 节流原理&#xff1a;在一定时间内&#xff0c;只能触发一次** param {Function} func 要执行的回调函数* param {Number} wait 延时的时间* param {Boolean} immediate 是否立即执行* return null*/ function throttle(func, wait 500…

[Java] 单例设计模式详解

模式定义&#xff1a;保证一个类只有一个实例&#xff0c;并且提供一个全局访问点&#xff0c;时一种创建型模式 使用场景&#xff1a;重量级的对象&#xff0c;不需要多个实例&#xff0c;如线程池&#xff0c;数据库连接池 单例设计模式的实现 1.懒汉模式&#xff1a;延迟…

牛客上面的约瑟夫环问题

对于本题 我感觉还是链表做起来舒服 数组也可以做 但是数组需要去控制循环 不太好控制 我之前搞了 最后看别人的实现 但是链表搞了一次就搞好了 香的嘞~ 下面是代码 用单链表实现循环 再去删除要删除的人 5个人 数到2 你们在纸上画图 我就不画了 对于数组实现你们可以去…