4.5.2 检查设备的兼容性
尽管使游戏能够尽可能地适应各种不同的设备是明智之举,但有时还是需要为游戏指定一个最低硬件配置要求。为了能够简化对运行游戏的设备进行性能检测的操作,我们在游戏引擎的CGameEngineBase类中添加一些性能检测函数。
使用这些函数,游戏可以指定任何特定的配置。引擎会对这些配置一一进行验证,以一个值的形式返回验证结果,通过该值就可以知道设备有哪些配置没有满足。然后可以生成一条信息向用户解释为何游戏无法运行。
要检测很多项性能,分为以下几类:
● 屏幕分辨率
● 输入功能
● Windows Mobile版本
性能检测应当写成方便以后进行扩展的形式(事实上,在后面的章节中继续对游戏引擎进行开发时,我们还将添加更多的性能检测选项)。
我们使用一个枚举来标识每个性能检查项。每一项的值都为2的幂。这样,我们只需要在该值上执行一次OR按位运算,就可以将各个单独的标识值合并为一个单独的值。我们将在该枚举中应用Flags特性,这样.NET就会知道我们是通过这种方式来使用枚举的。
该枚举如程序清单4-24所示。
程序清单4-24 Capabilities 枚举
/// <summary>
/// Capabilities flags for the CheckCapabilities and
/// ReportMissingCapabilities functions
/// </summary>
[Flags()]
public enum Capabilities
{
SquareQVGA = 1,
QVGA = 2,
WQVGA = 4,
SquareVGA = 8,
VGA = 16,
WVGA = 32,
TouchScreen = 64,
WindowsMobile2003 = 128,
WindowsMobile5 = 256,
WindowsMobile6 = 512
}
用于检测设备是否满足这些性能需求的函数为CheckCapabilities。将所有需要检验的性能需求编码后作为参数传递给它,该函数根据性能需求对实际的设备硬件进行检验。您可以在CGameEngineBase类源代码的结尾处找到该函数。
该函数依次检测每个需求,首先是屏幕分辨率,它获取屏幕的宽度和高度(以像素为单位),并且确保屏幕是竖屏(高度大于宽度)。然后将性能需求中每一个设置了分辨率性能标志的分辨率与实际的屏幕大小进行对比,将不能满足的分辨率性能标志记录到missingCaps变量中。
TouchScreen标志只需要简单地调用IsSmartphone函数来进行检测——如果返回true,说明不是触摸屏,就将该标志添加到missingCaps变量中。
为了确定Windows Mobile的版本,需要检测Environment.OSVersion.Version对象。它将返回主版本和次版本号。
使用Version对象的CompareTo函数,我们可以轻松地验证设备上运行的是哪个版本的操作系统。同样,所有不匹配的操作系统版本性能标志将被添加到missingCaps变量中,最后将missingCaps返回给函数调用过程。
通过这种方法对设备进行检测,使我们的代码可以确切地看到哪些性能是不满足的,但我们需要将这些信息反馈给用户。这就要用到引擎中的另一个函数:ReportMissingCapabilities。它可以将这些不满足的性能转换为一个可读的报告,并呈现在屏幕上。
ReportMissingCapabilities函数需要另一个Capabilities参数;这次,它将从CheckCapabilities函数返回的值作为未满足的性能。首先找到未满足的最低分辨率,如果找到了,就将它添加到一个字符串中(该字符串将被返回)。次低分辨率就不需要显示了,因为实际上只需要找到要求最低的分辨率即可。
在对Windows Mobile版本进行检测时也采用同样的方法:只需要指定需求中最低的版本即可。
在检测是否为触摸屏时也可以用该方法,返回需求字符串。
在游戏中进行性能检测是通过在窗体的Load事件中调用这两个函数来实现的。
如果我们发现一些性能需求不能满足,就将情况告诉用户,然后关闭窗体,退出游戏。例如,程序清单4-25中指定了游戏的性能需求为:VGA及以上分辨率、触摸屏、以及Windows Mobile 6。