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线程想释放它,渲染线程却要使用它。)

android.opengl.GLSurfaceView概述相关推荐

  1. android.opengl.GLSurfaceView.Renderer概述

    android.opengl.GLSurfaceView.Renderer概述 翻译至android.opengl.GLSurfaceView.Renderer Class Overview,水平有限 ...

  2. android模拟器 opengl,android模拟器用到android.opengl.glsurfaceview报错怎么办

    满意答案 chtj915 2013.11.24 采纳率:40%    等级:8 已帮助:212人 package com.cxy.picturetransfer; import android.app ...

  3. android glsurface 闪屏,在null对象引用上的android.opengl.GLSurfaceView $GLThread.surfaceCreated()’...

    我试图使用GLSurface来显示自定义视图. 我的xml xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:to ...

  4. android opengl es 粒子效果实例代码

    概述:粒子系统采用许多形状简单的微小粒子作为基本元素,用它们来表示不规则模糊物体,系统中的每个粒子都有各自的生命周期,我们可以管理它们从创建到消亡的时间,它们都要经历"产生".&q ...

  5. Android OpenGL ES(十一)绘制一个20面体 .

    前面介绍了OpenGL ES所有能够绘制的基本图形,点,线段和三角形.其它所有复杂的2D或3D图形都是由这些基本图形构成. 本例介绍如何使用三角形构造一个正20面体.一个正20面体,有12个顶点,20 ...

  6. 【Android OpenGL ES】阅读hello-gl2代码(二)Java代码

    AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xm ...

  7. EGL接口介绍-----Android OpenGL ES底层开发

    引自:http://www.cnitblog.com/zouzheng/archive/2011/05/30/74326.html EGL 是 OpenGL ES 和底层 Native 平台视窗系统之 ...

  8. Android Opengl

    2019独角兽企业重金招聘Python工程师标准>>> 基础框架 package com.example.opengl;import android.app.Activity; im ...

  9. 【OpenGL ES】 Android OpenGL ES -- 透视投影 和 正交投影

    博客地址 : http://blog.csdn.net/shulianghan/article/details/46680803 源码下载 : http://download.csdn.net/det ...

最新文章

  1. 基于Kmeans聚类算法的图像分割(色彩分割)实战
  2. 如何在SQL Server 2005中使用作业实现备份和特定删除
  3. telegram 创建机器人
  4. 网页页面设计如何做到极致舒适感?
  5. python使用符号#表示单行注释-Python中注释(多行注释和单行注释)的用法实例...
  6. 产品经理——如何挑选一款高效的原型工具?
  7. 这一次彻底搞懂 Git Rebase
  8. java基础----Java Collections Framework
  9. 【一步解决】eclipse jee左边的项目栏不见了
  10. 系统管理员在企业中的职业定位及发展方向 连载(一)
  11. 数学狂想曲(五)——概率分布(2), 自相关互相关卷积
  12. 【记录】Docker安装后出现 Cannot connect to the Docker daemon
  13. mysql注入转义绕过_SQL注入防御绕过
  14. 锁存器、触发器和寄存器
  15. php 如何实现 访问不带后缀名
  16. win7计算机打开显卡设置在哪里,win7在哪里打开显卡设置
  17. Mediawiki页面权限设置 禁止游客编辑 禁止注册
  18. 用VHDL编写testbench激励文件
  19. Linux笔记一:Linux基本命令
  20. AD9361参数设置总结

热门文章

  1. python框架django教程_[Python] Django框架入门3——深入视图
  2. python动态调用自定义模块_python importlib动态导入模块 reload重载模块
  3. 5 加盐_软化水设备怎么加盐
  4. 自动化测试——接口测试——增删改查
  5. 21天Jmeter打卡Day13 逻辑控制器之if和简单控制
  6. Mybatis的复习
  7. 10分钟实现RPC框架
  8. matlab 删除cell 中的 0 元素
  9. mysql 恢复root权限_Linux MySQL root权限恢复[图文]
  10. 查python的软件_Python制作天气查询软件【python实战必学】