您的位置:首页 > 运维架构

interface GLSurfaceView.Renderer

2017-06-02 09:43 651 查看
public interface GLSurfaceView.Renderer

一个通用的渲染接口

Renderer被OpenGL调用渲染帧。

和GLServiceView协同使用的时候一般开发这负责实现这个借口,并通过GLServiceView.setRenderer()方法注册自己的实现类。

OpenGL ES GUI-https://developer.android.com/guide/topics/graphics/opengl.html

Renderer运行在独立的线程中,这样渲染线程和UI现成解耦。用户的操作指令一般由UI线程接受并通过UI线程和Renderer通信。开发者可以使用任何标准的java线程间通信技术(或者queueEvent(Runnable) )完成和Renderer的信息交互。

OpenGL ES 是被设计运行在单线程中,而且是现成不安全的,永远不要在另一个线程中调用OpenGL ES

在某些情况下会发生EGL Renderer上下文丢失的现象。(例如正在使用Renderer的设备睡眠后被唤醒)。当EGL 上下文丢失后所有和其相关的的OpenGL资源(例如纹理texture)都会被删除。

为了保证正确的渲染,Renderer必须重新创建任何已经丢失了的上被需要的资源。这一操作放在
onSurfaceCreated(GL10, EGLConfig)
是很方便的。

void onSurfaceCreated(GL10 gl, EGLConfig config)

当serface创建和重新创建的时候被调用。

当Renderer线程start以及EGL上下文丢失的时候调用。EGL上下文的丢失一般发生在Android设备息屏亮屏的过程中。

因为本方法是在Renderer启动以及EGL上下文丢失的时候被调用,初始化OpenGL资源的代码放在这里就很方便了。纹理(Texture)资源的处理或许代码或许就是你想放在这里的内容。

注意:当EGL上下文丢失的时候所有和上下文相关的资源都会被自动删除,你没必要去调用glDelete****()方法手动删除已丢失的资源。

参数

gl:GL接口 GL10 表示遵从OpenGL ES 1.0 标准。

surface的EGLConfig,用来创建匹配的缓冲。

void onSurfaceChanged(GL10 gl, int width, int height);

当surface尺寸改变的时候调用。

当surface被创建时和surface尺寸改变时都会调用本方法。

通常会在这里设置视口(Viewport),如果相机(Camera)是固定的,也可以在这里设置投影矩阵(projection matrix)

void onSurfaceChanged(GL10 gl, int width, int height) {
gl.glViewport(0, 0, width, height);
// for a fixed camera, set the projection too
float ratio = (float) width / height;
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);
}


参数:

gl:GL接口 GL10 表示遵从OpenGL ES 1.0 标准。

void onDrawFrame(GL10 gl);

当绘制一帧图像的时候会调用本方法。

本方法通常实现如下:

void onDrawFrame(GL10 gl) {
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
//... other gl calls to render the scene ...
}


参数

gl:GL接口 GL10 表示遵从OpenGL ES 1.0 标准。

3D开发教程

https://developer.android.com/guide/topics/graphics/opengl.html

http://blog.csdn.net/column/details/apidemoopengl.html

Android4游戏入门经典(第三版)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  界面 opengl es opengl