4.5.2 檢查設(shè)備的兼容性
盡管使游戲能夠盡可能地適應(yīng)各種不同的設(shè)備是明智之舉,但有時(shí)還是需要為游戲指定一個(gè)最低硬件配置要求。為了能夠簡(jiǎn)化對(duì)運(yùn)行游戲的設(shè)備進(jìn)行性能檢測(cè)的操作,我們?cè)谟螒蛞娴腃GameEngineBase類中添加一些性能檢測(cè)函數(shù)。
使用這些函數(shù),游戲可以指定任何特定的配置。引擎會(huì)對(duì)這些配置一一進(jìn)行驗(yàn)證,以一個(gè)值的形式返回驗(yàn)證結(jié)果,通過該值就可以知道設(shè)備有哪些配置沒有滿足。然后可以生成一條信息向用戶解釋為何游戲無(wú)法運(yùn)行。
要檢測(cè)很多項(xiàng)性能,分為以下幾類:
● 屏幕分辨率
● 輸入功能
● Windows Mobile版本
性能檢測(cè)應(yīng)當(dāng)寫成方便以后進(jìn)行擴(kuò)展的形式(事實(shí)上,在后面的章節(jié)中繼續(xù)對(duì)游戲引擎進(jìn)行開發(fā)時(shí),我們還將添加更多的性能檢測(cè)選項(xiàng))。
我們使用一個(gè)枚舉來(lái)標(biāo)識(shí)每個(gè)性能檢查項(xiàng)。每一項(xiàng)的值都為2的冪。這樣,我們只需要在該值上執(zhí)行一次OR按位運(yùn)算,就可以將各個(gè)單獨(dú)的標(biāo)識(shí)值合并為一個(gè)單獨(dú)的值。我們將在該枚舉中應(yīng)用Flags特性,這樣.NET就會(huì)知道我們是通過這種方式來(lái)使用枚舉的。
該枚舉如程序清單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
}
用于檢測(cè)設(shè)備是否滿足這些性能需求的函數(shù)為CheckCapabilities。將所有需要檢驗(yàn)的性能需求編碼后作為參數(shù)傳遞給它,該函數(shù)根據(jù)性能需求對(duì)實(shí)際的設(shè)備硬件進(jìn)行檢驗(yàn)。您可以在CGameEngineBase類源代碼的結(jié)尾處找到該函數(shù)。
該函數(shù)依次檢測(cè)每個(gè)需求,首先是屏幕分辨率,它獲取屏幕的寬度和高度(以像素為單位),并且確保屏幕是豎屏(高度大于寬度)。然后將性能需求中每一個(gè)設(shè)置了分辨率性能標(biāo)志的分辨率與實(shí)際的屏幕大小進(jìn)行對(duì)比,將不能滿足的分辨率性能標(biāo)志記錄到missingCaps變量中。
TouchScreen標(biāo)志只需要簡(jiǎn)單地調(diào)用IsSmartphone函數(shù)來(lái)進(jìn)行檢測(cè)——如果返回true,說(shuō)明不是觸摸屏,就將該標(biāo)志添加到missingCaps變量中。
為了確定Windows Mobile的版本,需要檢測(cè)Environment.OSVersion.Version對(duì)象。它將返回主版本和次版本號(hào)。
使用Version對(duì)象的CompareTo函數(shù),我們可以輕松地驗(yàn)證設(shè)備上運(yùn)行的是哪個(gè)版本的操作系統(tǒng)。同樣,所有不匹配的操作系統(tǒng)版本性能標(biāo)志將被添加到missingCaps變量中,最后將missingCaps返回給函數(shù)調(diào)用過程。
通過這種方法對(duì)設(shè)備進(jìn)行檢測(cè),使我們的代碼可以確切地看到哪些性能是不滿足的,但我們需要將這些信息反饋給用戶。這就要用到引擎中的另一個(gè)函數(shù):ReportMissingCapabilities。它可以將這些不滿足的性能轉(zhuǎn)換為一個(gè)可讀的報(bào)告,并呈現(xiàn)在屏幕上。
ReportMissingCapabilities函數(shù)需要另一個(gè)Capabilities參數(shù);這次,它將從CheckCapabilities函數(shù)返回的值作為未滿足的性能。首先找到未滿足的最低分辨率,如果找到了,就將它添加到一個(gè)字符串中(該字符串將被返回)。次低分辨率就不需要顯示了,因?yàn)閷?shí)際上只需要找到要求最低的分辨率即可。
在對(duì)Windows Mobile版本進(jìn)行檢測(cè)時(shí)也采用同樣的方法:只需要指定需求中最低的版本即可。
在檢測(cè)是否為觸摸屏?xí)r也可以用該方法,返回需求字符串。
在游戲中進(jìn)行性能檢測(cè)是通過在窗體的Load事件中調(diào)用這兩個(gè)函數(shù)來(lái)實(shí)現(xiàn)的。
如果我們發(fā)現(xiàn)一些性能需求不能滿足,就將情況告訴用戶,然后關(guān)閉窗體,退出游戲。例如,程序清單4-25中指定了游戲的性能需求為:VGA及以上分辨率、觸摸屏、以及Windows Mobile 6。