本文参考:https://source.android.com/devices/graphics/architecture

流程

一、无论开发者使用什么渲染 API,一切内容都会渲染到Surface。(常见API:canvas,openGL)
二、Surface把图像流缓存到buffer queue
三、SurfaceFlinger 从多个buffer queue中去获取图像流执行合并操作
四、 Hardware Composer 去获取SurfaceFlinger缓存的内容实现上屏操作

一、OpenGL渲染流程

这个流程网上讲解很多,此处就不多加篇幅了:
1、读取顶点数据
2、执行顶点着色器
3、组装图元
4、光栅化处理
5、片段着色器(这里涉及常见的二次线性插值,抗锯齿等)

二、为什么Surface要有个缓冲区

试想一下,Surface同时会发生有读写操作,如果没有缓冲区,那么就只能加锁。
举个例子,当SufaceFlinger去获取Surface的图像流时,因为锁的原因阻塞住了,那么整个合并的操作就会阻塞住,用户所看到的就是整个屏幕卡住了,这显然是不合理的。
比如,此刻有两个Surface,一个是状态栏的Surface,一个是主屏幕的Surface,当主屏幕因为逻辑原因卡住的时候,那么不应该会影响到状态栏。

三、为什么要有SurfaceFlinger的合并操作

一句话其实就是“不能没有统一管理”。
图像流上屏时,对于硬件来讲,它并不知道哪一部分属于哪个View或者属于哪个进程,它只会每一帧将整个屏幕中的所有像素刷新。
试想如果每个进程或者每个View都不需合并直接去操作进程,那么很可能一个View正在上屏,而另一个View就发来了上屏请求,屏幕很可能上一个View还没更新完,就要开始更新下一个,那么就会出现帧撕裂的情况,如下图:

四、上屏显示的过程

这个过程下面的文章讲的很不错,此处直接附上文章地址:
https://blog.csdn.net/michaelcao1980/article/details/43233765

下图摘自该文章:

更多相关文章

  1. 关于Android中Dialog点击屏幕外失去焦点消失的问题
  2. Android重写HorizontalScrollView仿ViewPager效果
  3. Android(安卓)开发 res里面的drawable(ldpi、mdpi、hdpi、xhdpi
  4. android 存储文件到sdcard下
  5. (Mac)反编译Android(安卓)APK详细操作指南[转]
  6. 【Android(安卓)开发教程】在服务中执行耗时操作
  7. Android之循环队列操作
  8. Android开发之ViewFlipper
  9. android操作SQLite

随机推荐

  1. Android系统移植与调试之------->如何修
  2. cocos2dx 遮罩层 android 手机上 失败
  3. Android中ListView滚动时上下的那一抹色
  4. android 电话拨号器
  5. Android模拟器运行速度很慢的解决办法
  6. Google Maps Android(安卓)API v2 (googl
  7. 错误总结1,动态加载部分不能显示的原因
  8. android tv基础之焦点(二)
  9. Android(安卓)捕获运行时异常详解
  10. JNI开发第二步:20130726 NDK_JNI使用