月度归档:2010年06月

初窥 Android 游戏开发

最近一个月的时间熟悉了一下 Android 平台上的游戏开发流程. 因为游戏相对于软件来说还是有一定区别的, 可能跟系统提供的大部分 API 关系并不是特别的大,主要使用的可能就是系统的图形和声音,以及影像相关的 API 了。

最初学习 Android,只是跟着官方提供的文档和示例一个个地去抄,抄完了之后自己写,主要就学习了一下 Activity 的一些简单的知识,主要是 Activity 之间的通信,Activity 的生命周期,以及 Activity Stack 等等一些。对于游戏开发几乎是 0,因为之前自己做的工作主要是 Java 中间件开发,使用的技术是 JNI,并没有太多的接触过业务逻辑,对于功能的实现和集成还是非常的生疏。此次游戏开发委实长了不少的经验啊。从对 Android 的基础绘图 API 和线程的控制,状态机的维护,资源的释放等等,不一而足啊。

下面列举一下,近来学习的一些方面:

  • SurfaceView 的使用,我想这大概是 Android 为了游戏开发人员做的一个特殊的基类,通过继承该类,并实现 SufaceHolder.CallBack 接口便可,通过 SurfaceHolder.lockCanvas() 获取画布,之后的各种绘制操作均可在当前画布上执行 (Canvas.draw() 系列方法),之后使用 SurfaceHolder.unlockCanvasAndPost(Canvas canvas) 方法,将绘制刷新到屏幕。
  • Thread.sleep(long millis) 方法中的 millis 是跟系统时钟相关的,并不是真正的实际的时长,所以在这里需要做一个换算,使用多次 Thread.sleep(long millis) 方法来探测当前的换算比是多少,然后使用自己所需要的时长乘以该比值,设置给 sleep() 方法,才能得到正确的效果。
  • 关于游戏配置资源的读写,在游戏中,通常会有几种资源文件,图像,声音,XML 关卡数据,游戏运行时配置文件 (ini/properties). 声音,图像,XML 文件通常只需要使用系统默认的资源管理方式即可,如果程序中不需要使用文件名来进行配置的话,但是如果需要使用“logo.png”类似的名字来进行配置的话,可能系统提供的通过资源预编译后 ID 的方式就并不是那么尽如人意了,通常这种情况下,可以通过 AssetManager.open(String fileName) 来打开 assets 目录下的文件,可以使用子目录只是 fileName 就应该是”subfolderName/filename” 这种格式了。在写入配置文件时,Android 为每个应用程序都提供了一个私有目录,”file://data/data/fullpackagename/files/” 目录 (fullpackagename 是当前应用程序所在的包名,例如 com.xixun.games),通过调用 Context.openFileInput(String name, int mode) 和 Context.openFileOutput(String name, int mode) 来获取输入和输出流。
  • Bitmap 相关方法将可能导致 error:OutOfMemory,这个确实是在手持设备上的一个问题,Android Dalvik VM 的实现中,只给了每个应用程序 8M(该数据从互联网查得,并未验证是否属实) 的内存用于图形,当程序为 Bitmap 对象申请超过 8M 内存时,将会抛出该错误 (不是异常) 并退出程序,并没有什么非常好的方法一定能帮你解决这个问题,通常我们应该养成一种编程行为习惯,那就是在 Bitmap 不再使用的时候立刻将资源回收 (调用 Bitmap.recyle() 方法),因为 Bitmap 的实现是系统级别的 API,VM 对这种对象的管理并不会那么尽如人意,所以最好还是程序自身来管理,否则在后续的开发中,如果再次加入更大的资源将极为频繁地出现该问题。那么什么时候可能会出现该问题呢?8M 的内存,我什么时候可能知道内存快要用了呢?对,你不知道,我也不知道,不过我们要预防,而且自己在编程时也可以简单的计算一下,如果你使用 png 图片的话,1.5M,到了程序中,如果你将所有的 png 均转化成了 Bitmap 对象,那么你的程序中使用的内存就至少会使用 4.5M 的内存。而且如果图片还带透明效果的话,那么就可能是 6M 的内存了。

以上就是近期的一些学习总结。下次将分享一个关于 Android 应用程序访问网络的问题。

据说明天有雨

