欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Android OpenGL入门之GLSurfaceView

程序员文章站 2022-11-20 20:50:30
glsurfaceview使用opengl es是是一个开源图形库,那么与之相关的需要一个东西去显示画面,在android里,opengl包里提供了一个view叫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的资料请关注其它相关文章!