织梦CMS - 轻松建站从此开始!

罗索

当前位置: 主页>嵌入式开发>Android>

Cocos2d Android移植手记(一)——Opengl ES创建流程

jackyhwei 发布于 2011-12-28 10:21 点击:次 
由于一直没有发现android上的基于Opengl ES 2D/3D引擎库,所以自己准备将cocos2d移植到android平台上。最近做了些初步研究,这里逐步写下来,给自己留个笔记,也希望和大家一起讨论。闲言少叙,直接进入正题。
TAG:

前一阵子,一直在忙公司的iPhone的项目HourglassTimer,顺便了解下iPhone 平台上的2D引擎cocos2d-iphone库的使用。由于一直没有发现android上的基于Opengl ES 2D/3D引擎库(网上只发现了一个java monkey engine项目,pc平台上的游戏引擎。如果有人知道其他的开源项目,非常欢迎告诉我),所以自己准备将cocos2d移植到android平台上。最近做了些初步研究,这里逐步写下来,给自己留个笔记,也希望和大家一起讨论。闲言少叙,直接进入正题。

在android 1.0rc2 sdk中,提供了以下包支持Opengl ES 编程:

一、openglES包

android.opengl
Class:  
  GLDebugHelper:用于调试OpenGL ES程序的帮助类
  GLU:提供GL 公共工具功能的类
  GLUtils:连接OpenGL ES和Android API的工具类,其中提供了纹理图片的操作。
  Matrix:矩阵运算工具类
Exception:  
  GLException:OpenGL异常类
javax.microedition.khronos.egl
Interface:  
  EGL:GL的配置接口
  EGL10:GL1.0的配置接口
  EGL11:GL1.1的配置接口
Classes:  
  EGLConfig:GL配置的类
  EGLContext:GL运行环境的类
  EGLDisplay:GL显示窗口的类
  EGLSurface:可渲染GL的视图类
   
javax.microedition.khronos.opengles
Interfaces:  
  GL:Opengles的接口
  GL10:Opengles1.0的接口
  GL10Ext:Opengles1.0的扩展接口
  GL11:Opengles1.1的接口
  GL11Ext:Opengles1.1的扩展接口
  GLExtentsionPack:Opengles的扩展接口
  EGLDisplay:GL显示窗口的类
  EGLSurface:可渲染GL的视图类

二、通常创建流程:

a)创建一个EGL实例

EGL10 mEgl = (EGL10) EGLContext.getEGL();

b)创建一个EGLDisplay实例

EGLDisplay mEglDisplay = mEgl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);

c)初始化EGLDisplay

mEgl.eglInitialize(mEglDisplay, version);

d)选择Config

mEgl.eglChooseConfig(mEglDisplay, configSpec, configs, 1, num_config);

EGLConfig mEglConfig = configs[0];

e)创建opengl运行环境

EGLContext mEglContext = mEgl.eglCreateContext(mEglDisplay,mEglConfig,EGL10.EGL_NO_CONTEXT,null);

f) 创建新surface

mEglSurface = mEgl.eglCreateWindowSurface(mEglDisplay,

mEglConfig, holder, null);

g) 将opengles环境设置为当前

mEgl.eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface,mEglContext);

h) 获取当前opengles画布

GL gl = mEglContext.getGL();

i) 显示绘制结果到屏幕上

mEgl.eglSwapBuffers(mEglDisplay, mEglSurface);

三、示例Cube分析

这里简要分析下 google提供的示例代码APIDemos中的Cube的运行结构,具体代码就不详细列出了。

静态类关系图:

classes

对象协作图:

assist

首先,由GLSurfaceViewActivity的实例在onCreate函数中,创建一个GLSurfaceView实例用于显示绘制OpenglES;

其次,创建一个CubeRenderer的实例,用于渲染Cube对象;

然后,使用GLSurfaceView的setRenderer方法,创建一个GLThread实例。CLThread实例创建一个EglHelper实例初始化opengle环境,并且在run函数中循环运行CubeRender的drawFrame方法;

最后,使用setContentView方法,将GLSurfaceView的实例添加到显示窗口。

特别需要注意多线程同步问题,由于绘制是由绘制线程处理的,所以当主进程在调用surfaceCreated,surfaceDestroyed,onPause,onResume,onWindowFocusChanged,

onWindowResize,requestExitAndWait,queueEvent,getEvent时,

都会访问绘制线程,所以这些方法需要使用同步关键字synchronized锁定绘制线程,主线程必需要等待绘制线程执行完相应的方法后,在继续执行。

今天先写到这里,主要简要介绍了Opengl ES创建流程,下一篇我将介绍下《cocos-android的包框架设计》。

(海市蜃楼)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201112/15552.html]
本文出处:moandroid.com 作者:海市蜃楼 原文
顶一下
(2)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容