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