首页 > 其他分享 >SurfaceViewRenderer 绘制流程

SurfaceViewRenderer 绘制流程

时间:2024-03-24 09:44:51浏览次数:24  
标签:SurfaceViewRenderer .- 流程 shader release eglBase 绘制 GLES20


SurfaceViewRenderer

SurfaceEglRenderer / EglRenderer

app
-1-> SurfaceViewRenderer
-1-2-> SurfaceEglRenderer(EglRenderer)
-1-2-3-> VideoFrameDrawer
-1-> SurfaceViewRenderer.init
-1-2-> GlRectDrawer(GlGenericDrawer,
-1-2-> SurfaceEglRenderer.init
-1-2-3-> render thread

render thread:
eglBase = EglBase.create(sharedContext, configAttributes); // EGl context
-1-> EglBase14Impl
-1-2-> EGL14.eglGetDisplay(EGL14.EGL_DEFAULT_DISPLAY);
-1-2-> EGL14.eglChooseConfig
-1-2-> EGL14.eglCreateContext

// UI线程
// SurfaceHolder.Callback interface. surfaceCreated
postToRenderThread(eglSurfaceCreationRunnable);
render thread:
-1-> eglBase.createSurface((SurfaceTexture) surface); // Create EGLSurface from the Android SurfaceTexture.
-1-2> EglBase14Impl.createSurfaceInternal
-1-2-3-> EGL14.eglCreateWindowSurface
-1-> eglBase.makeCurrent();
-1-> GLES20.glPixelStorei(GLES20.GL_UNPACK_ALIGNMENT, 1);

// View layout interface.
-1-> SurfaceViewRenderer.onMeasure
-1-2-> setMeasuredDimension

// View layout interface.
-1-> SurfaceViewRenderer.onLayout
-1-2-> eglRenderer.setLayoutAspectRatio
-1-2-> getHolder().setFixedSize

// VideoSink interface.
-1-> EglRenderer.onFrame
-1-2-> pendingFrame.retain();
-1-2-> renderThreadHandler.post(this ::renderFrameOnRenderThread);
-1-2-3-> renderFrameOnRenderThread
-1-2-3-4-> VideoFrameDrawer.drawFrame
-1-2-3-4-5> VideoFrameDrawer.drawTexture
-1-2-3-4-5-6-> VideoFrameDrawer.convertMatrixFromAndroidGraphicsMatrix
-1-2-3-4-5-6-7-> drawOes
-1-2-3-4-5-6-7-8-> GlGenericDrawer.prepareShader
-1-2-3-4-5-6-7-8-9-> GlShader
-1-2-3-4-5-6-7-8-> GLES20.glUniform1i(shader.getUniformLocation("y_tex"), 0);
-1-2-3-4-5-6-7-8-> GLES20.glUniform1i(shader.getUniformLocation("u_tex"), 1);
-1-2-3-4-5-6-7-8-> GLES20.glUniform1i(shader.getUniformLocation("v_tex"), 2);
-1-2-3-4-5-6-7-8-> texMatrixLocation = shader.getUniformLocation(TEXTURE_MATRIX_NAME);
-1-2-3-4-5-6-7-8-> inPosLocation = shader.getAttribLocation(INPUT_VERTEX_COORDINATE_NAME);
-1-2-3-4-5-6-7-8-> inTcLocation = shader.getAttribLocation(INPUT_TEXTURE_COORDINATE_NAME);
// Bind the texture.
-1-2-3-4-5-6-7-8->GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
-1-2-3-4-5-6-7-8->GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, oesTextureId);
// Draw the texture.
-1-2-3-4-5-6-7-8->GLES20.glViewport(viewportX, viewportY, viewportWidth, viewportHeight);
-1-2-3-4-5-6-7-8->GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
// Unbind the texture as a precaution.
-1-2-3-4-5-6-7-8->GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, 0);
-1-2-3-> frame.release(); //renderFrameOnRenderThread
-1-2-3-> eglBase.swapBuffers

app
-1-> SurfaceViewRenderer.release
//render thread:
-1-2-> EglRenderer.release
-1-2-3> GLES20.glUseProgram(/* program= */ 0);
-1-2-3> GlGenericDrawer.release
-1-2-3> VideoFrameDrawer.release
-1-2-3> eglBase.detachCurrent();
-1-2-3> eglBase.release();
//render thread exit

