Android性能优化之游戏收敛线程,减少OOM发生(epic 检测线程调用/booster减少常驻线程超时销毁)

这篇具有很好参考价值的文章主要介绍了Android性能优化之游戏收敛线程,减少OOM发生(epic 检测线程调用/booster减少常驻线程超时销毁)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

先来了解下一个空白app的进程中线程数量:

分析迷你世界中app线程之前,先来了解下空白app ,中线程情况:

一个空白app的线程大概是27个:

Android性能优化之游戏收敛线程,减少OOM发生(epic 检测线程调用/booster减少常驻线程超时销毁),Android性能优化,android,性能优化,游戏
一个空白的的app,包含FinalizerDaemon线程、FinalizerWatchd线程、RenderThread、主线程、ReferenceQueued、HeapTaskDaemon、SignalCatcher、GCDaemon、hwuiTask。
Android性能优化之游戏收敛线程,减少OOM发生(epic 检测线程调用/booster减少常驻线程超时销毁),Android性能优化,android,性能优化,游戏

游戏中进程线程状况

游戏的进程中线程数大概在200个左右
Android性能优化之游戏收敛线程,减少OOM发生(epic 检测线程调用/booster减少常驻线程超时销毁),Android性能优化,android,性能优化,游戏
为了搞清楚这些线程分别是来源于哪个模块,哪个sdk ,因此考虑采用epic hook thread ,在其调用启动的打印调用栈。

这里以mobpush推送的线程为案例

Mobpush sdk 的线程,带有M-前缀的线程名:
Android性能优化之游戏收敛线程,减少OOM发生(epic 检测线程调用/booster减少常驻线程超时销毁),Android性能优化,android,性能优化,游戏
Android性能优化之游戏收敛线程,减少OOM发生(epic 检测线程调用/booster减少常驻线程超时销毁),Android性能优化,android,性能优化,游戏
按线程名和调用栈,去统计每个模块/sdk中情况,这里列举几个线程大户的sdk。

推送sdk带来的线程
Android性能优化之游戏收敛线程,减少OOM发生(epic 检测线程调用/booster减少常驻线程超时销毁),Android性能优化,android,性能优化,游戏
x5浏览器sdk 带来的线程
Android性能优化之游戏收敛线程,减少OOM发生(epic 检测线程调用/booster减少常驻线程超时销毁),Android性能优化,android,性能优化,游戏
广告带来的线程:
Android性能优化之游戏收敛线程,减少OOM发生(epic 检测线程调用/booster减少常驻线程超时销毁),Android性能优化,android,性能优化,游戏

目前游戏中线程优化的棘手点

  • Android 带有的消息异步线程:HandlerThread或者带有loooper的线程占有常驻线程,无法处理。
  • 存在广告sdk和x5 中存在热加载的外来dex,无法进行优化。
  • c++ (即游戏侧)中走的pthread库,目前无法监控,处理。

领导也是给到压力,要优化线程数,减少线程数

线程优化方案

为了进一步减少线程 OOM的发生,采用对线程池(常驻的核心线程)进行超时销毁策略。

1.针对自身业务的线程池进行优化
  • 尽量使用kotlin协程或者rxjava 等,减少常驻的线程池
  • 对线程池组件的线程池,也设置核心线程可关闭
    Android性能优化之游戏收敛线程,减少OOM发生(epic 检测线程调用/booster减少常驻线程超时销毁),Android性能优化,android,性能优化,游戏
对第三方sdk或开源库中线程池,使用Booster 进行优化

重点:让空闲的核心线程结束,当下次有任务会再次创建线程,这是一种有效的收敛线程的解决方案,booster 对整个apk 中线程代码进行替换优化。

在根目录的build中使用方式:

classpath "com.didiglobal.booster:booster-transform-thread:$booster_version"

通过对编译apk 进行查看,booster 对线程做了哪些逻辑操作:

1.将每个线程添加了添加了名字,方便追踪问题
Android性能优化之游戏收敛线程,减少OOM发生(epic 检测线程调用/booster减少常驻线程超时销毁),Android性能优化,android,性能优化,游戏
2.是将一些keepAliveTime>0的线程,设置允许核心线程数结束。
对ThreadPoolExecutor的匿名类进行替换,允许核心线程超时结束。
Android性能优化之游戏收敛线程,减少OOM发生(epic 检测线程调用/booster减少常驻线程超时销毁),Android性能优化,android,性能优化,游戏
Android性能优化之游戏收敛线程,减少OOM发生(epic 检测线程调用/booster减少常驻线程超时销毁),Android性能优化,android,性能优化,游戏
对AsyncTask 线程池设置,允许核心线程超时结束。
Android性能优化之游戏收敛线程,减少OOM发生(epic 检测线程调用/booster减少常驻线程超时销毁),Android性能优化,android,性能优化,游戏
对Executors中 newCachedThreadPool()、newSingleThreadExecutor()、newScheduledThreadPool() 三种线程池进行优化,允许核心线程超时结束。
Android性能优化之游戏收敛线程,减少OOM发生(epic 检测线程调用/booster减少常驻线程超时销毁),Android性能优化,android,性能优化,游戏
重点:让空闲的核心线程结束,当下次有任务会再次创建线程,这是一种有效的收敛线程的解决方案,booster 对整个apk 中线程代码进行替换优化。

