Android性能优化——卡顿优化

文章目录

  • 一、从XML到屏幕上的展示
    • 造成跳帧的因素有那些
    • 发现问题
    • 定位问题
    • 定位代码

一、从XML到屏幕上的展示

在这里插入图片描述

  1. 数据加载阶段

  2. 数据控制阶段

  3. 数据展示阶段
    xml —> view
    onCreat —> 解析layout.xml
    resume —> view —> wms
    ViewRootImpl
    UI 绘制流程 :测量 —> 布局 —> 绘制
    处理数据(CPU业务数据范围)

Android当中数据的生产依托两个硬件 :CPU/GPU
CPU处理的最常规的代码调用(指令),比如IO/线程/对象的分配
GPU处理图像数据的生成(算术)

Canvas是作为当前Android中的图像生产者
canvas.draw —> native —> C++ —> skia/opengl —> GPU的调用处理

Android Surface —> Java 画面的宽度 - 外框数据
Surface —> native canvas产生的图像数据是保存在底层的这个里面

canvas.draw

native这里给了一个队列空间,里面的空间是给Surface 使用

SurfaceFilnger Android真正和硬件沟通(调用驱动代码),给硬件(屏幕)提供数据

数据交给屏幕 —> 显示

FrameBuffer 帧缓冲区(驱动提供的一个容器)

设备性能因素问题

  1. CPU/GPU(制图速度)
    1秒钟可以生成多少张图像数据
    FPS —> 帧率
  2. 屏幕(刷新率)
    1秒钟能支撑多少次的图像变更

Android肯定不能放任随便推数据或者更新数据
需要节奏
vsync =垂直同步信号
1次刷新帧缓冲区的时机
SF —> 按自己的节奏去固定更新帧缓冲区
1秒 60帧的节奏刷新
1秒 = 1000ms
1000/60 = 16.66ms
SF —> 16.66ms启动一次帧缓冲区刷新

固定在刷新前判断图像数据是否准备好 —> 推送刷新

编舞者 - Choreographer 控制节奏
SurfaceFilnger 在发送垂直同步信号时不会去管其他人的因素

16.66ms节点,同时数据准备完成,刷新数据,没到16.66ms节点和过了节点都不更新
在这里插入图片描述
卡顿就是跳帧造成的
16ms主要处理两件事

  1. 将UI对象转换成多边形和纹理
  2. CPU传递数据到GPU,GPU进行绘制

造成跳帧的因素有那些

常规因素:
层级
过度绘制问题
写代码所造成的问题——卡顿原因不大

核心因素

  1. 内存引起的
  2. 线程引起的

STW停顿时间 Stop The World 停止所有工作线程,清理内存
等待时间片段
IO阻塞时间
锁阻塞时间

卡顿的本质是因为错过了垂直同步信号的时间

影响

  1. 常规影响
    层级以及过度绘制导致
  2. 内存影响
    STW现象导致(时间或是定义view的绘制时,new对象)
  3. 线程影响
    阻塞当前主线程的代码都会造成卡顿

发现问题

IT基础:内存管理,线程管理,网络,算法
android: 通信机制+andorid内部支撑他运作的多个进程之间的写作问题

定位问题

systrace : 找事故原因
大面积呈现状态:
大面积绿色:代码的时机运行时间确实超过了
层级多,代码里面写了耗时的,绘制出问题了
大面积紫色:代码里面有高频生产对象的代码(事件、draw)
大面积灰色:有锁的问题
大面积蓝色:系统资源不够
大面积橙色:有IO问题出现

定位代码

blockcannary

制图速度高于刷新速度就会出现
制图速度跟不上刷新速度

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

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

相关文章

计算机网络之数据通信原理

1.通信系统的基本组成 信源:信息的发出者; 信宿:信息的接收者; 载体:信息的传送通道; 变换器:将信息变换成载体上可传输的信号; 反变换器:将载体上传输的信号变换成信…

SpringBoot集成Druid数据库连接池并配置可视化界面和监控慢SQL

pom.xml <!-- Druid 数据库连接池 --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.23</version></dependency>application.yml spring:jackson:date-…

明星周边物品交易购物系统

摘 要 随着明星文化的兴起和粉丝经济的蓬勃发展&#xff0c;明星周边产品的市场需求日益增长。明星周边物品包括各种与明星相关的商品&#xff0c;如T恤、海报、手办、签名照等&#xff0c;它们成为粉丝们表达对明星喜爱和支持的方式之一。通过“星光璀璨”来形象化地表达明星…

基于Java技术的在线学习平台系统

开头语&#xff1a;你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;Java技术&#xff0c;基于SpringBoot框架 工具&#xff1a;Eclipse、Navicat、M…

Qt 学习(一) addressbook

Qt Demo: addressbook (1)创建项目&#xff1a;选择不创建界面&#xff0c;即UI&#xff0c;此时会自动生成的文件如图所示&#xff1a; QApplication&#xff1a; MainWindow 继承自 QMainWindow&#xff0c;根据需要设计的界面样式。 (2)确定MainWindow 的成员变量 首先&…

Jetpack架构组件_Navigaiton组件_1.Navigaiton切换Fragment

1.Navigation主要作用 方便管理Fragment &#xff08;1&#xff09;方便我们管理Fragment页面的切换 &#xff08;2&#xff09;可视化的页面导航图&#xff0c;便于理清页面间的关系。 &#xff08;3&#xff09;通过destination和action完成页面间的导航 &#xff08;4&a…

