Android游戏开发底层起步(一)

Android游戏开发的特点有二:

一是基于Java语言,二是基于OpenGL

因此要精通Android开发的底层技术,不得不从此两方面入手。


本系列文章,分析用的代码来自于LGame-0.3.1版本,在此感谢其作者为我们提供学习用源码!


OpenGL能给我们的游戏带来优异的性能。但是OpenGL只是一个优秀的图形编程标准,为我们提供了发挥图形硬件性能的借口,但是它并没有提供创建窗口的方法。我们一切的绘图的操作都需要一个窗口(包括全屏模式),没有窗口我们什么都做不了。


幸运地是,出现了GLUT (OpenGL Utility Toolkit)(OpenGL工具包)。它被用来轻松应对窗口、按钮以及用户事件。我们可以使用C/C++去调用它,但是对于想要使用真正面向对象语言的JAVA程序员来说,或者是Android程序员来说。Java与OpenGL的绑定是必须的。


虽然Android提供了OpenGL的支持,但是在模拟器上调试OpenGL程序是非常痛苦的。所以我建议想深入了解Android游戏开发的朋友,最好还是先从桌面端的JAVA+OpenGL入手。

桌面端的JAVA程序玩的很熟了,Android上的程序也就只是“照猫画虎”了。特别是对于那些没有Android真机的朋友。


有许多用Java去结合OpenGL的尝试,但是第一个被大家认可并注意的是Java对于OpenGl的绑定(Java Bindings for OpenGL), 或者称为JOGL。理由是它得到Sun(Java的创建者)和SGI(OpenGL的创建者)的支持。


OpenGL 的发展历程
  1992年7月 发布了 OpenGL 1.0 版本,并与微软共同推出 Windows NT 版本的 OpenGL
  1995年 OpenGL 1.1 版本面市,加入了新功能,并引入了纹理特性等等。
  一直到 2009年8月Khronos小组发布了 OpenGL 3.2,这是一年以来 OpenGL进行的第三次重要升级。

Android 3D 引擎采用的是 OpenGL ES OpenGL ES 是一套为手持和嵌入式系统设计的3D 引擎API。

Android 系统使用 OpenGL 的标准接口来支持3D 图形功能,android 3D 图形系统也分为 java 框架和本地代码两部分。本地代码主要实现的  OpenGL 接口的库,在Java 框架层,javax.microedition.khronos.opengles java 标准的  OpenGL 包,android.opengl 包提供了  OpenGL 系统和Android GUI 系统之间的联系。

Android 支持 OpenGL 列表
1、GL
2、GL 10
3、GL 10 EXT
4、GL 11
5、GL 11 EXT
6、GL 11 ExtensionPack

任何游戏开发都是基于框架的,从现在开始我们就一步一步的学习,怎么去写一个图形渲染框架去封装OpenGL,最后再发展成为一个成熟的游戏框架。

我们必须提供一个接口,以使上层程序与具体的底层的OpenGL的具体版本实现之间解除耦合。

因此需要一个GLEx类。我们再实时判断OpenGL的版本,从而去按需实例化GLEx类。

仔细研究Android的OpenGL包,发现其提供了:                需要搞懂Java中子接口的概念。

接口   javax.microedition.khronos.opengles.GL
接口   javax.microedition.khronos.opengles.GL10           执行了GL接口
接口        javax.microedition.khronos.opengles.GL10Ext                        执行了GL接口

接口   javax.microedition.khronos.opengles.GL11                             执行了GL10接口
接口   javax.microedition.khronos.opengles.GL11Ext                        执行了GL接口
接口       javax.microedition.khronos.opengles.GL11ExtensionPack   执行了GL接口


利用如下方法,我们可以获得OpenGL的版本号:

        String renderer = g10.glGetString(GL10.GL_RENDERER).toLowerCase();
        GLEx.isPixelFlinger = renderer.indexOf("pixelflinger") != -1;
        Log.i("Android2DView", "GLES:" + renderer);

其中:

public static final int GL_RENDERER

Since: API Level 1
Constant Value: 7937 (0x00001f01)

public abstract String glGetString (int name)

如果返回的字符串里含有“pixelflinger”        则OpenGL是软件实现。



OpenGl一般是在SurfaceView上绘图。

public abstract void onSurfaceCreated (GL10 gl, EGLConfig config)

Since: API Level 3

Called when the surface is created or recreated.

Called when the rendering thread starts and whenever the EGL context is lost. The EGL context will typically be lost when the Android device awakes after going to sleep.

Since this method is called at the beginning of rendering, as well as every time the EGL context is lost, this method is a convenient place to put code to create resources that need to be created when the rendering starts, and that need to be recreated when the EGL context is lost. Textures are an example of a resource that you might want to create here.

Note that when the EGL context is lost, all OpenGL resources associated with that context will be automatically deleted. You do not need to call the corresponding "glDelete" methods such as glDeleteTextures to manually delete these lost resources.

Parameters
gl the GL interface. Use instanceof to test if the interface supports GL11 or higher interfaces.
config the EGLConfig of the created surface. Can be used to create matching pbuffers.









你可能感兴趣的:(Android游戏开发底层起步(一))