1、Surface图形系统概览 Surface是一个显示系统中的组件,无论是在图形系统的结构之中,还是在生产消费模型的流程之中都做作为一个举足轻重的角色,参与整个安卓的显示生命周期之中。 我
Surface是一个显示系统中的组件,无论是在图形系统的结构之中,还是在生产消费模型的流程之中都做作为一个举足轻重的角色,参与整个安卓的显示生命周期之中。
我们摘抄了两段谷歌对surface的描述作为贯穿整个文章的中心:
1.A surface is an interface for a producer to exchange buffers with a consumer.
2.No matter what rendering api developers use, everything is rendered onto a surface. The surface represents the producer side of a buffer queue that is often consumed by SurfaceFlinger. Every window that is created on the Android platfORM is backed by a surface.


我们将整个过程当做一次美术博物馆的展出,便于理解这些组件在显示过程中的作用。

位于生产消费模型的生产端,所有可以生成buffer data 的内容。读取media中的内容,读取camera中的内容,用NDK生成图像,用OpenGL生成图像等等。他们都可以作为纯粹的画家,也就是内容生产者。
他们既决定Buffer Data中的内容,也同时决定“取景框”windows的大小位置。




surface在很多层面都有自己的属性,从base到native。由上而下来看看surface到底是怎么创建的。
public Surface() { } public Surface(SurfaceTexture surfaceTexture) {.... mIsSingleBuffered = surfaceTexture.isSingleBuffered(); synchronized (mLock) { mName = surfaceTexture.toString(); setNativeObjectLocked(nativeCreateFromSurfaceTexture(surfaceTexture)); } } private Surface(long nativeObject) { synchronized (mLock) { setNativeObjectLocked(nativeObject); } } Surface类对外有两个构造方法,对内一种:
readFromParcel()反序列化用的public void readFromParcel(Parcel source) {... synchronized (mLock) { mName = source.readString(); mIsSingleBuffered = source.readInt() != 0; setNativeObjectLocked(nativeReadFromParcel(mNativeObject, source)); }} static jobject ImageReader_getSurface(JNIEnv* env, jobject thiz){...IGraphicBufferProducer* gbp = ImageReader_getProducer(env, thiz);... // Wrap the IGBP in a Java-language Surface. return android_view_Surface_createFromIGraphicBufferProducer(env, gbp);} setNativeObjectLocked(),区别在与参数的不同 setNativeObjectLocked(nativeObject); setNativeObjectLocked(nativeReadFromParcel(mNativeObject, source));setNativeObjectLocked(nativeCreateFromSurfaceTexture(surfaceTexture)); private void setNativeObjectLocked(long ptr) { if (mNativeObject != ptr) { ... //只是更新了变量的数值,只是针对不同数据来源的处理 //其中最重要的是mNativeObject 是一个指向native 层surface的指针 mNativeObject = ptr; ... } } nativeReadFromParcel(mNativeObject, source)static jlong nativeReadFromParcel(JNIEnv* env, jclass clazz, jlong nativeObject, jobject parcelObj) { Parcel* parcel = parcelForJavaObject(env, parcelObj); ... android::view::Surface surfaceShim; // 解析 Parcel 数据,并填充到 native层 的 Surface对象 surfaceShim surfaceShim.readFromParcel(parcel, true); // 将传入的指针转换为 native层 的 Surface对象 self sp<Surface> self(reinterpret_cast<Surface *>(nativeObject)); // 比对 surfaceShim 和 self 中的 Binder 对象 IGraphicBufferProducer if (self != nullptr && (IInterface::asBinder(self->getIGraphicBufferProducer()) == IInterface::asBinder(surfaceShim.graphicBufferProducer))) { // 判断是同一个 IGraphicBufferProducer ,直接返回当前指针 return jlong(self.get()); } sp<Surface> sur; if (surfaceShim.graphicBufferProducer != nullptr) { // IGraphicBufferProducer 不同 // 且 surfaceShim 的 IGraphicBufferProducer 不为空 // 创建一个新的 Surface 对象 sur sur = new Surface(surfaceShim.graphicBufferProducer, true); sur->incStrong(&sRefBaseOwner); } ... // 将 sur 的指针返回给 Java 层 return jlong(sur.get());} jobject android_view_Surface_createFromIGraphicBufferProducer(JNIEnv* env, const sp<IGraphicBufferProducer>& bufferProducer) { if (bufferProducer == NULL) { return NULL; } sp<Surface> surface(new Surface(bufferProducer, true)); return android_view_Surface_createFromSurface(env, surface);} 
static jlong nativeCreateFromSurfaceTexture(JNIEnv* env, jclass clazz, jobject surfaceTextureObj) { sp<IGraphicBufferProducer> producer(SurfaceTexture_getProducer(env, surfaceTextureObj));... sp<Surface> surface(new Surface(producer, true));... surface->incStrong(&sRefBaseOwner); return jlong(surface.get());} 不难看出所有的surface创建中,都需要一个IGraphicBufferProducer对象作为参数,而IGraphicBufferProducer对象是一个Binder引用对象,BufferQueue的生产者接口,实现类是BufferQueueProducer
class Surface//ANativeObjectBase,属于模板的一部分//class ANativeObjectBase : public NATIVE_TYPE, public REF : public ANativeObjectBase<ANativeWindow, Surface, RefBase>public: Surface(const sp<IGraphicBufferProducer>& bufferProducer, bool controlledByApp = false); private: // mSurfaceTexture is the interface to the surface texture server. All // operations on the surface texture client ultimately translate into // interactions with the server using this interface. // TODO: rename to mBufferProducer // native层的Surface将IGraphicBufferProducer对象保存到了mGraphicBufferProducer变量中。 sp<IGraphicBufferProducer> mGraphicBufferProducer; 
1.2 NATIVE FRAMEWORK中所提到的 

https://juejin.cn/post/6944960866404007944
来源地址:https://blog.csdn.net/vs624010607/article/details/129666617
--结束END--
本文标题: Android 显示框架:Surface详解之一
本文链接: https://www.lsjlt.com/news/484351.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-01-21
2023-10-28
2023-10-28
2023-10-27
2023-10-27
2023-10-27
2023-10-27
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0