算尽天下财,铸就大明梦 —— 大明钱算子夏元吉的传奇一生

仕途生涯开始&#xff1a;洪武二十三年&#xff08;1390年&#xff09;&#xff0c;夏元吉因精通《诗经》&#xff0c;由湖广乡荐参加礼部组织的会试&#xff0c;虽未中举&#xff0c;但他并未气馁&#xff0c;反而更加努力地学习。洪武二十四年&#xff08;1391年&#xff09;…

通讯:单片机串口和电脑通讯

目录 1.串口输出数据到电脑 硬件部分 串口输出数据到电脑的软件软件部分&#xff1a; 相关问题&#xff1a; 2.单片机串口--485--485转USB--电脑 串口&#xff0c;芯片&#xff0c;转换器&#xff0c;设备之间的通讯的接线&#xff0c;都是要TX--RX, RX--TX 交叉连接。 单…

充电桩现场安装施工流程

摘要&#xff1a;在化石能源日益紧缩的今天&#xff0c;新能源车辆逐渐走进了千家万户&#xff0c;与传统化石能源车辆相比&#xff0c;以电驱动的新能源车辆能源利用率高&#xff0c;缩短了能源传递过程&#xff0c;实现了能源有效利用。根据能量守恒定律可知&#xff0c;任何…

V-Series Avalon-MM DMA Interface for PCIE IP核

目录 1. IP概述 2. Avalon-MM DMA Ports 3. 参数设置 3.1 系统设置 3.2 基址寄存器 (BAR) 设置 3.3 设备识别寄存器 3.4 PCI Express和PCI功能参数 3.4.1 Device Capabilities 3.4.2 Error Reporting 3.4.3 Link Capabilities 3.4.4 MSI and MSI-X Capabilities …

机器发货到菲律宾的完整流程 广东智慧物流

机器发货到菲律宾的完整流程 广东智慧物流 &#x1f31f;【机器发货到菲律宾完全攻略】&#x1f31f; 机器发货到菲律宾的完整流程 广东智慧物流 为你整理了一份超详细的机器发货到菲律宾的攻略&#xff01;海运14天轻松到达&#xff0c;让你无后顾之忧&#xff01;&#x1f…

uniapp地图点击获取位置

主页面 <view class"right-content" click.stop"kilometer(item)"><view class"km">{{item.distance||0}}km</view><image src"../../static/map.png" mode""style"width: 32rpx; height: 32rpx…

【Java Web】Servlet控制器

目录 一、Servlet简介 二、Servlet运行流程 三、Servlet开发流程 四、Servlet-api.jar包导入和Content-Type问题 4.1 Servlet-api.jar导入问题 4.2 Http报文头中的Content-Type属性 五、Servlet_url-pattern请求映射路径设置 5.1 url-pattern方式 5.2 注解方式配置servlet 六、…

QCC51XX---开启手机log日志

QCC51XX---系统学习目录_trbi200软件-CSDN博客 目录 1.Vivo 2.华为 3.小米 4.三星 5.oppo 1.Vivo *#*#112#*#* 输入命令后会进入log日志系统(由于版本原因,界面可能不同),打开log开关,log就会在后台自动录制。 点击设置,则可进入图1(右边)的界面,可以导出log,导出…

Golang | Leetcode Golang题解之第200题岛屿数量

题目&#xff1a; 题解&#xff1a; func numIslands(grid [][]byte) int {res : 0for i : 0; i < len(grid); i {for j : 0; j < len(grid[i]); j {if grid[i][j] 1 {resdfs(grid, i, j)}}}return res }func dfs(grid [][]byte, r, c int) {h, w : len(grid), len(gri…

面试题-CAS(compare and swap)

1.CAS机制 悲观锁&#xff1a;始终假定会发生并发冲突&#xff0c;因此会屏蔽一切可能违反数据完整性的操作。 乐观锁&#xff1a;假设不会发生并发冲突&#xff0c;因此只在提交操作时检查是否违反数据完整性。 执行CAS操作时&#xff0c;比较内存位置的值(主内存的值)与预期…

Labview_映射表

1.创建映射表 创建映射表时&#xff0c;该映射表内的所有键为同一类型、键为同一类型。映射表键名可以为任意类型。 PS:生成映射表在使用时请保证唯一键名&#xff0c;如使用同一键名&#xff0c;则在最终输出时只能搜索到最新插入的键值对信息。 2.插入映射表 按照已创建的映…

数据采集Selenium中的弹窗处理

在爬虫技术中&#xff0c;弹窗处理是一个常见但具有挑战性的问题。Selenium作为一个强大的网页自动化工具&#xff0c;可以帮助我们有效地处理网页中的各种弹窗。本文将概述如何使用Selenium处理弹窗&#xff0c;并提供实现代码&#xff0c;代码中将使用代理IP技术。 概述 弹…

网络编程基础知识拾遗:用大白话解释什么是交换机、路由器、光猫、IP地址和子网掩码、公网和内网IP、端口和域名

二层交换机 在没有二层交换机的环境中&#xff0c;两台电脑或多个电脑之间的通信主要依赖于直连方式或共享介质。假如你和你的舍友都有一台电脑&#xff0c;当你们之间想要进行通信的时候&#xff0c;在没有二层交换机的情况下&#xff0c;可以使用网线&#xff08;为了方便理…

btrace使用记录

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 未经允许不得转载 目录 一、导读二、使用三、 推荐阅读 一、导…