Android内存优化项目经验分享 兼顾效率与性能

背景

        项目上线一段时间后,回顾重要页面 保证更好用户体验及生产效率,做了内存优化和下载导出优化,具体效果如最后的一节的表格所示。

下面针对拍摄流程的两个页面 预览页 导出页优化实例进行介绍:

一.拍摄前预览页面优化

预览效果问题 存在内存回收不及时情况

问题描述

在预览页面两分钟的情况时: 内存回收不及时 会持续上涨到阈值 才会触发回收情况

对比图

处理前 AddCaptureActivity

处理后 AddCaptureActivity

原因

预览图未及时清除 到达阈值的时候才会回收

解决方案

对临时预览图不光置空 还要对其标记回收

效果

减少40%常驻值

后续提升

针对低性能设备可以降低预览视频 帧率及分辨率

二.拍摄保存页面

目标

业务目标:在减少导出时间 减少预览加载时间

技术目标:兼顾效率的情况下内存优化

现状

进入页面会加载预览图(全屏可滑动的全景图 ),点击下方保存按钮会下载图片。

需要导出的图片规格 6720x3360

预览组件

在compose下用个webview实现 下载好了图片转为base64通过js桥传到web中 web中负责渲染

组件布局
加载的具体实现

下载组件

通过网络请求对数据下载 默认重试时间10s 失败有toast提示 成功返回房源编辑页面

内存情况

内存常驻值为628 峰值780

内存情况

现状总结

现状情况总结:预览组件和下载导出是独立的组件

优点:独立进行加载 保证了两个业务相互独立 可以在没有预览的情况下 仍能够正常导出

缺点:导出时间长 且没有及时反馈,10s重试、占用内存峰值高

整改

第一步 打通两个组件的加载逻辑 实现缓存共用

打通两个组件的加载逻辑 实现缓存共用 实现以空间换时间实现速度提升,就是将预览组件的缓存 在导出的时候使用。

措施

通过图片缓存框架进行通过控制图片加载、缓存机制,减少无用开销、提升图片复用情况。

效果

导出速度显著提升,但是内存波动大、处在此页面时内存一直处于高位。

第二步 针对内存情况进行优化

分析

经过分析:

内存高位: 导出后bitmap在内存中并没有及时回收、缓存数据缓存了原始数据及对应UI组件大小的缩放资源

内存波动大:导出时io操作 读取bitmap 且本身io操作就会占用一定量的内存

