Android OpenGL入门之GLSurfaceView
glsurfaceview使用
opengl es是是一个开源图形库,那么与之相关的需要一个东西去显示画面,在android里,opengl包里提供了一个view叫glsurfaceview,它的定义如下:
an implementation of surfaceview that uses the dedicated surface for
displaying opengl rendering.
它的特性如下:
- manages a surface, which is a special piece of memory that can be
- composited into the android view system.
- manages an egl display, which enables opengl to render into a surface.
- accepts a user-provided renderer object that does the actual rendering.
- renders on a dedicated thread to decouple rendering performance from the ui thread.
- supports both on-demand and continuous rendering.
- optionally wraps, traces, and/or error-checks the renderer's opengl calls.
可见系统已封装好一个view用于渲染画面并能进行相应设置。
使用步骤如下:
1.创建定义一个glsurfaceview
2.调用glsurfaceview的seteglcontextclientversion设置版本号,可设为2
3.onresume 和 onpause分别调用glsurfaceview相应的生命周期方法
4.调用glsurfaceview的setrender设置自己实现glsurfaceview.render接口的类
5.render接口有3个方法,分别是surfacecreated时候进行相应的初始化工作,surfacechange时候高宽的适配以及具体的drawframe方法
- onsurfacecreated(gl10 gl, eglconfig config);
- onsurfacechanged(gl10 gl, int width, int height);
- ondrawframe(gl10 gl);
glsurfaceview详细分析:
1.glsurfaceview在构造函数中调用init()设置如上3个回掉函数
2.setrender会进行一些默认的设置,并生成一个glthread的线程进行渲染绘制相关操作,绘制的内容默认情况下依旧是绘制到surfaceview所提供的surface上
3.glthread的run()方法里调用了guardedrun()方法,在guardedrun方法里new 了一个eglhelper类,并在一段逻辑判断后调用了eglhelper的start方法。
4.eglhelper.start()方法里
这里有如下几个重要方法,最终会调用到c++层去初始化相关的渲染界面
- eglcontext.getegl()
- eglgetdisplay(egl10.egl_default_display)
- eglinitialize(megldisplay, version)
- createcontext()
5.在guardedrun() start()调用后会调用eglhelper.createsurface()方法,最终也会调用到c++层。
- createwindowsurface
- eglgeterror
- eglmakecurrent
egl相关知识
egl用于管理绘图表面,有如下机制
- 与设备的原生窗口系统通信
- 查询绘图表面的可用类型和配置
- 创建绘图表面
- 在opengl es 3.0和其他图形渲染api之间同步渲染
- 管理纹理贴图等渲染资源
egldisplay:由于每个窗口系统都有不同的语义,所以egl提供基本的不透明类型egldisplay,封装了所有系统相关性,用于和原生窗口系统接口
egl有如下一些方法:
egldisplay eglgetdisplay(object native_display);
1.打开与egl显示服务器的链接打开与egl显示服务器的链接
2.native_display是一个displayid,指定显示链接,默认链接为egl_default_display
boolean eglinitialize(egldisplay display, int[] major_minor)
1.打开链接后,需要初始化egl
2.display:getdisplay返回的值
3.主次版本号
boolean eglchooseconfig(egldisplay display, int[] attrib_list, eglconfig[] configs, int config_size, int[] num_config);
1.让egl选择匹配的eglconfig
2.具体就是调用选择配置,配置细节暂不叙述
eglcontext eglcreatecontext(egldisplay display, eglconfig config, eglcontext share_context, int[] attrib_list);
1.创建渲染上下文
2.display:指定的显示链接
3.config:指定的配置
4.share_context:允许多个egl上下文共享特定类型的数据;使用egl_no_context表示没有共享
5.attrib_list:指定创建上下文使用的属性列表;只有一个可接受的属性:egl_context_client_version表示指定与你所使用的opengl es版本
6.eglcreatecontext成功时,它返回一个指向新创建上下文的句柄。
eglsurface eglcreatewindowsurface(egldisplay display, eglconfig config, object native_window, int[] attrib_list);
1.有了符合渲染要求的eglconfig,就可调用此函数创建一个窗口
2.属性同上
int eglgeterror();
1.egl函数成功时返回egl_true,否则返回egl_false。如果需要查询故障原因,调用eglgeterror()得到返回错误码。
boolean eglmakecurrent(egldisplay display, eglsurface draw, eglsurface read, eglcontext context);
1.因一个应用程序可能创建多个eglcontext用于不同的用途,所以需要关联特定的eglcontext和渲染表面即:指定当前上下文
整个大概流程就如上所述调用下来。
以上就是android opengl入门之glsurfaceview的详细内容,更多关于android glsurfaceview的资料请关注其它相关文章!