1. 程式人生 > >為什麼沒有好用的Android遊戲引擎

為什麼沒有好用的Android遊戲引擎

               

隨著Android平臺的不斷髮展,近期Android開發者數量呈現出上升勢頭,就連以往較為冷門的遊戲開發領域也湧現出不少生力軍。然而,全新的問題正擺在了初學者面前,很多他們從未遇過的問題開始浮上臺面。“找了好久也沒看見合適的引擎,看來Android真的不適合遊戲開發”、“我試過幾個遊戲引擎,感覺都不是很好,效率低、BUG不可控”,“怎麼中國就沒人能做個向Cocos2d那樣的引擎呢?看來還得等老外做好才能跟進啊。”這並不是虛妄之談,而是一些剛剛接觸Android遊戲開發者的真實意見。應該說,在有些網友的心目中,支援Android的遊戲引擎雖然並不算少,卻沒有一款好用的遊戲引擎。或者說,這些網友的疑問在於,世上怎麼就沒有一款能像iPhone下的Cocos2d-iPhone那樣好用又免費的Android遊戲引擎存在呢?

實事求的講,用Android進行遊戲開發,確實還存在不少問題,目前大多數Android遊戲引擎的功能,也確實不盡人意(至少不能直接拖拽出遊戲來……)。但是,又有多少人真正考慮過,為什麼會出現這種現象,為什麼會出現這種問題?難道真是Android效能不夠,程式設計師水平不夠嗎?其實,真正影響到Android遊戲引擎開發的問題,遠沒有表面上看到的那麼複雜,仔細說來,也無非是個“多平臺相容”的問題。沒錯,在Android遊戲開發的道路上,效能不是問題,相容才是問題,程式不是問題,環境才是問題,開發出多麼優秀的遊戲引擎都不是問題,怎麼才能讓這款遊戲引擎在任何情況下都顯得優秀才是問題。當我們進行單一手機品牌下的遊戲引擎開發時——比如iPhone,只要相容iPhone系列就已足夠,甚至更進一步,僅僅專注iPhone4也不打緊,畢竟現今用iPhone者大多“不怕雷劈”,去年的市場寵兒iPhone3應該早被他們棄如敝屣的換成了iPhone4。應該說,iPhone遊戲引擎乃至遊戲的製作團隊,可以將全部精力與時間都投入到效率與功能的完善上,而完全不必理會所謂的平臺相容問題。可當你為Android平臺設計遊戲引擎,開發Android遊戲時,事情恐怕就沒有那麼簡單。我們都知道,在OpenGL對於Linux來說,是一種非常高效的圖形程式設計介面,而Android核心又基於Linux開發,如果想要提高基於Linux開遊戲引擎的效能,那麼使用針對手機環境的OpenGL ES無疑會是最好的選擇。(當然,也有某些人出於種種原因使用Android2D)然而,相較於iPhone平臺,Android平臺並不固定於某款或某幾款智慧手機之上,由於眾多廠商的參與,使他在擁有相當龐雜的手機機型的同時,也面臨著非常龐雜的多機型相容挑戰,雖然Dalvik虛擬機器足夠強大,強大到足以抹殺大部分的環境差異。可惜的是,我們視為手機遊戲引擎效能保證的OpenGL ES,卻並不在此列,畢竟無論你的軟體平臺再怎麼強大,卻始終也無法跨越硬體的藩籬。即便OpenGL一直標榜自己獨立於硬體,可假如硬體對OpenGL的支援不足,那麼OpenGL也依舊無法滿功率的運算起來(某些古老Android機型,甚至還存在著浮點運算屏障|||……)。這意味著,如果Android引擎一味去追求最佳效率,就必須要放棄引擎在某些機型上的執行可能性。否則,某些平臺上的“良方”,就會立即變成另外一些平臺上的“毒藥”。
——我知道有網友做過Cocos2d-iPhone的Android移植,假如能看到這裡,大約可以會心一笑吧?而如果我們不管不顧,一味要讓Android在某些平臺達到最佳效能,而放棄另外一些平臺呢?這樣做的代價,就是您必須同持有某些Android機型的使用者說拜拜。“什麼,你是使用HTC的?對不起,我的程式只支援Nexus One。”“什麼,你竟然會用摩托羅拉?有沒有搞錯?我的遊戲是為三星定製的!”可您能夠想象,以上對話存在於現實的Android程式或遊戲開發中嗎?如果不能想象,那麼放棄某些機型這條遊戲引擎開發之路就是走不通的。實際上,雖然Android程式設計師可以擁有龐大的Android陣營支援,但無論你是專做摩托羅拉,搞得HTC統統罷工,還是專做Nexus One(或者傳說中的Nexus Two),搞得三星不買賬,都會造成相當巨大的損失。而假如我們不追求速度,一味要求跑全機型呢?那麼,在引擎設計上,就必須儘可能減少對OpenGL ES API的依賴,僅使用所有機型共同支援的那部分,以求最大限度的避免不相容程式碼出現,就算——這段程式碼能提升100%的程式效率也不例外。
這樣做的代價顯而易見,勢必會導致引擎速度在絕大多數環境下都無法達到峰值(因為你的程式並沒有100%發揮OpenGL效能),也就是我們通常所見的“低效”問題產生。而僅僅如此,也還不是最糟糕的情況,真正最糟的情況是,你的引擎跑在某款對OpenGL極不友好的手機環境中(大多數Android手機為了系統的穩定性,對於OpenGL效能存在有某種程度的限制,這種限制其實比較普遍,僅僅是程度不同罷了),一名使用者氣憤的告訴你,你的爛遊戲在他手裡連10FPS都跑不到,而你卻只能眼淚汪汪的看著手中數款機器跑出了50FPS以上的佳績。jME-Android的難產,以及Rokon的夭折,除了各自遇到的困境以外,恐怕始終和Android這讓人又愛又恨的OpenGL機能割捨不開。為什麼會產生這種原因?難道是Google的設計出了問題嗎?其實,歸結產生這種問題的癥結,並不是軟體或硬體的設計問題,而在於Android那無限近似於白送的系統授權政策。Google“量化寬鬆”的Android營銷策略,固然能快速佔領市場,建立Android智慧機霸主地位;但是,卻也必然會造成分支平臺過多,付出廣大Android手機廠商容易向中低端使用者群靠攏的代價(系統授權近乎零成本,導致中等收益即可滿足高盈利需求);而中低端使用者的消費能力,又反過來限制了手機廠商的手機成本價格;在這近似於“沃洛波羅斯輪迴”的怪圈影響下,想要製作出一款即能夠100%發揮OpenGL ES效能,又可相容所有Android機型,極少甚至永不出現“BUG”的遊戲引擎,幾乎是和讓中國隊去贏得世界盃冠軍同樣困難——至少,在最近一年內是看不到的。因為位置最低的那塊木板,一定會決定位置最高那塊木板的命運,短板效應的悲劇,幾乎無可避免的成了阻礙Android遊戲引擎開發的攔路虎。

