回顾一下Android的画面显示,我们可以理解为连载漫画的绘制,每个画家负责各自的区域(APP),在进行了设计,初步描绘之后,把一些基本操作比如画圆,直线,矩形之类的操作交给盖章的工人(GPU),盖章的工人很擅长做这个(渲染),通过盖章等方式来完成这些操作,
完成后,交给编辑人员(SurfaceFlinger)去进行合成,然后发布。
一张图完成之后,再绘制下一张图,由专人来协调这个周期(VSYNC)。
之前我们讨论过GraphicBuffer,作为画图的载体,体现在下面这个经典的图中的BUFFER QUEUE里,
现在再看看显示中的RenderThread相关处理,体现在上图中左侧app处的GPU 部分。
了解这个大概情况,就可以逐步去查看处理细节,显示系统的细节很多,我们需要从大到小去学习,知道大致框架后再去查看细节,比如Choreographer怎么实现的VSYNC回调,在开始的时候就没有太关注,(猜测和input事件发送,及sensor事件的发送类似)。
再查看下面的图,了解大致流程,
左下部分的RenderThread就是app中调用的渲染处理,
最后通过swapBuffer,把图像传给了SurfaceFlinger,
EGLBoolean egl_window_surface_v2_t::swapBuffers()
{
...
// 其实就是queueBuffer,queueBuffer这里用的是-1
nativeWindow->queueBuffer(nativeWindow, buffer, -1);
buffer = 0;
// dequeue a new buffer
int fenceFd = -1;
// 这里是为了什么,还是阻塞等待,难道是为了等待GPU处理完成吗?
// buffer换buffer
if (nativeWindow->dequeueBuffer(nativeWindow, &buffer, &fenceFd) == NO_ERROR) {
sp<Fence> fence(new Fence(fenceFd));
// fence->wait
if (fence->wait(Fence::TIMEOUT_NEVER)) {
nativeWindow->cancelBuffer(nativeWindow, buffer, );
return setError(EGL_BAD_ALLOC, EGL_FALSE);
}
...
参考资料:
DJLZPP
AndroidQ 图形系统(11)UI刷新,SurfaceFlinger,Vsync机制总结_DJLZPP的博客-CSDN博客