為什麼要優化?
游戲能夠被劃分為兩種較廣泛的類型:實時型和按鍵驅動型。按鍵驅動類型的游戲一般在屏幕上顯示游戲目前所處的狀態,並且等待玩家輸入某些按鍵來驅動游戲繼續運行。棋牌類游戲,大部分的解謎類游戲以及策略類和文字類游戲都屬於這類游戲。而實時游戲,特別是動作游戲不會等待玩家的輸入,他們一直運行直到游戲的結束。
動作類游戲一個重要的特征就是將大量的運算花在屏幕顯示上,而且刷新率(FPS)必須保持在10以上。這類游戲還必須要有大量的動作來使得游戲具有更高的挑戰性。這類游戲需要玩家有快速的反應和很好的手眼協調能力,所以這類游戲對鍵盤輸入的反應也有極高的要求。為使得程序在高速運行時能對鍵盤做出及時的反應,圖像能以高速的FPS來運行,我們就必須優化我們的代碼,以使得我們的程序能以最快的速度運行。
J2ME是一個精簡的Java版本,適合只有有限容量的小型設備,例如手機和PDA,J2ME設備有:
◆有限的輸入能力
◆屏幕尺寸很小
◆受限的內存及堆大小
◆很慢的CPU
這些特點使得在J2ME平台上編寫快速的游戲並不是件易事。相對於電腦游戲來說,編寫J2ME平台上的游戲會對程序有更高的要求和更進一步的挑戰。
何時不用優化?
如果你編寫的游戲不時動作游戲,有可能不必去優化。假如玩家需要幾秒鐘甚至幾分鐘去思考他下一步怎樣走,那他將不會注意到你的游戲的按鍵響應超過幾百毫秒。不過一個例外是如果你的程序需要大量的運算去決定它下一步怎樣走,例如棋類游戲需要在幾百萬種組合中去尋找。假如這樣的話,你有可能想要優化你的代碼以使得電腦僅需要幾秒鐘而不是幾分鐘去決定他下一步的動向。
即使你正在編寫這類游戲,優化也是相當危險的。這些技術將伴隨著高昂的代價,他將使你的代碼不易讀。這就需要開發者自己去平衡。增大了JAR文件的大小來換取程序少量性能的提高是否是值得的。下面給出不要去優化的更多的理由。
◆優化將很容易引入bug
◆有些優化技術將使得移植變得困難
◆有可能你付出了巨大的努力卻收效甚微
◆統一的優化一般比較困難
我需要對最後一點做一些解釋:由於優化的是一個不定的目標及平台,有些方法可能在Java平台上運行快一點,而有些可能在J2ME平台上運行快一點。由於執行環境存在著巨大的差異,你的代碼可能在模擬器上跑得很快,但是在真機上卻很慢。反之也有可能。你對一種機型的優化可能會造成在另一種平台上性能的下降。
但這些並不代表我們沒有了希望。你可以通過兩種方法來進行優化,高級優化和低級優化。高級優化可以在任意的平台上來提高程序的性能,甚至全面的提高代碼的質量。而低級優化則是相對於某種特定機型的優化技術。高級優化即算法上的優化,低級優化即程序層面對於單個函數執行效率的優化。Michael Abrash, Quake的開發者之一,曾經寫到:"the best optimizer is between your ears". (最好的優化者在你的兩耳之間).使用優良的算法所能提高的效率比在一個普通算法的程序上使用低級優化所能提高的效率要高得多。
我們將使用J2ME Wireless Toolkit的Profiler去剖析你的代碼的運行效率,它也將幫助你更精確的測量出這些技術對於提高性能的有效性。
在哪裡優化?
在動作類游戲中,90%的程序執行時間被花費在了10%的代碼段中。這10%的代碼段是我們需要集中全力去優化的部分。我們將使用profiler去找到這10%代碼的位置。照下圖我們打開J2ME Wireless Toolkit的Profiler功能。
我們必須要在模擬器中運行程序並退出後才會彈出Profiler窗口,如下圖:
注意在左窗口中該函數所占用cpu百分比,這個百分比是總執行時間花在每個特定函數上的百分比,接下來我們只要找到占用百分比最多的那個函數來優化就可以了。
有幾點需要注意的。首先:你的百分比數和我的肯定有很大的不同,但是有一點是相同的即花費時間最長的函數所占的百分比數最大。每次運行程序我的百分比數都會不同,為了盡可能的保持統一,我們在測試前應當關閉其他的程序。其次:測試時不要混淆,否則你將看到函數名類似於a,b,z..最後:Profiler並不知道你模擬的是什麼機型。記住,真機才是真理。