伯乐共勉

讨论。NET专区
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
S60平台游戏程序的编写
这一章节内容的对象是那些准备使用S60开发平台1.0和2.0的游戏开发者。
本章假定读者已经拥有了包括Active Objects,CleanupStack和编程习惯的Symbian OS上的C++编程的基本知识。如果有其他平台上的游戏开发经验就更好。

介绍
S60开发平台上游戏程序的编写

因为移动设备在CPU能力和显示技术方面已经变得越来越成熟,现在已经很适合作为游戏平台。S60开发平台提供了很多的API给开发者使用,并且操作系统本身也相对灵活。然而,在不同设备间变化的小屏幕,小键盘,还有其他一些问题一定要在开发游戏的时候考虑周全。

目的和范围

这一章节内容的对象是那些准备使用S60开发平台1.0和2.0的游戏开发者。本章假定读者已经拥有了包括Active Objects,CleanupStack和编程习惯的Symbian OS上的C++编程的基本知识。如果有其他平台上的游戏开发经验就更好。
Series 60 Specific Considerations列举了一些开发游戏时需要考虑的事项,Structure of the Game and Game Loop给出了一个典型的S60游戏结构,Timers, Keyboard, Graphics, Sounds, Networking and Communication 和 Installation介绍了游戏开发会用到的一些API,以及如何使用计时器,键盘事件处理,图形,声音和网络等等。文档提供了各种各样的小例子。


S60需要考虑的特异事项
需求

智能手机不像其他许多游戏设备,当一个游戏或者是其他的任何程序运行时,它应该都能够告知用户各种不同的系统事件。程序需要考虑各种可能的中断,例如,来电或短信。应用程序也不能够过分的占有和消耗设备有限的资源,比如内存和电池。

大多数的系统消息通过一个叫做global note的系统级对话框显示。对话框比应用程序拥有更高级别的窗口优先,因此他们出现在应用程序的前面,例如,当游戏时。

系统事件里的一个例外是来电,来电使电话程序变为最前端运行的程序,把被打断的程序放到后台。所有的系统事件都有一个共有的特征,那就是能够被应用程序所 捕捉。当系统事件发生,最前端的程序失掉前端运行状态,程序的用户接口类方法CAknAppUI::HandleForegroundEventL被调 用。通过重载方法,程序能够执行需要的动作,例如停止正在进行的游戏。

程序需要注意到电池的消耗。当设备在一定时段内不被使用,就会进入睡眠模式减少电量的使用。如果程序正在后台处理,设备不能进入睡眠模式。因此当游戏暂停 时,所有的检测在模块化循环里应该完成,所有的计时器应该停止。给程序创建自己的时限进入自己的睡眠模式是可行的,例如,当游戏在主菜单并且用户在一定时 段内没有任何操作时。当没有定义用户自己的内部时间时,程序能够从系统计时器得到事件。这可以通过调用e32std.h头文件中的RTimer:: Inactivity方法实现。

在电池供电的设备中软件需要为突然断电做准备。电池可能出问题或用户可能把电池取下。这应该注意到是否有重要的用户数据正在处理。数据应该瞬间被存储并且重启后恢复。另外,程序应该准备应付被破坏的数据,应该能够安全的从那种情况下恢复。

由于显示技术的不断精细,智能手机屏幕分辨率不断提高,游戏开发者应该在设计游戏时考虑到这一点。使未来的版本通过平滑移植以支持新的屏幕分辨率。

一个程序或是一个游戏的可升级设计可以通过显屏时考虑到屏幕的大小来实现,而不是写固定的代码坐标。屏幕的尺寸能够用CEikAppUi:: ApplicationRect()和CWsScreenDevice::GetDefaultScreenSizeAndRotation方法来查询。 S60用户界面库(Avkon)组件会支持这种可测量性,这应该在从Avkon类继承的时候考虑到。你也不必在继承类的显屏代码中做任何屏幕大小的假设, Avkon控件只用于他们被设计位置的上下文中。

限制

除了内存受限外,和PC比较,智能手机还有其他几方面的限制。智能手机没有PC那样高效的处理器,图形处理器更加罕有(写该文档时还没有)。数学处理器在智能手机中也是非常少有,因此,计算都是由整形数据来实现。

屏幕限制了分辨率,大小以及色彩深度,键盘有键的数量的限制。另外,键的设计可能并不有利于玩游戏。键的设计也有可能各式各样,因此,游戏应该允许用户自定义键。所有这些限制决定了什么样的游戏能够被实现用于智能手机上,在不失去可玩性的前提下。

内存

在内存受限设备上内存的管理就显得尤其重要。这包括运行时的内存使用和最终编译后代码的大小。大多数的Symbian操作系统和基于S60的设备仅有8M 甚至更少的RAM。除了RAM,设备还有用于预安装软件,安装程序的用户数据区,系统可写和永久数据文件的ROM。另外,可移动的内存卡如CF卡,MMC 卡也被一些智能手机所支持。

RAM使用的最重要一条规则是,所有分配的内存应该尽可能早的被释放。Symbian操作系统模拟器为所有具有图形用户接口的应用程序提供了内存检测的 宏。宏会检测应用程序是否没有释放它占用的内存,从而在程序开发的早期就把内存泄漏显现出来。在目标机器上,内核跟踪每一个线程的内存并且当线程退出时自 动释放内存来保证当程序退出时所有的内存都会被正确释放。

当执行程序时,堆栈的使用是值得注意的。在Symbian操作系统中,每一个线程都有它的内存堆栈,线程启动后,堆栈是不能增长的。S60中默认的堆栈大 小是8KB,这样会有助于更加注意的使用内存。在模拟器环境中和在目标机器上可供使用的堆栈空间会有不同。模拟器上堆栈的大小没有像目标机器上那样被限 制,因为代替它的是windows自己的堆栈。这就是为什么所有的软件都要在发布前尽可能在机器上做测试和为什么堆栈有最大限制的原因。大多数的堆栈溢出 都是因为堆栈描述符的使用。递归的使用是堆栈的一个特例。如果需要使用递归程序,那么传递的参数和递归部分内的自动变量的大小都应减小到最小。

由于游戏都需要图形,位图往往消耗掉内存的大部分。这应用于RAM和用户数据区。在不降低位图数量的情况下最有效的减少消耗的方法是降低颜色位深。 Symbian操作系统支持24位位图,相当于16777216色,但是最大的颜色数被目标机器所限制。位图位深不应该转化为大于机器颜色的位深。小的, 低细节的位图,不需要那么多的颜色,应该转化为上面提到的小于最大位深的位图。例如,8位色适合于大多数机器。所有的蒙板位图都应该转化为1位位图。

像位图一样,所有游戏中所用的数据—声音,音乐和视频—都不应该消耗太多的空间。