前一阵子,一直在忙公司的iPhone的项目HourglassTimer,顺便了解下iPhone 平台上的2D引擎cocos2d-iphone库的使用。由于一直没有发现android上的基于Opengl ES 2D/3D引擎库(网上只发现了一个java monkey engine项目,pc平台上的游戏引擎。如果有人知道其他的开源项目,非常欢迎告诉我),所以自己准备将cocos2d移植到android平台上。最近做了些初步研究,这里逐步写下来,给自己留个笔记,也希望和大家一起讨论。闲言少叙,直接进入正题。 在android 1.0rc2 sdk中,提供了以下包支持Opengl ES 编程: 一、openglES包
二、通常创建流程: 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的运行结构,具体代码就不详细列出了。 静态类关系图: 对象协作图: 首先,由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的包框架设计》。 (海市蜃楼) |