SurfaceTexture使用流程

  1. 首先,通过Canvas、OpenGL、Camera或者Video Decoder生成图像流。
  2. 接着,图像流通过Surface入队到BufferQueue,并通知到GLConsumer。
  3. 然后,GLConsumer从BufferQueue获取图像流GraphicBuffer,并转换为纹理。
  4. 最后,业务方可以对纹理进一步处理,例如:上特效或者上屏。

创建SurfaceTexture

@MainActivity.java
createVDSurface
@Vision.java
    Vision.getInstance().createSurface
        //1.创建纹理
        int texture = nativeCreateTexture(width, height);
@src/main/cpp/vision/android_jni/android_jni.cpp
            VisionRendering2D_createTexture(width, height);
@src/main/cpp/rendering/renders/palace_render.cpp            
                g_render_manager->CreateTexture(width, height);
                    GLCHECK(glGenTextures(1, &texture));
        //2.使用纹理初始化SurfaceTexture,组合有mEGLConsumer
        SurfaceTexture surfaceTexture = new SurfaceTexture(texture, false);
        surfaceTexture.setOnFrameAvailableListener()
@MainActivity.java
        //3.使用SurfaceTexture创建Surface,此时Surface是生产者,SurfaceTexture(Native层对应GLConsumer)是消费者,创建好
        //Surface后,就可以通过多种方式向Surface绘制图像数据了,例如:Canvas绘制、Camera输出、视频解码器渲染
        mMainHandler.post(() -> { callback.surfaceCreated(surfaceTexture); }
            Surface surface = new Surface(texture);
            addContentOnVDDisplay(surface);
                //4.使用Surface创建vd应用
                u3dClient.startAppOnWindow(packName, actName, "launcher", mWidth, mHeight, densityDpi, rotateSurface, new VDCreatedListener() {
            

 更新图像

surfaceflinger:
present
    // 1. 向Surface绘制图像数据
    finishFrame
        composeSurfaces           
            dequeueBuffer            //获取buffer
            prepareClientComposition  //准备GPU合成
            drawLayers                        
                REThreaded::drawLayers  //交给REThreaded组织绘制
                    SkiaGL::drawLayers
                        DrawLayer: com.android.calculator2/com.android.calculator2.Calculator#0
                            DrawImage
                        flush surface
        queueBuffer          //提交buffer进行GPU合成
            Trace GPU completion fence 2210

vd,SurfaceTexture:
queueBuffer
    OnFrameAvailableListener
        // 2. 业务层主动更新目标纹理
        surfaceTexture.updateTexImage();
@frameworks/base/core/jni/android_graphics_SurfaceTexture.cpp
            nativeUpdateTexImage
                SurfaceTexture_updateTexImage
                    surfaceTexture->updateTexImage();
@frameworks/native/libs/gui/GLConsumer.cpp
                        mEGLConsumer.updateTexImage(*this);
@frameworks/native/libs/nativedisplay/surfacetexture/SurfaceTexture.cpp
                            acquireBufferLocked(&item, 0);
                                mEGLConsumer.onAcquireBufferLocked(item, *this);
                                    mEglSlots[slot].mEglImage = new EglImage(st.mSlots[slot].mGraphicBuffer);  //BufferQueue中获取可用的BufferItem,其中包含了GraphicBuffer。然后,基于GraphicBuffer创建EglImage
                            updateAndReleaseLocked(item);
                                err = mEglSlots[slot].mEglImage->createIfNeeded(mEglDisplay);  //创建EGLImageKHR
                                    mEglImage = createImage(mEglDisplay, mGraphicBuffer);
@frameworks/native/libs/ui/GraphicBuffer.cpp                                    
                                        EGLClientBuffer cbuf = static_cast<EGLClientBuffer>(graphicBuffer->getNativeBuffer());  // EGLClientBuffer是void *类型,native/opengl/include/EGL/egl.h:
                                            return static_cast<ANativeWindowBuffer*>(const_cast<GraphicBuffer*>(this)); //ANativeWindowBuffer在frameworks/native/libs/nativebase/include/nativebase/nativebase.h
                                        eglInitialize(dpy, nullptr, nullptr);
                                        EGLImageKHR image = eglCreateImageKHR(dpy, EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID, cbuf, attrs);  
                            bindTextureImageLocked();
                                glBindTexture(mTexTarget, mTexName);     //绑定纹理
                                mCurrentTextureImage->bindToTextureTarget(mTexTarget);
                                    glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, static_cast<GLeglImageOES>(mEglImage));  //把EGLImageKHR填充为纹理数据
        mMainHandler.post(() -> callback.surfaceUpdated(surfaceTexture));
@MainActivity.java
            surfaceUpdated
 
3. 业务层使用纹理           
VSyncMonitor_onVsync
    g_render_manager->HandleVSync(timestamp);
        PalaceRenderManager::Render()
            left_eye_frame_buffer_->Bind();
            render_->Draw();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/599222.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

解决VScode -正在本地下载 VS Code 服务器

不知道怎么回事再次连接服务器的时候一直卡在这里了&#xff0c;查看输出信息发现一直卡在下载处&#xff0c;报错信息如图1&#xff0c;输出信息如图2。 1.报错信息 图1 报错信息 图2 输出信息 2.尝试 【已解决】设置SSH主机&#xff1a;VS Code-正在本地下载 VS Code 服务器…

Linux 第二十二章

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要等到什么都没有了…

为何大学计算机专业以C语言入门?探究C语言入门的好处

为何大学计算机专业以C语言入门&#xff1f;探究C语言入门的好处 在大学计算机专业中&#xff0c;C语言常作为入门语言&#xff0c;这并非偶然。C语言具有一些独特的优势&#xff0c;使其成为计算机科学教育中的理想选择。本文将探讨为何大学计算机专业选择以C语言入门&#xf…

Terraform资源

资源是Terraform中最核心的部分&#xff0c;使用Terraform的目的就是用于管理资源。 在Terraform中&#xff0c;资源使用resource块定义。 一个resource可以定义一个或多个基础设施资源对象&#xff0c;如&#xff1a;VPC&#xff0c;虚拟机&#xff0c;DNS记录&#xff0c;Con…

为什么都喜欢用串口通讯?那为什么还用RS485,SPI和I2C?

1、为什么都喜欢用串口通讯&#xff1f; 之前在做单片机产品的时候&#xff0c;用的最多的就是串口通讯&#xff0c;凡是单片机的外设&#xff0c;优先选用带串口功能的&#xff0c;比如蓝牙模块&#xff0c;WIFI模块&#xff0c;4G模块&#xff0c;电表和显示屏等等。 为什么都…

mysql的数据结构及索引使用情形

先来说下数据的一般存储方式&#xff1a;内存(适合小数据量)、磁盘(大数据量)。 磁盘的运转方式&#xff1a;速度 旋转&#xff0c;磁盘页的概念&#xff1a;每一页大概16KB。 1、存储结构 哈希 是通过hash函数计算出一个hash值的&#xff0c;哈希的优点就是查找的时间复杂度…

直说了,你可能从没真正理解MPLS

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 你们好&#xff0c;我的网工朋友。 尽管 MPLS 技术已经相当成熟&#xff0c;有关它的文章数不胜枚举&#xff0c;涵盖了从基本原理到 SR-MPLS 等…

Spring Boot集成RabbitMQ-之6大模式总结

A.集成 一&#xff1a;添加依赖 在pom.xml文件中添加spring-boot-starter-amqp依赖&#xff0c;以便使用Spring Boot提供的RabbitMQ支持&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp&…

【第三版 系统集成项目管理工程师】第2章 信息技术发展(知识总结)

持续更新。。。。。。。。。。。。。。。 【第2章】 信息技术发展 考情分析2. 1信息技术及其发展2.1.1 计算机软硬件-P501.计算机硬件2.计算机软件-P51 2.1.2计算机网络1.通信基础-P522.网络基础-P534.网络标准协议-P543.网络设备-P535.软件定义网络-P576.第五代移动通信技术-P…

2024抖音小店最新注册流程来了,快快收藏!

大家好&#xff0c;我是电商糖果 2024年想开一家抖音小店&#xff0c;但是不知道具体的开店流程。 不要着急&#xff0c;这篇文章就给大家详细的讲解一下。 首先&#xff0c;准备开店材料&#xff1a;5000左右的类目保证金&#xff0c;电脑&#xff0c;手机号&#xff0c;法…

Dos命令Tree

查看tree的用法 tree /?tree > 文件名&#xff0c;输出文件路径到指定的位置

苹果手机突然黑屏打不开怎么办?多种方法合集

苹果手机突然黑屏打不开怎么办&#xff1f;苹果手机突然开不开机了怎么办&#xff1f;手机打不开机了按键长按没有反应怎么办&#xff1f; 如果您的苹果手机出现这些情况无法正常开机&#xff0c;可以尝试以下办法恢复&#xff1a; 方法1&#xff1a;给手机充电 首先&#xf…

面试集中营—Redis面试题

一、Redis的线程模型 Redis是基于非阻塞的IO复用模型&#xff0c;内部使用文件事件处理器&#xff08;file event handler&#xff09;&#xff0c;这个文件事件处理器是单线程的&#xff0c;所以Redis才叫做单线程的模型&#xff0c;它采用IO多路复用机制同时监听多个socket&a…

Richard 林旅强:说说社区的故事和对 RTE 社区的畅想

各位 RTE 开发者社区的小伙伴们&#xff0c;大家好&#xff1a; 我是 Richard 林旅强&#xff0c;今年起开始担任我们 RTE 社区联合主理人&#xff0c;很荣幸能在这里跟杜金房老师和陈靖老师一起做点事情&#xff0c;为社区的大家服务 &#x1f603; 今天想跟各位分享&#x…

数据结构---动态数组

一、数据结构基本理论 数据结构是相互之间存在一种或多种特定关系的数据元素的集合。强调数据元素之间的关系 算法五个特性&#xff1a; 输入、输出、有穷、确定、可行 数据结构分类&#xff1a; 逻辑结构&#xff1a;集合、线性结构、树形结构、图形结构 物理…

Baidu Comate:你的智能编程伙伴,编程界的AI革命者

文章目录 Baidu Comate 介绍Baidu Comate下载安装Baidu Comate 实操体验代码解释函数注释行间注释调优建议生成单测注释生成实时续写常用快捷方式智能对话问答 Baidu Comate 建议改进Baidu Comate 体验总结 Baidu Comate 介绍 Baidu Comate 智能编码助手 是基于文心大模型&…

【nginx 开发】nginx安装,Nginx介绍

Nginx基础介绍 Nginx反向代理负载均衡动静分离 Nginx的安装NginxNginx常用命令Nginx配置文件 Nginx Nginx是一个高性能的Http和反向代理服务器&#xff0c;特点是占有内存少&#xff0c;并发能力强&#xff0c;Nginx可以作为静态页面的web服务器&#xff0c;Nginx专为性能优化…

4G工业路由器快递柜应用案例(覆盖所有场景)

快递柜展示图 随着电商的蓬勃发展,快递行业迎来高速增长。为提高快递效率、保障快件安全,智能快递柜应运而生。但由于快递柜部署环境复杂多样,网络接入成为一大难题。传统有线宽带难以覆盖所有场景,而公用WiFi不稳定且存在安全隐患。 星创易联科技有限公司针对这一痛点,推出了…

我独自升级崛起在哪下载 我独自升级崛起客户端下载教程

定于5月8日全球盛放的《我独自升级&#xff1a;崛起》——这一激动人心的动作角色扮演游戏巨作&#xff0c;汲取了同名动漫及网络漫画的精髓&#xff0c;誓将以其无与伦比的魅力&#xff0c;引领玩家迈入一个探索深远、规模宏大的奇幻之旅。游戏构筑在一个独一无二的网络武侠世…

JavaScript:正则表达式属于字符串吗-不属于/字符串转正则表达式的两种方法

一、需求描述 js 字符串转正则表达式 二、理解正则表达式属于字符串吗? 正则表达式不属于字符串&#xff0c;它是一种用于匹配、查找和操作文本的模式。正则表达式是一种特殊的语法&#xff0c;用于描述字符串的特征。通过使用正则表达式&#xff0c;可以检查一个字符串是否…
最新文章