内容
Surface 是什么
Surface是Android图形系统的核⼼部分, 图形界⾯上的⼀个窗⼝或对话框等都对应着⼀个 Surface。
而这个Surface是⼀块绘制区域的抽象,它对应着Server服务端Surfacelinger中的⼀个图 层Layer,这个图层的背后是⼀块图形缓冲区GraphicBuffer,Client客⼾端的应⽤程序的UI使⽤软件 绘制、硬件绘制在Surface上各种渲染操作时,绘制操作的结果其实也就是在该图形缓冲区中。
Surface
是⼀个接口,供⽣产⽅与消耗方交换缓冲区。Surface
对象使应用能够渲染要在屏幕上显示的图像。⼤多数客户端使用 OpenGL ES
或 Vulkan
渲染到 Surface 上。
Surface 创建
先来看⼀张Surface创建的流程图
- Surface的创建与Window息息相关, 因此Surface的创建需要从Window的添加开始。 我们知 道, Window的添加是从
ActivityThread.handleResumeActivity
开始的, 此时会做⼀系列的动 作如: Session的创建(openSession), ViewRoot的创建(Global.addView
), Surface的创建 (ViewRoot中的Surface, 此时是⼀个空的), addWindow等。 addWindow
会创建⼀个WindowState
; WindowState表⽰⼀个窗⼝的所有属性,它是WMS中 事实上的窗⼝。 之后会调⽤attach()创建SurfaceSession, ,SurfaceSession 表⽰⼀个跟 SurfaceFlinger 的连接。- 从
ViewRoot.performTravels
开始, 在relayoutWindow中会先创建⼀个SurfaceControl
# base/core/java/android/view/SurfaceControl.java
private SurfaceControl(SurfaceSession session……) {
……
// note jin:返回 native SurfaceControl 指针
mNativeObject = nativeCreate(session, name, w, h, format, flags,
parent != null ? parent.mNativeObject : 0, metaParcel);
} finally {
metaParcel.recycle();
}
……
}
# base/core/jni/android_view_SurfaceControl.cpp
// note jin: native 创建 Surface
static jlong nativeCreate(JNIEnv* env,……) {
……
// note jin: client 即上创建的 SurfaceComposerClient 对象
sp<SurfaceComposerClient> client;
……
// note jin:
status_t err = client->createSurfaceChecked(
String8(name.c_str()), w, h, format, &surface, flags, parent, std::move(metadata));
……
return reinterpret_cast<jlong>(surface.get());
}
# native/libs/gui/SurfaceComposerClient.cpp
// note jin:
status_t SurfaceComposerClient::createSurfaceChecked(const String8& name,……) {
……
// note jin: 真正创建
err = mClient->createSurface(name, w, h, format, flags, parentHandle, std::move(metadata),&handle, &gbp);
……
}
# native/services/surfaceflinger/Client.cpp
// note jin: 真正创建 Surface
status_t Client::createSurface(const String8& name,……) {
// We rely on createLayer to check permissions.
return mFlinger->createLayer(name, this, w, h, format, flags, std::move(metadata), handle, gbp,parentHandle);
}
SurfaceControl创建在构造中伴随着Surface的创建, ⽽createSurface
的最终结果即是 SurfaceFlinger::createLayer
。
Surface 在 SurfaceFlinger 中对应的实体是 Layer 对象。 Surface创建完成后, 在WMS中调⽤getSurfaceControl
:
# base/core/java/android/view/Surface.java
public void copyFrom(SurfaceControl other) {
……
long surfaceControlPtr = other.mNativeObject;
……
setNativeObjectLocked(newNativeObject);
}
}
private void setNativeObjectLocked(long ptr) {
if (mNativeObject != ptr) {
……
mNativeObject = ptr;
mGenerationId += 1;
if (mHwuiContext != null) {
mHwuiContext.updateSurface();
}
}
}
nativeGetFromSurfaceControl
⽅法返回了⼀个 native 层创建的 Surface 指针,并赋值给了 Java 层 Surface 对象的 mNativeObject
属性。
Surface中的BufferQueue
在上述流程中, 我们发现createSurface最终变成了createLayer。 ⽽在createLayer时, ⼀套 BufferQueue的体系就建⽴起来了。
# native/services/surfaceflinger/SurfaceFlinger.cpp
// note jin:
status_t SurfaceFlinger::createLayer(const String8& name, ^) {
^
switch (flags & ISurfaceComposerClient::eFXSurfaceMask) {
case ISurfaceComposerClient::eFXSurfaceBufferQueue:
// note jin:
result = createBufferQueueLayer(client, uniqueName, w, h, flags, std::move(metadata),format, handle, gbp, &layer);
break;
case ISurfaceComposerClient::eFXSurfaceBufferState:
……
}
……
}
// note jin: surface
status_t SurfaceFlinger::createBufferQueueLayer(const sp<Client>& client,……) {
……
sp<BufferQueueLayer> layer = getFactory().createBufferQueueLayer(
LayerCreationArgs(this, client, name, w, h, flags, std::move(metadata)));
……
if (err == NO_ERROR) {
*handle = layer->getHandle();
// note jin: 可以获取到生产者,通常为 app
*gbp = layer->getProducer();
*outLayer = layer;
}
ALOGE_IF(err, "createBufferQueueLayer() failed (%s)", strerror(-err));
return err;
}
# native/services/surfaceflinger/BufferQueueLayer.cpp
// note jin:
sp<IGraphicBufferProducer> BufferQueueLayer::getProducer() const {
return mProducer;
}
// note jin:
void BufferQueueLayer::onFirstRef() {
BufferLayer::onFirstRef();
// 创建自定义BufferQueue以供SurfaceFlingerConsumer使用
sp<IGraphicBufferProducer> producer;
sp<IGraphicBufferConsumer> consumer;
// note jin: BufferQueue 在此创建
BufferQueue::createBufferQueue(&producer, &consumer, true);
mProducer = new MonitoredProducer(producer, mFlinger, this);
……
}
我们可以看到, 在createBufferLayer时, 通过BufferQueue::createBufferQueue创建了 BufferQueue实例, 然后创建并指定了其⽣产者与消费者。 我们可以想象⼀下, ⽣产者便是App, ⽽ 消费者便是SurfaceFlinger了。
总结
在 Java 层中 ViewRootImpl 实例中持有⼀个 Surface 对象,该 Surface 对象中的
mNativeObject
属性指向 native 层中创建的 Surface 对象,native 层的 Surface 对应 SurfaceFlinger 中的 Layer 对象,它持有 Layer 中的BufferQueueProducer
⽣产者指针, 在 Surface 上绘制的内容最终会交由SurfaceFlinger
来合成渲染送到显⽰器显⽰