可是,如果Google幹掉這頭“攔路老虎”,也就是改變Android的授權策略,強制廠商向高階機邁進呢?此刻,假如那樣做,又極可能因為突然擡高的生產成本,引發Android陣營崩潰,讓本來欣欣向榮的Android橫死街頭——所謂“魚與熊掌不可兼得”,大概就是這種情況了。我們又有什麼辦法徹底解決這種相容性問題嗎?難道我們就只能在這種相容困局中消磨生命嗎?答案,其實是有的,而且非常簡單,那就是——等待。沒錯,在目前這種情況下,即便您有多麼的不高興,即便您對Android遊戲引擎現狀有多麼的不滿意,即便您嗲聲嗲氣地高叫:“相容什麼的最討厭了!”。也務必請您保持耐心,靜候圍繞Android這個“木桶”的“木板們”逐漸長大,以及成長中的Anroid遊戲引擎逐漸完善,雖然“各機型完美相容”的結果未必就會出現,但隨著Android軟硬體的不斷髮展,“各機型近乎完美相容”的時候,畢竟還是離我們越來越近了。我們都知道,老故事中說出“早知道第七張餅才吃飽,就不該吃那前六張餅了”的人是個傻瓜蛋,可那些說出“吃了一張餅都沒飽,後面六張餅也不必吃了”的傢伙,卻也未見得就是個聰明人。畢竟有些事情,不是急出來,扯出來,而是幹出來,闖出來的。——————————————————附帶一提,Slick這款Java遊戲引擎最近也要出Android版了,前一陣我看見作者在http://www.javagaming.org搞相容性測試,反向了一下APK發現原有模組已經基本移植完畢,正式出現應該不會等得太久。就個人意見來說,此款引擎的效能與易用性絕對遠在Rokon之上。大家有興趣可以關注他的進度,能催的話更好,小弟想參看一下他的完整程式碼(^_^):http://slick.cokeandcode.com

00