樂元素CTO凌聰訪談:游戲引擎技術選型之王道
最近,EA DICE都把Frostbite引擎開出了一個叫Frostbite go的移動版本。這不禁讓人心里有許多明悟:無引擎,不移動。不加思索一口氣可以說出許多移動游戲開發的引擎和技術,從Unity、Unreal、 Cocos2d-x、Flash,再到幾乎無所不能的HTML5。對于游戲開發者來說,技術選型的空間非常寬泛。近日,我們采訪到了樂元素的CTO凌聰先 生,為我們分享了他們在游戲開發方面的寶貴經驗。
記者:你們是如何做技術選型的,談談以前你們用的一些方案。
凌:之前我們用過很多引擎和語言,包括HTML5、Flash、Unity、Cocos2d-iPhone、Cocos2d-x這幾個都用過。我們有另外一個項目組在用Unreal。
我覺得每個方案要看當前的場合。我對當前的HTML5技術還是持保留意見。目前來說,瀏覽器的部分可能會存在一些利益分配的問題,但未來Html5的發展還是有很大空間的。
圖:樂元素 CTO 凌聰
蘋果要大力去推某個跨平臺游戲引擎,對他來說有什么好處?其實是沒好處,應用跨平臺了,用戶就流失了。蘋果只是關心,在他的平臺上,能運行什么應用。用蘋果主推的API和功能去開發應用,他才會幫你作App Store編輯推薦。
記者:您覺得選用HTML5或Native會對用戶有哪些影響?
凌:HTML5 能做得游戲還是有限的,比如你做個卡牌類游戲是可以。你做個性能要求不是很高的游戲還可以。用戶不關心你用那種技術實現,他是看你游戲效果好不好,這是最 關鍵的。你效果不好,人家不會玩。我們以前做過一些嘗試,如果你要做一些特別華麗的游戲,HTML5目前性能還是不足的。很多東西需要你調用Native 接口去渲染。
記者:Flash技術呢?現在用他做游戲還有前途嗎?
凌:***,Flash當時性能也一般, 很久以前,我們做了一款游戲,那款游戲基本上是城建類的游戲,從PC移植過來的。當時使用的是Air3.1,還是非常粗糙的一個版本。我們把所有的動畫全 閹割了,然后才可以運行。它可以播一些動畫,但在Pad上面,一個場景有50-60個動畫,它就搞不定了。那個時候性能不好,現在改善了許多,市面上也有 一些游戲也用Flash去做。
另外Flash我們不想選的原因,是因為Flash本身不是開源的。我想用個OpenGL ES,想用shader 得到更好的性能,當時在Flash上很難做。它本身還是挺死板的,你一旦用了它,就等于把命都交給它了。再加上它是收費的,從綜合因素考慮來看,他和 Cocos2d-x等2D 引擎相比了,沒有優勢。
記者:說說你們為什么用Cocos2d-x?
凌:以前 也試過Cocos2D-iPhone,我們***個項目是Cocos2D-iPhone做的,Cocos2D-iPhone挺好要用的,但是他只支持 iOS,沒有Android,我們***選型還是Cocos2d-x。我們當時真的是所有的技術都試了一次。Cocos2d-x是個很棒的游戲引擎,它的跨 平臺特性正是我們需要的,一次開發,可以部署到多個平臺之上。
***我們為什么在幾個跨平臺引擎中決定選擇用Cocos2D-X呢?我們主要 有幾個方面的考慮。首先最重要的是性能,尤其安卓上的。Cocos2d-x在低端安卓機上也運行很流暢,做同樣復雜度的游戲,比其他引擎跑起來快5~10 倍。HTML5性能不行,目前看來還無法做出我們想要的游戲。其次,可控性也是關鍵,對于閉源的商業引擎,到項目后期我們有些優化根本就無法做進去,它的 性能怎么樣我們就怎么樣,我們沒有辦法控制。于是我們就選擇了Cocos2D-X,性能好,開源的可以自己根據游戲去優化,所以這個就是我們***的選擇。
#p#
記者:你們為什么喜歡上腳本化,并且選擇了Lua語言?
凌:因為Cocos2d-x里面也支持挺多的腳本引擎,包括Lua、JavaScript還有C++。大家都知道C++有很多內存泄露、崩潰,很難解決。而且崩潰了也不會給你什么有用的Crash信息。
我們做游戲運營,當用戶的游戲Crash掉之后,我們要能拿到他的數據。為此我們自己打造了一整套Crash工具,從網上可以直接拿到Crash信息,分析用戶的堆棧。用了腳本引擎,就可以降低Crash率。
為 什么選擇了Lua,而沒有選擇JavaScript?因為JS太復雜了,很難控制它。而整個的Lua就500K代碼,你自己吃透它非常簡單,沒幾行代碼就 讀完了。同時我們也自己改了一些腳本,加了一些函數。對于JavaScript語言來說,它的狀態機太復雜了。支持匿名函數,又支持各種各樣的 Funtion,使得狀態機異常復雜,它的解析器也很復雜。我想我們會用更簡單的語言,那就是Lua。
并且Lua和C貼的是最緊湊的,我們要寫個接口非常簡單。Lua也有許多插件,用Lua在Java、OC和C之間互相調用都非常簡單。
但 是Lua也不是沒有問題,它也有多線程的額問題,線程安全這塊你要自己解決。這塊技術,Lua還是比較復雜的。但是Lua主要業務是邏輯,至于考慮到多線 程的問題,我們會有個專門的引擎組去解決,這是一隊技術***的程序員。游戲的邏輯會寫在機要線程里面,所以這方面關系不大。引擎組去做多線程的事兒,和我 們用到的Lua特性,關系不大。
對于游戲的開發人員,***不要去碰多線程的東西,多線程容易出錯。這里的技術選型,主要考慮的:一個是性 能,一個是控制力。用Lua和C的效果基本上差不多,能有80%的效率。這也要看應用的場景,如果你是密集型運算,那可能性能還要差一些,但是 LuaJIT的加速已經很快了。在iOS上性能提升5~6倍,在Android上可以達到60倍。
記者:這個Cocos2d-x和Lua定下來之后,你們都做了哪些工作?
凌: 我們自己做的東西還是挺多的,我們自己做了Lua的調試器,我們用的是一個開源的ZeroBrane,在這之上自己修改的。可以說這是全世界最快的Lua 調試器,把我們的Lua調試器性能提高了120倍。支持symbols和文件的快速定位,支持Push to device,改善了智能提示。
另外,我們做了一個資源管理器,可以做到增量更新、安全下載、安全加載、動態更新四個重要的功能。
比如在用戶的本地apk里面,某些文件比較比較舊了,需要從網上下載一個文件,系統需要有一個緩存目錄,去存放從遠端下載的內容,然后再更新到本地apk目錄里,這三個目錄的同步,就是資源管理器要做的事情。
現 在的游戲包一般都很大,100~200MB的有很多,甚至有的超過1GB了。所以說要做增量更新。我們有大小包部分,一般你先留一個小包,也看不同的市 場。比如說有些網絡好的市場,我們小包就行了。有些網絡差的市場,我們就用大包。未來游戲更新的時候,我們都可以用增量更新,不用重新下大包。
考 慮中國很多用戶用2G網絡下載不方便,所以在中國市場,肯定要用大包,有WiFi網絡的時候把整包下了就行。但是在日本市場,你完全可以用小包,十幾MB 的包,效果***。十幾MB的包一般來說,里面有基本的資源,讓你能進去,有個首頁。進去之后按場景下載,這個是按需下載。
你進某個場景的時 候,突然有個人冒出來,他騎了條龍,你邊沒有這個資源,你需要從遠端下載完了之后,他才能夠穿上去。這里面就有個問題,游戲希望這個人能出現,但是這個人 出現的時候他沒資源,怎么辦?一般的做法是這個人先裸身,先別穿什么東西,就是一個簡單的樸素裝。后臺從遠程下完之后,再把它穿上去,這就叫做動態加載。
我們是參考git的設計去做資源管理器的,今后如果可能,資源管理器其實完全可以基于git去做,這樣更方便靜態資源的部署.
記者:那么游戲每次啟動的時候,需要做哪些版本校驗呢?
凌: 首先,我們的游戲內容,會有幾個存儲的地方。一個是apk/ipa中的存儲,一個是CDN的存儲;一個存儲是存放更新文件的本地存儲。配置在服務器上有個 配置版本號。游戲啟動后,會去調這個配置服務器找版本號。看配置版本號是不是跟我們本地的配置版本號一樣。如果一樣,你就不用去更新配置。如果不一樣,就 到靜態服務器去拉他的配置。
我們每次文件都是增量更新的,不會覆蓋原來的,我們文件名都不一樣。它會取這個配置,取完這個配置再跟本地的文件系統進行一個對比。因為我們本地文件系統,為了保證他的一致性,全部是MD5校驗。
上面剛才說了,一個是apk里面的存儲,一個是Web上的存儲,一個是Cache里面的存儲。資源管理器會管理各處的存放的數據。沒有就直接去下載。
#p#
記者:現在有許多SDK,統計的SDK、廣告條的SDK、各大運營商的SDK等等。你們對SDK是如何管理的?現在我聽說Cocos2D-x引擎內部,也在集成這個,你怎么看?
凌: 觸控對Plugin-x的實現確實花費了許多功夫,要在不同開發語言之間,做一個統一的SDK體系不容易,還要提供 C++,Lua,Java,Javascript的API,有N種語言接口。從他來講肯定是C語言先支持,然后再網上搞各種語言綁定是最靠譜的。可以想象 工程量相當龐大。當然,這對于開發者來說是極大的好事,一次可以部署多個SDK。
但我們的情況比較特殊,我們現在很多的收入來自海外,我們 經常集成的Facebook SDK,它三天兩頭變一次,一個版本一次變,所以對于這種特殊情況,我們就無法用plugin-x了,只用Lua和Java自己封會簡單一些,容易應對這 種頻繁變化的情況。遇到SDK發生改動是很討厭的事情,應為SDK是JAVA的SDK,它一變,我們就不能用增量更新了,只能更新整個包。
記者:觸控最近出了一個CocoStudio,你們是否用過了?感覺怎么樣?
凌: 我覺得Cocostudio想法挺好的,我也覺得Cocostudio他能夠做完善的肯定很好。現在這個階段,我們用過還是覺得,一些功能還可以繼續完 善。當然CocoStudio也有比較好的東西,我覺得是UI編輯器,它看起來挺酷的,它支持組件直接嵌套等功能。***是后面能開放出來讓我們游戲廠家自 己靈活定制。
我 們現在有自己的UI編輯器,我們自己的UI編輯器基于Flash。因為我們很多都是Flash轉的。反正就是Flash做完原件,把Flash的東西導出 來,我們自己寫個插件把它導出來,所有的美術都是用原來的機制,包括原件的動畫,全都是這樣,很容易導出來。我們自己也做過骨骼編輯器。
我們也比較關注CocoStudio的這個骨骼編輯器的和動畫編輯器。我們現在使用的是一個叫Dragon Bones的骨骼編輯器,未來我們可能會用比較老牌的Bone。我覺得我們現在,還是愛用自己的輪子,畢竟對來說最熟悉嘛。
總結
對 于樂元素這樣有600人的大公司來說,其技術實力太強大了。他們追求***的可控性,追求***優化的工作流,這樣才能發揮出這么多員工的整體實力。筆者能感 覺到,對于這樣龐大的團隊來說,Cocos2D-x是一個非常優秀的技術方案,跨平臺與高性能兼具。但為了實現自己對技術和結果的掌控,樂元素自己做了相 當多的工作,部署了Cocos2D-x + Lua + Wax/LuaJava + Tolua++,自己用ZeroBrane改了個高性能調試器,自己做了資源管理器,自己做了Crash跟蹤系統。畢竟是大公司大團隊,在 Cocos2D-x的基礎上,還是有許多想象力和可發揮空間的。
同時,我們也能感覺到,觸控在中小開發者方面,也給予了足夠多的扶持。CocoStudio就是***的例子。UI編輯器、場景編輯器、動畫編輯器、策略編輯 器。CocoStudio工具集彌補了之前Cocos2d-X的工具缺失或者不全的局面。雖然目前市面上已經出現基于Cocos2d-X的工具,有收費也 有免費。但是像CocoStudio這種一整套的游戲開發工具集并沒有。關鍵是整套的游戲開發工具集可以讓游戲開發的流程更科學規范,開發成本更低。我們 可以看到,CocoStudio對于許多大型開發團隊,也有許多可以借鑒的地方。最重要是的是,它方便了中小開發者,快速的開發出優秀的跨平臺游戲。