Android12 显示框架之SurfaceComposerClient创建

目录:Android显示终极宝典

SurfaceComposerClient是应用程序与SurfaceFlinger交互的客户端接口,在SurfaceFlinger服务端与之对应的名叫Client。SurfaceComposerClient和Client构成了应用程序和SurfaceFlinger之间进行交互的桥梁。每个SurfaceComposerClient在SurfaceFlinger都有一个Client实例一一对应,大概就如下面图里的样子。

应用程序要想创建surface并渲染图像提交合成显示等,第一步肯定要创建SurfaceComposerClient。

接下来就看看SurfaceComposerClient的创建过程。

new SurfaceComposerClient()

//frameworks/native/libs/gui/SurfaceComposerClient.cpp
SurfaceComposerClient::SurfaceComposerClient()
    : mStatus(NO_INIT)
{
}

void SurfaceComposerClient::onFirstRef() {
    sp<ISurfaceComposer> sf(ComposerService::getComposerService());
    if (sf != nullptr && mStatus == NO_INIT) {
        sp<ISurfaceComposerClient> conn;
        conn = sf->createConnection();
        if (conn != nullptr) {
            mClient = conn;
            mStatus = NO_ERROR;
        }
    }
}

SurfaceComposerClient构造函数啥也没做,主要工作都放在onFirstRef()中完成的。这里的ComposerService存在的意义是为了获取SurfaceFlinger的客户端代理,而刻意去隐藏这个获取的过程。然后直接调用SurfaceFlinger的createConnection()功能。

createConnection()

//frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp
sp<ISurfaceComposerClient> SurfaceFlinger::createConnection() {
    const sp<Client> client = new Client(this);
    return client->initCheck() == NO_ERROR ? client : nullptr;
}

//frameworks/native/services/surfaceflinger/Client.cpp
Client::Client(const sp<SurfaceFlinger>& flinger)
    : mFlinger(flinger)
{
}

目的很单纯,在SurfaceFlinger中创建一个Client,并且通过binder将它传到应用端保存起来。为什么要返回到应用端保存?一是以为这么做对应用来说只是举手之劳而且很合理,二是因为放在SurfaceFlinger中去一一甄别只会增大SurfaceFlinger的复杂度而得不偿失。Client与应用程序是一一绑定的,应用程序每次访问SurfaceFlinger时把它作为参数传递进来,SurfaceFlinger自然就知道是谁。

简单画个图总结一下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值