opengl es
是专门面向嵌入式系统的 openglApi的子集,可以为Android提供3d图形的实现同样适用于2d的视频与图像。拥有强大的渲染和特效处理功能,opengl本身只是协议规范\
3D图形学基础
3D:即三纬,长宽高三个纬度,我们计算机中的3d说白了也是在2d屏幕制造出的三维错觉\
图形管线
任何复杂图形都是由一定数量的基础几何图形,通过一系列手法加工出来
opengl es ,他只支持3种基本的:点point,线line,三角形triangle
Android中的opengl es
代码路径
java层sdk:frameworks/base/opengl
JNI:frameworks/base/core/jni
c++:frameworks/navite/opengl
mesa3D引擎库:external\meas3d\
Android采用了opengl es包含
- opengl es
- egl
- Mesa 3d 他是兼容opengl 协议的3d图形处理软件库\
图形渲染—api
egl和opengl
egl是图形渲染api,主要提供了:
- 创建renderaing surfaces
- 创造图形环境
- 同步应用程序和本地平台渲染api
- 提供了对显示设备的访问
- 提供了对渲染配置的管理
egl.cfg
系统是根据这个文件的解析结果来选择图形渲染方式的
流程:
- egl.cfg是否存在
- 格式:0 1 mali
- 第一个数字代表显示屏编号,默认为0
- 第二个代表是硬件库1还是软件库0
- 第三个代表库的名称
- opengl函数执行
- egl_init_drivers@Egl.cpp
- egl_init_drivers_locked@Egl.cpp
- Loader::Loader@Loader.cpp(加载 egl.cfg)
- open@Loader.cpp
- loader_driver@Loader.cpp(加载对应的opengl库)
egl接口解析
eglGetdispaly:获取默认显示屏
eglGeterror:获取失败原因
eglInitialize:初始化
eglGetconfig:获取一个最佳的config
eglGetconfigattrib:获取config的具体属性值
eglChooseconfig:配置提供的config
eglCreatewindowsurface:创建window
eglCreatebuffersurface:离屏的渲染区,不需要通过swap buffer最终输出到屏幕
eglCreatecontext:为opengl提供统一的运行环境
eglMakecurrent:设置当前surface
搭建open gl环境
- 直接使用SDK提供的EGL和GLES类
- GLSurfaceView 继承自SurfaceView 主要特性:
- 管理EGLDisplay
- 管理surface
- 会创建新线程来处理渲染,不会阻塞ui
- 用户可以自定义渲染方式, 使用基本步骤
- 创建GLSurfaceView
- 初始化opengl Es环境:默认情况下已经创建好了
- 设置Renderer
- 设置Renderermode
- 状态处理:使用GLSurfaceView要注意生命周期,activity的pause 和resume要通知到它
GLSurfaceView创建
构造函数调用了super的,并且init了,在init中有获取holder,并且添加了callback,callback中有surface create、change、destroy方法 这里的Surface View申请的surface和view树中通过view root申请的不是同一个
Surface view申请Surface流程
接收到viewroot attchtowindow后通过viewroot获取iwindowsession,在update window时通这个调用relayout获取新的surface,然后通知callback surfacecreate 并且唤醒等待线程,guardedrun方法是是否渲染的核心。
GLtracer是分析GLopne的利器