android.opengl.GLSurfaceView概述

翻译 2011年01月09日 10:17:00

 

android.opengl.GLSurfaceView概述

 

翻译至android.opengl.GLSurfaceView Class Overview,水平有限,敬请谅解

hankersyan@163.com

 

        GLSurfaceView是一个视图,继承至SurfaceView,它内嵌的surface专门负责OpenGL渲染。

        GLSurfaceView提供了下列特性:

                1> 管理一个surface,这个surface就是一块特殊的内存,能直接排版到android的视图view上。

                2> 管理一个EGL display,它能让opengl把内容渲染到上述的surface上。

                3> 用户自定义渲染器(render)。

                4> 让渲染器在独立的线程里运作,和UI线程分离。

                5> 支持按需渲染(on-demand)和连续渲染(continuous)。

                6> 一些可选工具,如调试。

 

使用GLSurfaceView

        通常会继承GLSurfaceView,并重载一些和用户输入事件有关的方法。如果你不需要重载事件方法,GLSurfaceView也可以直接使用,你可以使用set方法来为该类提供自定义的行为。例如,GLSurfaceView的渲染被委托给渲染器在独立的渲染线程里进行,这一点和普通视图不一样,setRenderer(Renderer)设置渲染器。

 

初始化GLSurfaceView

        初始化过程其实仅需要你使用setRenderer(Renderer)设置一个渲染器(render)。当然,你也可以修改GLSurfaceView一些默认配置。

            * setDebugFlags(int)

            * setEGLConfigChooser(boolean)

            * setEGLConfigChooser(EGLConfigChooser)

            * setEGLConfigChooser(int, int, int, int, int, int)

            * setGLWrapper(GLWrapper) 

 

定制android.view.Surface

        GLSurfaceView默认会创建像素格式为PixelFormat.RGB_565的surface。如果需要透明效果,调用getHolder().setFormat(PixelFormat.TRANSLUCENT)。透明(TRANSLUCENT)的surface的像素格式都是32位,每个色彩单元都是8位深度,像素格式是设备相关的,这意味着它可能是ARGB、RGBA或其它。

 

选择EGL配置

        Android设备往往支持多种EGL配置,可以使用不同数目的通道(channel),也可以指定每个通道具有不同数目的位(bits)深度。因此,在渲染器工作之前就应该指定EGL的配置。GLSurfaceView默认EGL配置的像素格式为RGB_656,16位的深度缓存(depth buffer),默认不开启遮罩缓存(stencil buffer)。

        如果你要选择不同的EGL配置,请使用setEGLConfigChooser方法中的一种。

 

调试行为

        你可以调用调试方法setDebugFlags(int)或setGLWrapper(GLSurfaceView.GLWrapper)来自定义GLSurfaceView一些行为。在setRenderer方法之前或之后都可以调用调试方法,不过最好是在之前调用,这样它们能立即生效。

 

设置渲染器

        总之,你必须调用setRenderer(GLSurfaceView.Renderer)来注册一个GLSurfaceView.Renderer渲染器。渲染器负责真正的GL渲染工作。

 

渲染模式

        渲染器设定之后,你可以使用setRenderMode(int)指定渲染模式是按需(on demand)还是连续(continuous)。默认是连续渲染。

 

Activity生命周期

        Activity窗口暂停(pause)或恢复(resume)时,GLSurfaceView都会收到通知,此时它的onPause方法和onResume方法应该被调用。这样做是为了让GLSurfaceView暂停或恢复它的渲染线程,以便它及时释放或重建OpenGL的资源。


事件处理

        为了处理事件,一般都是继承GLSurfaceView类并重载它的事件方法。但是由于GLSurfaceView是多线程操作,所以需要一些特殊的处理。由于渲染器在独立的渲染线程里,你应该使用Java的跨线程机制跟渲染器通讯。queueEvent(Runnable)方法就是一种相对简单的操作,例如下面的例子。

         class MyGLSurfaceView extends GLSurfaceView {

 

             private MyRenderer mMyRenderer;

 

             public void start() {

                 mMyRenderer = ...;

                 setRenderer(mMyRenderer);

             }

 

             public boolean onKeyDown(int keyCode, KeyEvent event) {

                 if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {

                     queueEvent(new Runnable() {

                         // 这个方法会在渲染线程里被调用

                         public void run() {

                             mMyRenderer.handleDpadCenter();

                         }});

                     return true;

                 }

                 return super.onKeyDown(keyCode, event);

             }

         }

 

        (注:如果在UI线程里调用渲染器的方法,很容易收到“call to OpenGL ES API with no current context”的警告,典型的误区就是在键盘或鼠标事件方法里直接调用opengl es的API,因为UI事件和渲染绘制在不同的线程里。更甚者,这种情况下调用glDeleteBuffers这种释放资源的方法,可能引起程序的崩溃,因为UI线程想释放它,渲染线程却要使用它。)

 

