自《圍住神經(jīng)貓》等游戲風(fēng)靡以來(lái),越來(lái)越多的人開(kāi)始關(guān)注html5游戲的開(kāi)發(fā)和未來(lái)的發(fā)展。于是,一個(gè)新的html5游戲開(kāi)發(fā)引擎——Egret(白鷺引擎)應(yīng)運(yùn)而生。
在諸位看官進(jìn)入正文前,我先澄清一下,我的回復(fù)不會(huì)就以下幾個(gè)問(wèn)題展開(kāi)討論:
1. HTML5有沒(méi)有未來(lái);
2. 開(kāi)源好還是閉源好;
3. Web,Hybrid和Native哪家好;
4. 2D沒(méi)3D牛B。
我想單就Egret本身而言,給出我關(guān)于以下幾個(gè)問(wèn)題的想法。
■ Egret為何用TypeScript?為何不用Dart, AtScript或者其他?
TypeScript(TS)是一個(gè)嚴(yán)格意義上JavaScript超集,而且它目前的1.4版本的語(yǔ)言設(shè)計(jì)更接近于ES6,如果只是單純認(rèn)為TypeScript是微軟出的一個(gè)開(kāi)源語(yǔ)言的,請(qǐng)認(rèn)真去http://TypeScriptLang.org,深入了解一下這個(gè)開(kāi)源項(xiàng)目,了解以下微軟的首席架構(gòu)師為何會(huì)針對(duì)JavaScript做了這么個(gè)玩意。
那么為何Egret會(huì)選用TS呢?
首先,我們認(rèn)為Dart的形式針對(duì)很多會(huì)使用JS或AS3的開(kāi)發(fā)者而言(尤其是初學(xué)者這個(gè)最大的群體),學(xué)習(xí)的成本曲線較陡,而谷歌又是一個(gè)在技術(shù)上“太過(guò)”創(chuàng)新的公司,跟隨一個(gè)有可能“朝令夕改”的技術(shù)去制作一款產(chǎn)品,而且將整個(gè)Egret的工具和服務(wù)的體系都懸于它之上,實(shí)在有些讓我坐臥難寢。谷歌的AtScript的目標(biāo)又過(guò)于宏大,瞄準(zhǔn)了ES7,但是就目前的H5的技術(shù)推進(jìn)而言,下一個(gè)JS的標(biāo)準(zhǔn)是看齊ES6。我們想做一款創(chuàng)新好用的產(chǎn)品,但是首先我考慮的是先要?jiǎng)?chuàng)作一個(gè)能用的產(chǎn)品。回到TS,它目前版本是1.4,即將在2015出現(xiàn)2.0,語(yǔ)言的結(jié)構(gòu)設(shè)計(jì)無(wú)限趨近與ES6的標(biāo)準(zhǔn),有了module,有了Proxy,還會(huì)有很多更類似于ActionScript3.0的語(yǔ)法。微軟還提供了一個(gè)TS的編譯器,可以在編譯時(shí)為開(kāi)發(fā)者提供很多幫助,而且我相信以微軟的實(shí)力,做個(gè)編譯器的水平還是很高的。目前的JavaScript恰恰有很多設(shè)計(jì)層面和開(kāi)發(fā)層面的缺陷,TS都能或多或少的彌補(bǔ)這些問(wèn)題。選用TS這個(gè)開(kāi)源項(xiàng)目,能再現(xiàn)階段很好的幫助JS開(kāi)發(fā)者創(chuàng)作更有規(guī)模,更成熟,更有質(zhì)量的游戲項(xiàng)目。
其次,我們可以用TS基于Canvas來(lái)封裝跟Flash ActionScript3.0的API結(jié)構(gòu)設(shè)計(jì),而且,我們僅僅封裝對(duì)于游戲有幫助的部分。我在Adobe的10多年,全部鋪在了Flash產(chǎn)品和技術(shù)上,F(xiàn)lash是個(gè)龐然大物,當(dāng)初Flash團(tuán)隊(duì)之所以放棄AS3到AS4,AVM2到AVM3的項(xiàng)目,很大程度上是Core的部分太復(fù)雜了,經(jīng)歷了幾代架構(gòu)師和開(kāi)發(fā)的調(diào)整,升級(jí)重構(gòu)的成本已經(jīng)無(wú)法估量,簡(jiǎn)單來(lái)說(shuō),就是當(dāng)時(shí)沒(méi)人改的了,所以,我們也不可能投入研發(fā)去自己做一個(gè)complier或者virtual machine去讓AS3交叉編譯為JS,君不見(jiàn)Adobe曾經(jīng)宣布的AS3到JS的Falcon交叉編譯項(xiàng)目,3年了都沒(méi)動(dòng)靜,最后隨同F(xiàn)lex一起捐給了Apache基金會(huì)么。Egret的API設(shè)計(jì)只是借鑒模仿了Flash AS3里跟游戲有關(guān)的API部分,做了減法,因?yàn)镋gret Engine的定位不是想讓開(kāi)發(fā)者拿去既可以做廣告,又可以做minisite,又可以做Video,又可以做游戲。我們只想在core上保持精簡(jiǎn),如果開(kāi)發(fā)者對(duì)不同的游戲類型有需求,比如狀態(tài)機(jī),物理,粒子等等,都做到了core之外的game library里。我2014年初離開(kāi)Adobe時(shí)候,中國(guó)還有接近30萬(wàn)的Flash開(kāi)發(fā)者,其中90%是游戲相關(guān),這是一個(gè)寶貴的開(kāi)發(fā)者社區(qū)群體,他們對(duì)于Web頁(yè)游的開(kāi)發(fā)和理解遠(yuǎn)遠(yuǎn)超過(guò)了任何使用其他web前端技術(shù)做網(wǎng)頁(yè)游戲的群體。Egret使用TS,一方面是為了讓JS游戲開(kāi)發(fā)人員更舒服些,另一方面是考慮到Flash AS3這個(gè)開(kāi)發(fā)群體,不爭(zhēng)取的話,慢慢都流失掉了,很可惜。下圖是我們Egret Engine在API設(shè)計(jì)上與Flash AS3 API上的對(duì)比。
第三,我們使用TS,還有一個(gè)想法。將來(lái)的JS也是遲早會(huì)跟ES6看齊的,等將來(lái)所有瀏覽器都統(tǒng)一支持下一代JS的時(shí)候,現(xiàn)在使用Egret的開(kāi)發(fā)者都已經(jīng)熟悉了ES6那套做法,而Egret幾乎可以0成本的直接將TS換為下一代JS的代碼,平滑過(guò)渡所有開(kāi)發(fā)者,比JS現(xiàn)有體系過(guò)渡到下一代的體系成本都低,更順滑,何樂(lè)而不為?
■ 為什么我們2014年一口氣做了一堆工具,而沒(méi)有一上來(lái)就做個(gè)集成的開(kāi)發(fā)環(huán)境呢?
我在這里要回答的有2點(diǎn)。在技術(shù)和產(chǎn)品的進(jìn)化上,第一條真理是:天下武功,唯快不破。第二條是,長(zhǎng)鞭理論無(wú)處不在。第三條是:工作流是工作效率提升的根本。以上三條重要性依次降低,當(dāng)一個(gè)CTO和CIO做了產(chǎn)品形態(tài)和研發(fā)的決策時(shí),請(qǐng)倒推。好了,不講大道理,說(shuō)一說(shuō)Egret的做法,Egret里我?guī)У倪@幫人以前是做Flash Pro,F(xiàn)lash Builder,F(xiàn)lex GUI和眾多工具及框架的技術(shù),很有經(jīng)驗(yàn)。但是經(jīng)驗(yàn)不能完全當(dāng)做生產(chǎn)力,經(jīng)驗(yàn)不能當(dāng)飯吃。經(jīng)驗(yàn)告訴我們的是,要想在市場(chǎng)立足,在最短時(shí)間內(nèi)做出來(lái)的產(chǎn)品的“核”也就是中心思想很重要,它不必拘泥于是否先要有個(gè)IDE來(lái)承載這種形態(tài),市場(chǎng)需要的是最有效率的工作流,其次才是一招打遍天下的IDE集成開(kāi)發(fā)環(huán)境,工作流的形態(tài)可以先出現(xiàn)在最初的若干款產(chǎn)品里,他們之間獨(dú)立,小巧且專注,之間的數(shù)據(jù)通用且可以協(xié)作,對(duì)于研發(fā)而言,成本和風(fēng)險(xiǎn)均可控制。而IDE,功能強(qiáng)大且齊全,開(kāi)發(fā)者需要的功能都具備,但是研發(fā)成本高,風(fēng)險(xiǎn)大,周期長(zhǎng)。按照Egret Engine的雙周迭代速度,團(tuán)隊(duì)潛心于一上來(lái)就要打造一個(gè)IDE的節(jié)奏是不對(duì)的。就好像你希望快走,但是又總有一條腿邁不出去的情況一樣,這個(gè)節(jié)奏的結(jié)果就是容易扯著蛋。但是2015年,我們也會(huì)做出一個(gè)第一版的IDE,叫Egret Builder.
■ 說(shuō)了引擎和工具,Egret你們想怎么商業(yè)化呢?
商業(yè)化的問(wèn)題其實(shí)在這里我不想說(shuō)太多,我只想說(shuō),我們除了引擎,工具,我還讓團(tuán)隊(duì)做了個(gè)運(yùn)行時(shí)。也就是將來(lái)Egret的技術(shù)體系就是三位一體,Engine,Tools,Runtime。關(guān)于Runtime的細(xì)節(jié),我也不想多談,大家可以去http://egret-labs.org看看Egret Runtime的產(chǎn)品介紹頁(yè),就明白我們?yōu)樯兑槍?duì)H5做個(gè)Runtime。很多明眼人一看就會(huì)說(shuō),這不就是個(gè)Flash Player么?!答案是Yes,也是No。
Yes的部分是我們的團(tuán)隊(duì)原來(lái)都是做Flash的,受Flash影響頗深。Flash Player里具備很多優(yōu)秀的Web游戲設(shè)計(jì)思想都是很贊的,我們就想我們可以用C/C++和OpenGL圍繞著這些設(shè)計(jì)思想,再做一個(gè)取代webview的游戲加速器,讓開(kāi)發(fā)者基于Egret引擎開(kāi)發(fā)的H5游戲,可以直接通過(guò)這個(gè)Runtime加速。No的部分是Flash Player是to C的,要讓用戶去裝,而Egret Runtime是to B的,集成到平臺(tái)app里,作為一個(gè)庫(kù),當(dāng)用戶在平臺(tái)里玩游戲時(shí)候激活,玩家是不知道Egret Runtime存在的,我們也不打算對(duì)玩家去刷什么存在感。Egret Runtime是為了解決H5游戲性能,適配,系統(tǒng)底層調(diào)用和碎片化的問(wèn)題而生的一個(gè)產(chǎn)品。在Egret Runtime上,我們跟各大平臺(tái)的合作關(guān)系也很融洽,為什么?因?yàn)槲覀兙褪撬麄兤脚_(tái)內(nèi)部的一個(gè)組件,生命周期受平臺(tái)app的控管,你激活我,我就干活,你移除了我,我就進(jìn)入sleep模式,絲毫不影響人家平臺(tái)業(yè)務(wù),還能提高H5游戲的用戶體驗(yàn),也不騷擾用戶,何樂(lè)而不為?尤其在Android上,一個(gè)activity級(jí)別的控件是讓平臺(tái)恐懼的,而一個(gè)view模式下的控件,平臺(tái)是喜歡的。下圖是Egret Runtime的HighLevel架構(gòu)圖:
■ Egret現(xiàn)在就是個(gè)2D的,木有競(jìng)爭(zhēng)力?。?/strong>
近一年內(nèi),Egret Engine的確是2D的,但是大伙不都是以進(jìn)步的眼光看待事物么?Egret也一樣,秉著天下武功,唯快不破的思路,我們規(guī)劃了一下2015年的Egret Next,我們也在預(yù)研3D的部分,code name是HummingBird(請(qǐng)?jiān)徫覀儓F(tuán)隊(duì)就是喜歡鳥(niǎo)),更細(xì)節(jié)一點(diǎn)的計(jì)劃圖在這里:
當(dāng)然,我們現(xiàn)在已經(jīng)開(kāi)始做了一些了,不然我也不敢說(shuō)出來(lái)找虐。
■ 說(shuō)了半天,你們的套路到底是啥?
來(lái)看這張圖,我們想為H5或者叫做使用H5(JS/TS)技術(shù)的web游戲開(kāi)發(fā)者打造這么一套環(huán)境:
所以,說(shuō)H5移動(dòng)游戲也好,說(shuō)Web移動(dòng)游戲也好,說(shuō)用腳本開(kāi)發(fā)native也好,工作流齊全了,這些還算是問(wèn)題么?
我自己作為Egret的技術(shù)管理人,在我10多年的職業(yè)生涯里,信奉這么幾句話:
1. 永遠(yuǎn)不要基于現(xiàn)在去假設(shè)未來(lái);
2. 永遠(yuǎn)不要嘗試用一個(gè)成功打敗另一個(gè)成功;
3. 預(yù)測(cè)未來(lái)的最好方式就是創(chuàng)造未來(lái);
4. 就是干!