北京近来连日的阴雨天气,让我心中甚是欣慰啊,对北京最为不满的不是生活节奏太过于忙碌,也不是压力过大,更多的是因为城市粉尘委实严重了些,所以每日早晨醒来第一件事情就是祈祷今天老天能否下几滴雨,把这脏兮兮的天空稍微涮一涮。近日每逢傍晚必有大雨,且是雷雨交加,甚和我意啊,虽然每日加班至夜深归家,出门能有一口清新的空气可以呼吸,心中仍是大慰啊。生活总是要继续的,偶尔的惊喜已经能让逐渐麻木的神经陡然兴奋片刻。

来到喜讯已经一个月了,上月 18 日从超图离职,回想一下,其实超图固然有超图的好,但是好总归好,不一定是自己的,好可能是别人的,还是现在的喜讯能带来的快乐会更多一些,虽然老大近日对进度的催促已经愈来愈频繁了,不过随着对 Android 的日渐熟悉,对进度的把握也是慢慢的有谱了。接下来对于 3D 的学习可能会持续一段时间,之前对于游戏的排斥也是没来由的,现在已经踏上了游戏开发的这一条道路,究竟将来如何还需好生琢磨一番。近日希望能培养自身对游戏的热爱,延续高中时代对于街机的那种狂热的感觉。

对于 Java 编程的种种固有的观点以及抽象的方法,在近日的 Android 代码优化过程中产生了一些疑问,天下没有通用的模式也没有通用的方法,一切道皆有道,一切道皆非道,以无意应有形,是为道也。我想也许编码也是这样的吧,虽然编码总是局限于某种语言,局限于某个平台,总是需要考虑到诸多关于内存管理的不同,甚至编码习惯的改变,不过这一切的一切总是不会逃脱帮人们解决问题的法门,通过既有的一些规则,实现与机器的对话,使用电流这一工具来达成我们的意愿,我想一切还是简单为妙,编程无非就是将电流脉冲的组织方式以人能读懂的方式编写出来,简单应是最美。

大道至简,我想未窥管中一斑的我,虽未能识大道但上道的心自是有的,或许积年之后,也能成一番小事的。

近期汇报

近日刚刚换的工作,从超图到喜讯,从传统 GIS 平台厂商到移动互联网娱乐,其间的区别只有自己知晓。转变必然是痛苦的吗?我想大体上上不是这样的,对于我来说,转变总是来得不算太快,因为时刻准备着迎接 2012 的人,应该不畏惧改变和阵痛。上天赐予了我健全的身体与人格,我想我还是应该乐观地去面对我所拥有的一切的。

虽然如今每日回到家中多半已是夜深之时,与亲人通话的时间已经是大大减少了,工作上的压力也还是蛮大的,独自负责一个平台上的产品研发,总是让自己显得有些力不从心,不过幸好有 67 的陪伴,总是能与他一起讨论诸多的实现问题,分享技术知识 。一直都在恶补开发平台 Android SDK 的各种知识,补习游戏开发中需要的一些知识,工作充实而快乐着。

可惜了床头的两本小书,一本《读库 1002》一本是《网民的狂欢》,都是自己比较喜欢的读物类型,不过近日工作着实是较为忙碌,每日归家之后甚感疲惫,每日也就早饭间隙中翻翻,读书还是需要坚持的,因为阅读带来的快乐是任何别的事物无法替代的,虽然每日公车上翻阅 Google Reader 中积攒的文章能带来些许快感,但终究只是隔靴搔痒,大体上均是一些时事资讯一类的,互联网的繁荣让我学会了快速汲取营养,逐渐成长,同样也带来了极大的信息冗余,通常一篇较好的原创性质文字,总是被各大 Web 2.0 资讯平台相互传阅,对于订阅者来说这就存在很大的信息冗余,从低碳绿色的角度来看,这样浪费了更多的带宽和硬盘,以及机房的电。

喜讯的生活很简单,忙碌但不盲目,快乐总是来得很简单,老大随意间的一个玩笑,泰峰偶尔分享的小笑话,总是能让大家开心,每日的用餐时间是最让人激动的。呵呵,有吃的总是很好的。就写到这里吧,之后可能会定期更新一些 Android 开发相关的博客,目前还属于研究学习阶段,大部分知识不成体系,自己知之也是甚少啊。

希望未来的一段日子,喜讯真正地给四面八方传播喜讯,Laputa 也能慢慢码出一些稍微有味道的文字来!

世界和平,空气清新,总是我最大的梦想!