Chengzhi Yang 2011-01-23

Writing Real-Time Games for Android

为Android编写实时游戏

学习笔记

这篇文章是Chris Pruett 在Google I/O 2009的一个演讲视频的笔记。我翻译了大部分的演讲的演示稿,里面有不少疏漏,臆断和错误都是我记录的时候造成的,与演讲作者无关。本文的版权归演讲作者所有。转载请保留演讲作者的信息和本文链接。

你可以从下面的链接进入该主题在Google I/O 2009 的原文里面含视频和演示稿。http://www.google.com/events/io/2009/sessions/WritingRealTimeGamesAndroid.html 演示稿的直接连接:http://dl.google.com/io/2009/pres/WritingRealTimeGamesforAndroid.pdf 演讲作者所制作的Android开源(apcha 2.0)游戏 Replica Island : http://replicaisland.net/ http://replicaisland.blogspot.com/ 该游戏的开发笔记!

为什么要在Android平台上面开发游戏?

为什么这个游戏是在Android平台上?

作者用G1演示了Replica island的demo。

alt text

### 游戏引擎架构-漂亮的线程,哟 我有三个线程: - 主线程(main thread)是由Android activity生成的。 负责引导游戏和接收输入事件。(引导即为负责整个游戏的生命周期) 在大多数情况下这个线程是休眠状态。 - 游戏线程(game thread)。 负责处理所有非渲染部分,包括:物理,AI,碰撞检测,动画,等。 这个线程还负责 game graph。(graph就是前文提到的类似于场景管理的树结构) - 渲染线程(rendering thread)。 这个线程被 SurfaceHolder所控制。 仅根据他的渲染列表来运行,他还会为每一帧触发OpenGL命令。—对于游戏的内容他什么都不知道。

alt text

写快速的Java代码

这里说的Java是指的是android平台下的Java。 Java给你提供了非常丰富的现成的功能。

我爱咖啡,我爱茶

关于JAVA的意见

第一步:内存管理

对Java内存分配的误解 * 把Java当作是C++来用。 * 许多标准的Java实用对象分配内存。 - Collections过时了 - 把enums忘记吧(他们真的很重量级) - Arrays.sort()也类似 - 所有返回String 的地方都必须是只读的(比如Class.getXXX();) * DDMS是你的命名和查错的工具。 * 比我更好的Java工程师也许可以给你更多的关于减少使用内存分配的实现方法。

第二步:不要调用函数

第三步:其他的技巧

高效的在屏幕上面画出东西

Android 渲染方法

作者对draw_texture, VBOs, Basic Quads, 和 Canvas在G1上面做了一个对比。在小于十个sprite的情况下四个都差不多,但随着sprite数量的上升,Basic Quads和Canvas的时间消耗增加的非常快,在1000个Basic Quads比Canvas快大约1/20,VBOs的时间消耗只是Basic Quads 的50%,而draw_texture又只是VBOs的55%。

哪种方法最好?

例子学习:渲染一个图块(Tiled)背景

性能技巧

游戏设计技巧