Android开源游戏引擎之Angle(二)——开始前的准备
程序员文章站
2022-06-07 22:22:19
...
在上一篇博客(http://maosidiaoxian.iteye.com/blog/1934842),我们已经对Angle这个Android开源游戏引擎有了简单的了解,并完成了第一步必备的准备工作——下载它的1.0发布包。但是在把它使用到我们的项目之前,还需要进一步的准备——修改源码。
这一篇将主要讲如何对它进行一些必要的修改,之后的文章再一起和大家解析它的代码及学习如何去运用它。
下面先把下载下来的Angle v1.0.zip解压,然后把工程导入eclipse,Run as Android Application,让它在手机上跑起来(由于模拟器太卡太慢,有了Android手机之后,我一般是直接用手机调试程序的)。
如果你的手机是2.2或2.3的,可能会出现下面一个问题,在运行之后打开任意一个demo,然后按返回键回到菜单,然后会出现一个错误,logcat同时打印以下信息:
这个问题我以前用另一部手机也出现过,不过很遗憾,目前的HTC手机4.0.4系统,没出现这个问题。
这个问题在项目的issue 13可以看到,作者解释了其中的原因,原来是因为android 2.2以前的版本的一个bug,必须在退出之前创建一个新的EGL context,而在2.2及其之后,就不需要了。
对于这个问题,作者在之后的代码也修复了,见其项目上-r86的版本,地址如下:http://code.google.com/p/angle/source/detail?r=86。只要注释掉RenderThread.java中的其中一行代码:
不过纠结的是,没注释掉这一行代码,在我4.0.4的手机上能正常使用,我建了1.5和2.1.的模拟器,在把上面那一行代码注释掉之后,发现在1.5,2.1的模拟器和4.0.4的手机上也正常。
所以如果在你的手机出现这个问题了,请注释掉这一行代码试试。
第二个修改的地方,是其中获取时间间隔的方法。在1.0版本当中,作者是通过System.currentTimeMills()来获取系统当前时间,然后计算时间间隔的。但是系统当前时间却是可以被改变的,例如用户设置,或是其他程序调用了SystemClock.setCurrentTimeMillis(long)。如果在这期间系统时间被改变,那么计算到的时间间隔实际上也就不准确了。所以需要改为使用SystemClock.uptimeMillis()来获取。关于SystemClock代码,以后会再写篇文章简析。要改的地方共有三个文件,见地址:http://code.google.com/p/angle/source/detail?r=85。
除了作者在之后的提交的代码所作的修改之外,第三个是作者在AngleFont.java中使用硬编码的方式来获取SD卡的路径,需要将其改为Environment.getExternalStorageDirectory().getPath()。因为有可能你将它用于智能电视上,而目前一些智能电视是没有/sdcard这个路径的,外部存储设备被挂载在/mnt/中的usb或udisk等目录中,使用"/sdcard/"这样的硬编码的话,在这些设备上运行就会出错了。
最后附上我修改之后的代码下载地址:http://www.vdisk.cn/down/index/14742861
这一篇将主要讲如何对它进行一些必要的修改,之后的文章再一起和大家解析它的代码及学习如何去运用它。
下面先把下载下来的Angle v1.0.zip解压,然后把工程导入eclipse,Run as Android Application,让它在手机上跑起来(由于模拟器太卡太慢,有了Android手机之后,我一般是直接用手机调试程序的)。
如果你的手机是2.2或2.3的,可能会出现下面一个问题,在运行之后打开任意一个demo,然后按返回键回到菜单,然后会出现一个错误,logcat同时打印以下信息:
E/AndroidRuntime( 9071): FATAL EXCEPTION: RenderThread E/AndroidRuntime( 9071): java.lang.IllegalArgumentException: Make sure the SurfaceView or associated SurfaceHolder has a valid Surface E/AndroidRuntime( 9071): at com.google.android.gles_jni.EGLImpl._eglCreateWindowSurface(Native Method) E/AndroidRuntime( 9071): at com.google.android.gles_jni.EGLImpl.eglCreateWindowSurface(EGLImpl.java:87) E/AndroidRuntime( 9071): at com.android.angle.EglHelper.createSurface(EGLHelper.java:89) E/AndroidRuntime( 9071): at com.android.angle.RenderThread.guardedRun(RenderThread.java:149) E/AndroidRuntime( 9071): at com.android.angle.RenderThread.run(RenderThread.java:53) W/ActivityManager( 106): Force finishing activity com.android.tutorial/.AngleTutorials
这个问题我以前用另一部手机也出现过,不过很遗憾,目前的HTC手机4.0.4系统,没出现这个问题。
这个问题在项目的issue 13可以看到,作者解释了其中的原因,原来是因为android 2.2以前的版本的一个bug,必须在退出之前创建一个新的EGL context,而在2.2及其之后,就不需要了。
对于这个问题,作者在之后的代码也修复了,见其项目上-r86的版本,地址如下:http://code.google.com/p/angle/source/detail?r=86。只要注释掉RenderThread.java中的其中一行代码:
if (restartEgl) { mEglHelper.start(configSpec); // gl = (GL10) mEglHelper.createSurface(mView.getHolder()); }
不过纠结的是,没注释掉这一行代码,在我4.0.4的手机上能正常使用,我建了1.5和2.1.的模拟器,在把上面那一行代码注释掉之后,发现在1.5,2.1的模拟器和4.0.4的手机上也正常。
所以如果在你的手机出现这个问题了,请注释掉这一行代码试试。
第二个修改的地方,是其中获取时间间隔的方法。在1.0版本当中,作者是通过System.currentTimeMills()来获取系统当前时间,然后计算时间间隔的。但是系统当前时间却是可以被改变的,例如用户设置,或是其他程序调用了SystemClock.setCurrentTimeMillis(long)。如果在这期间系统时间被改变,那么计算到的时间间隔实际上也就不准确了。所以需要改为使用SystemClock.uptimeMillis()来获取。关于SystemClock代码,以后会再写篇文章简析。要改的地方共有三个文件,见地址:http://code.google.com/p/angle/source/detail?r=85。
除了作者在之后的提交的代码所作的修改之外,第三个是作者在AngleFont.java中使用硬编码的方式来获取SD卡的路径,需要将其改为Environment.getExternalStorageDirectory().getPath()。因为有可能你将它用于智能电视上,而目前一些智能电视是没有/sdcard这个路径的,外部存储设备被挂载在/mnt/中的usb或udisk等目录中,使用"/sdcard/"这样的硬编码的话,在这些设备上运行就会出错了。
最后附上我修改之后的代码下载地址:http://www.vdisk.cn/down/index/14742861
上一篇: 如何创建关系矩阵图?创建关系矩阵图的方法
下一篇: 鲜牛奶的新吃法,让你一口就上瘾