优化后的效果

经过以上方式,游戏的线程数量稳定在192左右,大概能减少常驻核心线程10多个。
Android性能优化之游戏收敛线程,减少OOM发生(epic 检测线程调用/booster减少常驻线程超时销毁),Android性能优化,android,性能优化,游戏

后期也会考虑使用多进程的方式,将线程大户的sdk放到单独进程中去,比如web进程,减少主进程中线程压力,毕竟一个线程占用1M的虚拟内存。

若是考虑黑科技优化线程,可使用腾讯的matrix 和阿里阿里开源 Patrons,进一步优化。文章来源地址https://www.toymoban.com/news/detail-619322.html

到了这里,关于Android性能优化之游戏收敛线程,减少OOM发生(epic 检测线程调用/booster减少常驻线程超时销毁)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 计算机体系结构基础知识介绍之缓存性能的十大进阶优化之关键词优先和提前重启以减少失误处罚、合并写入缓冲区以减少惩罚(五)

    处理器通常一次只需要缓存块中的一个字(word)。不要等待整个块被加载,而是在请求的字到达后就立即发送给处理器,并让处理器继续执行,同时填充块中的其他字。这两种具体的策略是: 优先(Critical word first)——从内存中先请求缺失的字,并在它到达后立即发

    2024年02月13日
    浏览(50)
  • 计算机体系结构基础知识介绍之缓存性能的十大进阶优化之减少命中时间和流水线访问和多组缓存增加带宽(三)

    路预测是一种高速缓存优化技术,它在高速缓存中保存额外的位来预测下一次高速缓存访问的路(或者组内的块)。这种预测可以提前设置多路选择器来选择期望的块,并且在那个时钟周期内,只进行一次标记比较,同时读取高速缓存数据。如果预测正确,高速缓存访问延迟

    2024年02月12日
    浏览(47)
  • 游戏性能优化

    Unity性能优化主要包括以下方面: 1 .渲染性能 。包括减少Draw Calls、减少三角面数、使用LOD、使用批处理技术、减少实时光源等,以提高游戏的帧率和渲染效率。 2. 内存性能 。包括使用对象池、使用合适的纹理、使用异步加载资源等,以减少内存占用和提高游戏的流畅度。

    2024年02月09日
    浏览(37)
  • Python 性能优化|多线程读取文件

    多进程可以实现逐行遍历同一个文件(可以保证每一个进程遍历的行都是完整且互不重复的),且可以提高遍历性能。 多进程 / 多线程遍历文件速度 单进程、多线程读取同一个文件时,每个线程的运行时间并不能随线程数的增加的降低; 多进程读取同一个文件时,每个进程

    2024年02月09日
    浏览(41)
  • 游戏中UI的性能优化手段

    UI方面有许多性能优化的技术或手段,以下是其中一些常见的例子: 惰性加载:对于长列表、大图等需要加载大量数据和资源的组件,可以采用惰性加载的方式,即在用户需要时再进行加载。这样可以减少初始加载时间和内存占用,提高页面响应速度和用户体验。 虚拟滚动:

    2024年02月05日
    浏览(35)
  • GOT Online|解密游戏性能优化秘籍

    随着UWA GOT Online功能的不断迭代,GOT Online为解决各种游戏性能问题(如内存占用、CPU耗时、GPU耗时和卡顿)提供了丰富的高效、准确且便捷的数据获取方式和分析建议。本文总结了GOT Online(SDK 2.4.7版本)中的关键优化要点,涵盖了数据获取、数据分析和性能优化等方面。不论

    2024年02月16日
    浏览(43)
  • 【Java 基础篇】Java多线程编程详解:线程创建、同步、线程池与性能优化

    Java是一门强大的编程语言,其中最引人注目的特性之一是多线程支持。多线程允许我们在同一程序中同时执行多个任务,这大大提高了应用程序的性能和响应能力。本文将深入介绍Java线程的基础知识,无论您是初学者还是有一些经验的开发人员,都将从中获益。 在计算机科

    2024年02月07日
    浏览(57)
  • Unity游戏开发客户端面经——性能优化(初级)

    前言:记录了总6w字的面经知识点,文章中的知识点若想深入了解,可以点击链接学习。由于文本太多,按类型分开。这一篇是 性能优化 常问问题总结,有帮助的可以收藏。 性能优化,主要聚焦在 内存、 CPU、GPU 三大方向上。 1.1 详细介绍    Unity内存占用组成 Unity(基本

    2024年03月22日
    浏览(61)
  • 游戏性能优化指南:如何最大程度提升Unity游戏的帧率和流畅度

    FPS (Frames per Second):显示当前游戏帧率。帧率越高,游戏画面越流畅。为提高帧率,可减少游戏对象数量、优化渲染方式等。 Draw Calls :显示当前帧需要渲染的次数。过多的Draw Calls会导致游戏运行缓慢。降低此指标可通过优化场景、材质或使用批处理技术等方式。 Tris :显

    2024年02月06日
    浏览(88)
  • webWorker解决单线程中的一些小问题和性能优化

    js是单线程这是大家都知道,为了防止多个线程同时操作DOM,这个导致一个复杂的同步问题。比如,假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准。 web worker是 HTML5 标准的一部分,这一规范定义

    2024年02月21日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包