措施
  1. 导出时 将从glide中读取bitmap保存文件后临时变量标记回收,改为获取flie形式直接copy到指定目录中。
  2. 不再缓存解码后的数据、避免浪费资源。
    diskCacheStrategy(DiskCacheStrategy.DATA)
  3. 减少预览渲染的图片大小 不展示原始图片、降低分辨率。、
  4. 在compose中及时销毁webview
    DisposableEffect(webView) { onDispose { webView?.destroy() // 销毁WebView } }
glide 磁盘缓存描述

总体流程改造后的效果

拍摄数量大于40张+,

时期

内存

效果

导出时间

优化前

内存常驻值为628 峰值780

z1 3s

SC2 弱信号下导出23.36s 正常导出 5s内

优化中

导出速度显著提升,但是内存波动大、处在此页面时内存一直处于高位。

7ms

优化后

房源编辑页常驻值为530~550

拍摄预览页为550~560

拍摄保存页内存为588~600

峰值670

7ms

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

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

相关文章

试试前端自动化测试(基础篇)

众所周知的原因,前端作为一种特殊的 GUI 软件,做自动化测试困难重重。在快速迭代,UI 变动大的业务中,自动化测试想要落地更是男上加男 🐶。 近期的学习过程中,翻阅了众多前端自动化测试相关的文章&#xf…

【兆易创新GD32H759I-EVAL开发板】 关于LVGL 的内存配置

【兆易创新GD32H759I-EVAL开发板】拥有外部32MB的 SDRAM 在使用LVGL时 可以随意分配大小 但是我们也应该明白 所定义的内存大小的 的一些概念 LVGL中 有单独的 定义 LV_MEM_SIZE 定义内存大小 LVLG 中 在定义 显示程序 接口时 还需要用到 lv_disp_draw_buf_init() 分配显存…

MyBatis框架解析与优化

MyBatis 是一个半 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。 什么是 MyBatis? MyBatis 是一个半…

【3D reconstruction 学习笔记】

三维重建 3D reconstruction 1. 相机几何针孔相机摄像机几何 2. 相机标定线性方程组的解齐次线性方程组的解非线性方程组的最小二乘解透镜相机标定带畸变的相机标定 3. 单视图重建2D平面上的变换3D空间上的变换单视测量无穷远点 无穷远线 无穷远平面影消点 影消线单视重构 4. 三…

天艺制盖邀您参观2024第七届世界燕窝及天然滋补品博览会

2024第七届世界燕窝及天然滋补品博览会 2024年8月7-9日| 上海新国际博览中心 上海燕博会 世界燕窝及天然滋补品展览会暨世界滋补产业生态发展大会(简称上海燕博会),2017年创办于中国上海,是一年一度的世界燕窝滋补品行业盛会。…

宁波中墙建材施工过程中,如何确保陶粒复合砌块的垂直度和水平度符合要求?

宁波中墙建材陶粒复合砌块如何使用 确保陶粒复合砌块施工质量的建议: 基层处理:在施工前,确保基层干净、平整、坚固,去除表面的杂物和油污等。 砌块质量:选择质量好、尺寸规格一致的陶粒复合砌块,避免使用有…

【串口开发】android 智能设备开发 知识笔记

1.一般的波特率选择115200,自己玩的可以用9600等随便的 2.为了android方便操作,引入了 implementation com.licheedev:android-serialport:2.1.3包。 不然就得手写了,比如像这样 ,打开串口监听 // 打开串口boolean openSerialPort = mSerialPortManager.setOnOpenSerial…

每天一个数据分析题(二百二十八)

在超参数调参的各种方法中,贝叶斯优化搜索(Bayesian Optimization)是一种非常有效的方法。请问在贝叶斯搜索中,用于估计目标函数并为下一次迭代提供建议的模型是什么? A. 线性回归 B. 随机森林 C. 高斯过程 D. 神经网络 题目来源于CDA模…

vue js有哪些优点和缺点

Vue.js 是一个流行的前端 JavaScript 框架,用于构建用户界面和单页面应用。以下是 Vue.js 的一些主要优点和缺点: 优点: 轻量级和简洁:Vue.js 的核心库专注于视图层,并且非常轻量,这使得它可以很容易地与其…

java算法题每日多道六

138. 随机链表的复制 题目 给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对…

JS异步操作

点击按钮触发onScan函数,函数调用扫描二维码这个异步操作后,需要扫描二维码的函数返回结果,可以用Promise来实现。Promise对象状态变为resolved(成功)或rejected(失败),然后将解决&a…

运放PSRR与开关电源纹波分析的实际案例分享!

本文来自看海原创视频教程:《运放秘籍》运算放大器基础精讲及应用第一部*开天 微信公众号:工程师看海 【淘宝】https://m.tb.cn/h.5PAjLi7?tkvmMLW43KO7q CZ3457 「运放秘籍_运算放大器Multisim仿真视频教程第一部开天_工程师看海」 点击链接直接打开 …

前端逻辑错误或UI崩溃解决问题

全屏错误覆盖层或UI崩溃 VueReact(错误边界) Vue Vue的全屏错误覆盖层解决,其实只需要配置Error就好,在开发服务器的client.overlay中设置关闭全屏覆盖层 module.exports {devServer: {client: {overlay: {warnings: false,error…

安卓面试题多线程41-45

41. Java中都有哪些同步器?1.synchronized关键字   在Java中,使用synchronized关键字可以对代码块或方法进行同步,使得在同一时刻只有一个线程可以执行该代码块或方法。   下面是一个使用synchronized关键字同步的示例代码: public class SynchronizedExample {private…

Android下的Touch事件分发详解

文章目录 一、事件传递路径二、触摸事件的三个关键方法2.1 dispatchTouchEvent(MotionEvent ev)2.2 onInterceptTouchEvent(MotionEvent ev)2.3 onTouchEvent(MotionEvent event) 三、ViewGroup中的dispatchTouchEvent实现四、总结 在Android系统中,触摸事件的分发和…

k8s入门到实战(一)—— kubernetes概述

k8s 概述 k8s github地址:https://github.com/kubernetes/kubernetes 官方文档:https://kubernetes.io/zh-cn/docs/home/ k8s,全程是 kubernetes,这个名字源于希腊语,意为"舵手"或"飞行员” k8s 这…

mysql忘记root密码

一、用安全模式启动mysql 在 my.ini(windows的安装目录)或 /etc/my.cnf(linux) 的最后一行添加 skip-grant-tables1 重启mysql服务 systemctl restart mysqld 二、创建admin用户 免密码使用root登录进去 $ mysql -uroot 创建…

启动性能优化

一、应用启动慢的原因 1.在主线程执行了太多耗时的操作,比如加载数据,或者初始化三方库等等,导致在Application的oncreate或者Activity的oncreate方法中耗时太久 2.布局嵌套太深,或者一些不会立即使用的布局也在一开始一起加载到…

Linux-Miniconda安装

下载miniconda安装文件 get "https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh" -O ~/miniconda.sh 如果是其它系统或者架构,访问地址获取对应安装脚本: https://mirrors.tuna.tsinghua.edu.cn…

Offlian RL: Weighted Policy Constraints for Offline Reinforcement Learning

AAAI 2023 paper Intro 分布偏移导致离线RL对于OOD数据存在过估计问题。因此一些方法限制策略靠近行为策略。但是着很大程度受限于数据集的质量。若是数据集存在非专家,一个自然的问题是是否有可能构建一个更合理的策略约束方法,该方法通过识别数据集中…