“ 在当今内卷的时代,内耗可能比内卷更可怕。因为内卷是关于人与人之间的竞争,但内耗更像是一个人和自己的斗争。处在“内耗”状态的人,活在无休止的自我怀疑中,反刍过去、忧虑未来。消耗我们的动力,阻碍我们的行动。作为一个高敏感的人,小编也时常会沉浸在自己的世界里反复回忆一些让自己不快的细节,把自己搞的身心俱疲,不过我开始行动,慢慢的尝试着与自己和解,接受自己的不完美,臣服于现实的此时此刻。拒绝内耗,让我快乐!”
01
用于GPU合成的GraphicBuffer的数量
在前面的文章中曾经讲到过,对于Composition Type标记为CLIENT的图层是会先由GPU进行合成,存放到GraphicBuffer中,然后再通过调用HWC的setClientTarget方法把数据传递给HWC完成最后的合成与显示。
具体信息可以查看早前文章:
Android Graphics 显示系统 - SurfaceFlinger的GPU合成(廿一)
开机初始化阶段,会收到display hotplug事件,从而触发创建用于GPU合成的BufferQueue的流程,大概如下:
那在多屏的情况下,会接收到几次hotplug事件?创建几个BufferQueue服务于GPU合成?每个BufferQueue会分配几个GraphicBuffer呢?
有以下几个结论:
-
有几个屏幕就有收到几次hotplug事件;
-
有几个屏幕就会创建几个BufferQueue来服务于每个屏幕的GPU合成;
-
每个BufferQueue默认分配2个buffer或根据下面属性值决定
ro.surface_flinger.max_frame_buffer_acquired_buffer
02
验证
为了验证上面的结论,我们需要按照之前文章提供的方式搭建一个多屏的环境,可以参考文章:
Android Graphics 显示系统 - 如何模拟多(物理)显示屏?
这里我们模拟三个屏幕的状况,启动模拟器时,指定参数:
--display0=width=720,height=1280
--display1=width=1920,height=1080
--display2=width=720,height=960
我们这里模拟的是一个3屏幕的车机系统automotive
为了便于观察,我设定了每个屏幕都是不同的size,同时,做完adb root & adb remount后,手动补上属性值,让每个屏幕分配3块GraphicBuffer
echo ro.surface_flinger.max_frame_buffer_acquired_buffers=3 >> /vendor/build.prop
准备工作就绪,我们可以执行adb reboot重新开机并且抓取开机logcat了!
先看开机logcat
3块屏幕对应收到3次hotplug事件
//第一次 display:0
04-16 03:06:48.460 403 403 I RanchuHwc: registerCallback hotplug connecting display:0
04-16 03:06:48.460 492 492 I SurfaceFlinger: onComposerHalHotplug(0, connected)
//第二次 display:1
04-16 03:06:48.464 403 403 I RanchuHwc: registerCallback hotplug connecting display:1
04-16 03:06:48.464 492 492 I SurfaceFlinger: onComposerHalHotplug(1, connected)
//第三次 display:2
04-16 03:06:48.485 403 403 I RanchuHwc: registerCallback hotplug connecting display:2
04-16 03:06:48.485 492 492 I SurfaceFlinger: onComposerHalHotplug(2, connected)
再看看SurfaceFinger源码
阅读原文
Android Graphics 多屏同显/异显 - 多屏时用于GPU合成的GraphicBuffer数量
关注公众号获取更多Android Graphics知识解析