Androidflinger-simmer_ken的专栏-CSDN博客
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Androidflinger-simmer_ken的专栏-CSDN博客Android flinger 收藏
在android中,屏幕(framebuffer)被看成为一个device,文件/sys/power/wait_for_fb_sleep和/sys/power/wait_for_fb_wakeup 被kernel用来通知framework屏幕挂起或恢复了。
在framework中有两个线程,一个是画图的主线程,在循环中它会首先检查kernel的事件通知信号并设置framebuffer是否可画,下面是示意性的framework代码:
1.1 . surface flinger thread:
2.while ( true ) {
3.checkEventAndSendSignal();
4.doSomeThing();
5.if (canDraw) {
6.swapBuffer();
7.}
8.}
9.2 .check event function
10.checkEventAndSendSignal() {
11.if (wait_for_sleep returned) {
12.canDraw = false ;
13.mBarrier.open();
14.}
15.if (wait_for_wakeup returned) {
16.canDraw = true ;
17.}
18.}
19. 3 .drawing function
20.swapBuffer() {
21......
22.ioctl(egl_native_window_t::fd, FBIOPUT_VSCREENINFO, &mInfo)
23.....
24.}
25. 4 .getEvent thread
26.while ( true ) {
27.wait_for_sleep();
28.sendSleepReturnEvent();
29.mBarrier.wait();
30.wait_for_wakeup();
31.sendWakeupReturnEvent();
32.}
当屏幕可用时,kernel会block getEvent线程在wait_for_sleep(read(wait_for_fb_sleep file))调用上,直到屏幕不可用(用户关闭屏幕,变黑);当屏幕不可用(挂起),kernel会block getEvent线程在wait_for_wakeup(read(wait_for_fb_wakeup file))调用上,直到屏幕可用。
在挂起屏幕前(wait_for_wakeup)mBarrier用来同步surfaceflinger线程画完上次循环未完成的framebuffer。