Android 绘制学习总结

1、刷新率介绍

我们先来理一下基本的概念:

1、60 fps 的意思是说,画面每秒更新 60 次

2、这 60 次更新,是要均匀更新的,不是说一会快,一会慢,那样视觉上也会觉得不流畅

3、每秒 60 次,也就是 1/60 ~= 16.67 ms 要更新一次
4、一般来说屏幕的刷新率是硬件概念,意思是1秒显示60张图片。如果屏幕分辨率为60HZ,应用程序设置的刷新率要小于或等于60HZ。

2、图层介绍

2.1、绘制介绍

在Android渲染系统中,⽣产者是应⽤进程,消费者是SurfaceFlinger进程,两个不同的进程数据的交换就涉及跨 进程通信,⽽服务它们跨进程通信的组件是BufferQueue。BufferQueue就像是⼀个桥梁,让原本孤⽴的应⽤进程 和SurfaceFlinger进程联系在⼀起,有了BufferQueue这个桥梁,图形显示系统基本架构可变成如下:

Perfetto中SurfaceFlinger图层数据显示如下

代码环节中,ViewRootImpl.java中的drawSoftware

函数中,使用mSurface.lockCanvas(dirty)来获取SurfaceFlinger缓冲区

在surface.unlockCanvasAndPost(canvas);来释放缓冲区

2.2、卡顿是如何生成的呢?

既然出现了生产者和消费者,那么不是16.7ms类相关流程没有完成,是否就会感受到卡顿?

参考https://perfetto.dev/docs/data-sources/frametimeline

查看Perfetto log时,绿色表示正常绘制,其他颜色表示没按时绘制。

当APP绘制时长超过30帧后,对应在Log中有如下打印。

当APP Choreographer中来不及绘制时,是否就出现了卡顿呢?

答案是不一定,这个涉及到Buffer缓冲区设计

2.3、 Triple Buffer

Buffer缓冲区设计具体得参考

https://blog.csdn.net/flc2762/article/details/122881577

3、参考文档网站

1、(二十二)Android应用框架之Activity · Android核心分析 · 看云

2、Android 基于 Choreographer 的渲染机制详解 · Android Performance

相关推荐
Flynt34 分钟前
升级Flutter 3.44,我踩了HCPP和AGP 9的坑
android·flutter·dart
白色牙膏1 小时前
Cocos Creator 2.4.x 接入 AdMob 插件的迁移实践
android
我命由我123453 小时前
C++ - 面向对象 - 常成员函数
android·java·linux·c语言·开发语言·c++·算法
tryqaaa_4 小时前
学习日志(四)【php反序列化魔术方法以及pop构造配实战】
android
Java小学生丶5 小时前
记录一下我的 Gradle 开发环境配置过程
android·java·gradle·maven·安卓
问心无愧05136 小时前
ctf show web 入门256
android·前端·笔记
霸道流氓气质6 小时前
MySQL 索引设计实战指南
android·数据库·mysql
R语言爱好者6 小时前
叠氮酸介绍
android
方白羽6 小时前
Android WebView 中实现第三方 QQ 登录的架构与流程详解
android·app
鹧鸪晏6 小时前
Android GLSurfaceView 完全指南
android·音视频开发