GLSurfaceView布局内使用报空指针问题

布局内使用GLSurfaceView
  • xiehao_95
  • xiehao_95
  • 2016年04月07日 09:22
  • 2086

Spring mvc基本概述

Spring mvc主要是围绕DispatcherServlet这个核心控制器来开展的,DispatcherServlet是Spring mvc的总导演、总策划,它负责截获请求并且将其分发给对应的处理...
  • u012832964
  • u012832964
  • 2016年07月22日 23:08
  • 1099

概要设计怎么写?全面而具体的描述

在需求明确、准备开始编码之前,要做概要设计,而详细设计可能大部分公司没有做,有做的也大部分是和编码同步进行,或者在编码之后。因此,对大部分的公司来说,概要设计文档是唯一的设计文档,对后面的开发、测试、...
  • u014315849
  • u014315849
  • 2016年03月01日 10:20
  • 2227

android.opengl.GLSurfaceView 概述

参考:http://www.cnblogs.com/vernon/archive/2011/07/17/1877728.html简介SDK 中的 android.opengl.GLSurfaceVie...
  • cc_lq
  • cc_lq
  • 2011年07月24日 15:26
  • 586

OpenGL ES 和 GLSurfaceView 概述

最近在看林学森先生的《深入理解 Android 内核设计思想》,特作此笔记。
  • zhaizu
  • zhaizu
  • 2016年09月11日 11:16
  • 594

[OpenGL]从零开始写一个Android平台下的全景视频播放器——2.3 使用GLSurfaceView和MediaPlayer播放一个平面视频(下)

回到目录 视频颠倒的问题 其实,不要更新mSTMatrix,将他设为单位阵,一般就会显示正常的视频。。  在使用mSTMatrix的情况下,解决方法就是修改顶点数组或者修改纹理数组,我们...
  • xiaozhude
  • xiaozhude
  • 2017年12月11日 00:41
  • 23

android中用GLSurfaceview和opengl es2.0显示图片,图片无法正常显示

想用GLSurfaceView配合OPENGL es2.0编程实现把图片显示到手机界面中,照着网上的例子,自己在eclipse中敲了一遍,但是就是无法显示出图片(试过128*128的png和bmp),...
  • keshi9934
  • keshi9934
  • 2016年12月30日 14:25
  • 394

Android OpenGL ES GLSurfaceView与其他View布局

//本文主要介绍 GLSurfaceView 与其他View 在布局中共同显示的问题 GlSurfaceView需要动态建立,如何与其他控件并存,这里有两种方式: 1.其他控件动态建立,即全部动态界面...
  • u011160626
  • u011160626
  • 2015年05月11日 14:42
  • 1874

Android OpenGL ES->GLSurfaceView

这个例子是使用OpenGL ES绘图最简单的例子,说明如何使用GLSerfaceView,前面的例子Android OpenGL ES 开发教程(6):GLSurfaceView 已经详细说明了,本篇...
  • mapdigit
  • mapdigit
  • 2012年06月17日 16:30
  • 7037

[OpenGL]从零开始写一个Android平台下的全景视频播放器——2.1 使用GLSurfaceView和MediaPlayer播放一个平面视频(上)

Github项目地址,欢迎star~!为了方便没有准备好梯子的同学,我把项目在CSDN上打包下载,不过更新会慢一些回到目录MediaPlayer的生命周期了解MediaPlayer的生命周期的好处是,...
  • Martin20150405
  • Martin20150405
  • 2016年11月24日 08:48
  • 3220
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android.opengl.GLSurfaceView概述
举报原因:
原因补充:

(最多只允许输入30个字)