标签:SurfaceViewRenderer,.-,流程,shader,release,eglBase,绘制,GLES20
From: https://www.cnblogs.com/huangguanyuan/p/18092107

相关文章

  • 生成式AI的力量:它如何彻底改变业务流程自动化
    生成式AI的力量:它如何彻底改变业务流程自动化     生成式AI是一种可以创建新数据或内容的人工智能,它正在彻底改变业务流程自动化。通过利用生成式人工智能,企业可以简化和增强各种流程,从而提高生产力、效率和创新能力。生成式人工智能在业务自动化方面的主要优势之一是能够加......
  • 爬虫工作量由小到大的思维转变---<第五十一章 Scrapy 深入理解Scrapy爬虫引擎(2)--引擎
    前言:继续上一篇:https://hsnd-91.blog.csdn.net/article/details/136943552        本章主要介绍Scrapy引擎的启动流程、请求处理的生命周期、如何处理下载的内容以及触发ItemPipeline的过程。还讨论了数据处理在爬虫解析函数和ItemPipeline中的作用,并介绍了引擎......
  • 软件APP开发定制流程
    文章目录概要整体架构流程技术细节小结概要软件APP开发定制流程软件APP开发定制是指根据客户的需求和预算,为客户量身定制一个专属的软件应用程序的过程。软件APP开发定制可以帮助客户实现自己的想法,解决自己的问题,提升自己的品牌和竞争力。软件APP开发定制的流程......
  • 项目流程2
    指令以v-开头属性绑定v-bind事件绑定v-on 修饰符是以点开头的特殊后缀 main.js是入口文件,先倒入了vue,再倒入了app根组件,再倒入了路由和element对应的组件 样式不生效,cmd下载lessloder依赖包=>npminstallless-loader--save-dev,如果还没安装less还需要安装less=>npm......
  • skynet框架:关键流程的异常处理思路
    当一个执行流程存在对外调用时,我们讨论如何保证流程的可用和安全;假设流程是关键且强制原子性;--serviceAfunctionmain() step1() skynet.call(serviceB,"lua","step2") step3() returntrueend--serviceBfunctionCMD.step2() ...endcallserviceB动......
  • 2.5 如何绘制ROC曲线?
    2.5如何绘制ROC曲线?前情提要:2.4ROC曲线是什么?​事实上,ROC曲线是通过不断移动分类器的“截断点”来生成曲线上的一组关键点的,通过下面的例子进一步来解释“截断点”的概念。​在二值分类问题中,模型的输出一般都是预测样本为正例的概率。假设测试集中有20个样本,表2.......
  • Vue开发日志:自定义组件:通用开发流程
    自定义组件:通用开发流程通用流程一组概念:key,value,labelProps:required和default同时存在的必要性让我们简单梳理一下通用流程在Vue.js中开发自定义组件的通用流程如下:定义组件模板:创建一个.vue文件,里面包含模板、样式和脚本部分。例如:<!--MyCustomCompone......
  • 9.Go语言中的流程控制
    1、Golang中的流程控制流程控制是每种编程语言控制逻辑走向和执行次序的重要部分,流程控制可以说是一门语言的“经脉”。Go语言中最常用的流程控制有if和for,而switch和goto主要是为了简化代码、降低重复代码而生的结构,属于扩展类的流程控制。2、ifelse(分支结构)2.1......
  • 记录一次SpringBoot + Vue前后分离项目的部署流程
    前言本教程使用黑马SpringBoot3+Vue3全套视频教程大事件项目作为前后端代码。前置需要:mysqljdkredisnginxlinux环境打包前端构建项目命令npmrunbuild会在项目根路径下生成dist文件夹,这里存放了我们打包好的前端代码。可以使用zip进行全部的压缩等下好上传到服......
  • 操作系统综合题之“请填写信号量值并说明操作结果(正常、阻塞或唤醒。如阻塞或者唤醒,需
    1.问题:题36表是两个同步进程的模拟执行,生产者将物品放入共享缓冲区供消费者使用,缓冲区可放2件物品,使用2个信号量,并置初值为S1=2,S2=0.现已知操作情况,请填写信号量值并说明操作结果(正常、阻塞或唤醒。如阻塞或者唤醒,需说明阻塞或者被唤醒的是P1还是P2)。(提示:缓冲区满,不许放物品;缓......