96SEO 2026-02-20 08:04 0
href="https://www.cnblogs.com/ljbguanli/p/19620553"

GLSurfaceView源码学习】第三天:GLSurfaceView的Surface、GLES与EGLSurface的关联
xmlns="http://www.w3.org/2000/svg"> style="-webkit-tap-highlight-color: src="https://i-blog.csdnimg.cn/direct/04ea741f4ef849ea944d7b24941b6a44.png"> GLSurfaceView是Android系统为简化OpenGL ES(GLES)渲染开发提供的核心组件,其核心价值在于封装了复杂的渲染线程管理、EGL上下文生命周期控制,以及Android Surface与GLES渲染管线的关联逻辑。 本文将从核心概念入手,逐层拆解GLSurfaceView如何将自身生成的Surface、GLES渲染接口、EGLSurface三者深度绑定,揭示其底层实现原理。 id="_6">核心概念铺垫:理解三者的角色定位 在分析关联机制前,需先明确Surface、GLES、EGLSurface各自的核心作用,以及为什么需要“关联”:d="M5,0
rgba(0,
GLSurfaceView:Surface、GLES与EGLSurface的关联机制
1.
Surface:渲染的“画布载体”
Surface是Android系统中用于承载图形绘制结果的底层抽象,本质是一块由SurfaceFlinger管理的显存缓冲区(BufferQueue)。
GLSurfaceView继承自SurfaceView,SurfaceView的核心特性是在WindowManager中创建一个独立于UI主线程渲染的Surface,该Surface拥有自己的绘图缓冲区,避免与UI绘制冲突。
id="2_EGLSurfaceGLESSurface_16">2.
EGLSurface:GLES与系统Surface的“桥梁”
EGL(Embedded-System
Library)是连接GLES和底层窗口系统的中间层,而EGLSurface是EGL对“渲染表面”的抽象,分为两类:
Surface的EGL表面(本文核心讨论);
Surface:离线渲染的表面(GLSurfaceView中不常用)。
EGLSurface的核心作用是将GLES的渲染指令映射到底层Surface的缓冲区,是GLES无法直接操作Android
Surface的“适配层”。
GLES:图形渲染的“指令执行者”
GLES是基于OpenGL的嵌入式图形渲染接口,负责执行顶点着色、片元着色、纹理绘制等核心渲染指令。
但GLES本身不直接与Android窗口系统交互,必须通过EGL提供的上下文(EGLContext)和表面(EGLSurface)才能将渲染结果输出到具体的Surface上。
三者的核心关系可总结为:GLES执行渲染指令
由SurfaceFlinger合成显示。
GLSurfaceView的核心工作就是自动化完成这一关联流程。
id="_31">核心架构:关联流程的“骨架”
GLSurfaceView的内部架构围绕“解耦UI线程与渲染线程”设计,核心组件包括:
| 组件 | 核心作用 |
|---|---|
| SurfaceHolder | 管理GLSurfaceView的Surface生命周期(创建、销毁、尺寸变化) |
| GLThread | 独立的渲染线程,所有GLES/EGL操作均在此线程执行,避免阻塞UI线程 |
| EglHelper | 封装EGL的核心操作(EGLDisplay/EGLContext/EGLSurface的创建与管理) |
| Renderer接口 | 暴露给开发者的渲染回调(onSurfaceCreated/onSurfaceChanged/onDrawFrame) |
| EGLConfigChooser | 选择合适的EGL配置(如颜色缓冲区位数、深度缓冲区位数) |
整个关联流程的核心逻辑集中在GLThread和EglHelper中,接下来我们拆解具体的关联步骤。
GLSurfaceView中Surface、GLES、EGLSurface的关联是一个分阶段、多步骤的过程,可分为“初始化阶段”和“运行阶段”两大环节。
id="1SurfaceEGL_46">阶段1:初始化准备——Surface创建与EGL环境搭建
id="1GLSurfaceViewSurface_47">
步骤1:GLSurfaceView初始化,创建Surface当GLSurfaceView被添加到视图树时,其内部的SurfaceView会通过SurfaceHolder创建一个独立的Surface:
GLSurfaceView初始化核心逻辑(简化)
class-name">SurfaceHolder
holder
function">getHolder
class="token
function">addCallback
class="token
设置Surface类型为GPU渲染(低版本需手动设置)
holder
class-name">SurfaceHolder
class="token
punctuation">.
SURFACE_TYPE_GPUclass="token
punctuation">}
此时创建的Surface是Android系统层面的缓冲区载体,尚未与EGL/GLES产生任何关联。
id="2RendererGLThread_60">
步骤2:设置Renderer,启动GLThread开发者调用setRenderer(Renderer)时,GLSurfaceView会完成两个关键操作:
function">setRenderer
class="token
class-name">GLThread
class="token
punctuation">(
mThisWeakRefclass="token
punctuation">}
GLThread启动后会进入等待状态,直到Surface创建完成。
id="3SurfaceEGL_73">
步骤3:Surface创建回调,触发EGL初始化当SurfaceHolder监听到Surface创建完成(surfaceCreated回调),会通知GLThread:
GLSurfaceView的SurfaceHolder.Callback回调
function">surfaceCreated
class="token
class-name">SurfaceHolder
holder
function">surfaceCreated
class="token
punctuation">}
GLThread接收到通知后,会唤醒等待的渲染循环,开始执行EGL环境初始化,核心逻辑在EglHelper.eglInitialize()中:
style="white-space:
punctuation">(EGL10
class="token
class-name">EGLContext
class="token
function">eglGetDisplay
class="token
punctuation">(
EGL10class="token
punctuation">.
EGL_DEFAULT_DISPLAYclass="token
function">eglInitialize
class="token
punctuation">(
mEglDisplayclass="token
初始化EGLDisplay
style="white-space:
function">chooseConfig
class="token
punctuation">;
style="white-space:
function">createContext
class="token
punctuation">;
至此,EGL的基础环境已搭建完成,但尚未与Surface关联。
这是整个流程的核心步骤,GLThread在确认Surface就绪后,执行“Android
id="1EGLSurfaceAndroid_Surface_101">步骤1:创建EGLSurface,绑定Android
Surface
通过EGL的eglCreateWindowSurface方法,将Android
Surface(从SurfaceHolder获取)封装为EGLSurface:
EglHelper中创建EGLSurface的核心逻辑
function">createWindowSurface
class="token
Surface作为原生窗口传入,创建Window类型的EGLSurface
function">eglCreateWindowSurface
class="token
punctuation">(
mEglDisplayclass="token
punctuation">}
Surface完成绑定——EGLSurface成为GLES操作Surface的“代理”。
id="2EGLEGLSurfaceGLThread_112">
步骤2:绑定EGL上下文与EGLSurface到GLThread通过eglMakeCurrent将EGLContext、EGLSurface绑定到当前GLThread,这是GLES能够“感知”EGLSurface的关键:
function">makeCurrent
class="token
将EGLContext、EGLSurface(读/写)绑定到当前线程
function">eglMakeCurrent
class="token
punctuation">(
mEglDisplayclass="token
punctuation">}
调用该方法后,GLThread成为“GLES渲染线程”:所有在该线程中执行的GLES指令(如glClear、glDrawArrays)都会输出到绑定的EGLSurface(即对应的Android
id="3GLES_123">步骤3:GLES接口初始化,关联渲染回调
EGL上下文绑定完成后,GLThread会获取GLES接口实例(如GL10/GL20),并调用开发者实现的onSurfaceCreated回调:
GLThread中触发Renderer回调的逻辑
function">renderFrame
class="token
function">onSurfaceCreated
class="token
function">getEGLConfig
class="token
punctuation">}
此时,开发者通过gl对象执行的所有GLES指令,都会经由EGLSurface映射到Android
Surface的缓冲区,三者的关联彻底完成。
GLSurfaceView在运行过程中会持续维护三者的关联状态,核心场景包括:
尺寸变化:重新关联Surface尺寸
当Surface尺寸变化(如屏幕旋转),surfaceChanged回调会触发GLThread更新EGLSurface的尺寸,并调用onSurfaceChanged:
function">surfaceChanged
class="token
class-name">SurfaceHolder
holder
function">onWindowResize
class="token
function">onWindowResize
class="token
function">onSurfaceChanged
class="token
punctuation">}
渲染循环:持续输出GLES结果
GLThread的核心循环会不断执行“GLES渲染
执行开发者的onDrawFrame回调(GLES渲染指令)
function">onDrawFrame
交换EGLSurface缓冲区,将GLES渲染结果输出到Android
function">swapBuffers punctuation">}class="token
eglSwapBuffers是关键:它将EGLSurface的后台渲染缓冲区(GLES绘制的内容)切换到前台,由SurfaceFlinger合成显示到屏幕。
Surface销毁:解除关联,释放资源
当GLSurfaceView被销毁(如Activity退出),surfaceDestroyed回调会触发GLThread解除关联:
function">surfaceDestroyed
class="token
class-name">SurfaceHolder
holder
function">surfaceDestroyed
class="token
function">surfaceDestroyed
class="token
function">destroySurface
class="token
punctuation">}
解除关联后,GLES指令不再输出到Surface,避免内存泄漏或渲染异常。
GLSurfaceView为了保证关联的稳定性,还处理了以下核心场景:
Lost)
当系统内存不足时,EGLContext可能被销毁(即“上下文丢失”),GLSurfaceView会:
eglSwapBuffers返回EGL_CONTEXT_LOST;onSurfaceCreated,让开发者重新初始化GLES资源(如纹理、着色器)。暂停/恢复(onPause/onResume)
setPreserveEGLContextOnPause保留上下文),解除Surface关联;弱引用避免内存泄漏
GLThread持有GLSurfaceView的弱引用(WeakReference<GLSurfaceView>),而非强引用:
class-name">GLThread
class="token
class-name">WeakReference
class="token
class-name">GLSurfaceView
class="token
punctuation">>
class="token
punctuation">{mGLSurfaceViewWeakRef
punctuation">}
这避免了GLThread长期存活导致GLSurfaceView无法被GC回收的问题。
id="_202">核心总结
GLSurfaceView中Surface、GLES、EGLSurface的关联本质是“三层抽象的逐层绑定”:
Surface提供物理缓冲区;
id="_209">
最佳实践Renderer的回调中执行(GLThread线程);onSurfaceCreated中重新初始化纹理、VBO等GLES资源;RENDERMODE_WHEN_DIRTY(按需渲染),减少性能消耗;onDestroy中调用GLSurfaceView.onPause(),避免EGL资源泄漏。src="https://i-blog.csdnimg.cn/direct/005fdd3e9abb474a9ed4aa745b54697e.png">
class="post-meta-container">
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback