我為什么要做青瓷引擎
寫了十幾年的游戲,從來沒有想過自己去實現一個游戲引擎之類的。一來實現個游戲引擎並不是件容易的事;二來我不是個技術控的碼農,不想自己去創造需求;三來算有點自知之明:水平距離那些技術大神太遙遠了,用他們造的輪子就好了。
在2014年,青瓷開始關注HTML5游戲領域。隨着HTML5標准的落地,整個生態發展非常的快。這期間也冒出來了諸多HTML5游戲引擎,比如國外的Phaser、PIXI、IMPACT、three.js等,國內的Egret、Cocos2d-js等。同時,《愚公移山》作為青瓷的試水項目,也獲得了成功。年底,我們確定進入這個領域,面向玩家推出游戲編輯器。
但是首先我們得先找一款合適的游戲開發引擎;在我眼里,一款好的HTML5游戲引擎至少應該具備:
- 完整工具鏈。Unity3D的一站式工具鏈整合得非常好,其他大部分引擎的工具是非常分散的(有的甚至以“幾十個工具”來標榜),而更多的就只是純API了。一站式工具鏈肯定最高效最易用,這理念應該是有共識的,只是為什么很多引擎公司無法進行合理的整合,有點讓我難以理解(我猜想的原因是:一開始沒有做好回頭太難了)
- 無瀏覽器插件。Flash之所以會死,容易發燙是一個原因,但可能更重要的是其安全性。瀏覽器插件的操作權限太高了,幾乎可以為所欲為。說心里話,如果能把插件集成進各主流瀏覽器,我還是會用的(畢竟可以定制,性能擺在那),安全性對我這樣的開發者沒關心那么多。可惜的是,chrome和safari不見得願意讓你干這事。
- 原生。有一些引擎是使用其他語言(比如C\C++\ActionScript)來轉換,並且宣稱100%轉換,並不怎么可信(在他們已知領域內可能真是100%)。一旦讓你遇到一個轉換不對的(我遇到好多次了),大部分普通程序員不具備這樣的調試與排查能力。
- 界面與動畫。我覺得一個2D游戲引擎最重要無非就2個功能:界面和動畫。好的UI工具可以讓開發效率提升一個數量級,但很多游戲引擎很容易忽略這一塊。有些UI編輯器編輯后與實際運行效果有偏差,有些需要寫非常多的代碼來自適應各種屏幕分辨率(甚至有些引擎官網的Demo直接留黑邊)。我期望的游戲界面實現流程是:美術人員拼好界面后,程序員直接拿來寫業務代碼就可以了。至於動畫,很多引擎實現得挺好,這得益於Flash這款專業動畫編輯器
- 專業。很多引擎實現得大而全,既可以用來做游戲,也可以用來做企業應用,什么都可以干。游戲引擎如果以此方向來做,很難做透做精,因此我更喜歡純粹的“游戲引擎”。更有意思的是,有些游戲引擎的主刀,竟然從來沒做過游戲,個人懷疑是不是真的靠譜(可能做游戲的大神都忙着寫游戲賺錢去了吧?)!
- 開源。
- 性能。簡單的2D渲染引擎,性能大部分是半斤八兩(上插件的排除在外)。當然也有少部分引擎性能差得出奇,這些列到不合格程序員行列。
用了大半年來試用各種引擎,實在沒有找到合適我用的。被Unity3D慣壞后,我們也不想隨便拿個來將就,怎么破?“順便自己做個游戲引擎吧”,請原諒我用“順便”兩個字,並非狂妄,因為游戲引擎並非我們的最終目的,產出游戲和游戲編輯器才是。這階段性產品如果能讓更多開發者更快做出游戲,同時也能豐富我們的游戲編輯器,就能實現共贏(從來就沒有活雷鋒啊,共贏!)。總結下:
- 市面沒有的H5游戲引擎,開發效率無法滿足我們的要求,這是最大主因
- 什么樣的游戲引擎最適合開發者,我們更清楚:因為我們就是使用者
- 我們自己開發游戲實現快速迭代,引擎開發周期在可接受范圍內
- 還有:游戲引擎,也可以實現盈利的
我理想中的引擎
有沒有誰都喜歡的游戲引擎?答案應該是沒有,包括其他任何軟件。我們做出來的引擎應該有他獨特的氣質與特定用戶群體,根據我們自己團隊以及部分圈內兄弟公司的調研,圈定引擎的方向(或者說特點):
- 漂亮的文檔。 這里的漂亮有多層意思,並不是說外表包裝得多漂亮。在重要程度,我選擇把文檔擺在第一位。
- 完整。所有常用的API,所有功能的用戶手冊,所有功能點的demo范例,當然還應該包含各類型的完整游戲示例
- 可讀。良好的文檔結構(由淺入深的)、化繁為簡的描述、多給范例、多錄視頻
- 持續更新。文檔的錯誤描述、與引擎不一致、遺漏等,都應該升級為BUG來處理(一個錯誤的文檔描述,可能帶來災難性后果,有被坑過的舉爪)
- 集成工具鏈。 曾經我用某引擎寫個DEMO,總共用了7個不同的工具,在不同工具進程之間切換嚴重影響了我的開發效率和心情。這個問題我一定一定一定不能再污染給其他開發者了
- 所見即所得。 這東西是被Unity3D慣出來的。以前開發排查問題,大部分就是Log、斷點調試,自從Unity3D橫空出世后,我暫停下查看現場就可以把無數BUG給直接修復了!所見即所得帶來的直接好處就是:BUG現場排查快一個數量級。
- 環境一致。 開發中所看到的,就應該是發布后的結果,兩個環境應該是一致的。很多引擎開發環境是一套,發布導出后又是另外一套,經常出現效果對不上的情形;一些平台難以避免,但在HTML5上理論上可以做到這一點才對。
- 游戲數據可見。便於BUG排查,便於實時修改數據,便於調效果表現等等
- 讓策划、美術參與進來。 游戲引擎,不能定義為程序員的引擎,應該定義為:游戲制作工作流。他不應該是一堆傻傻的API和一堆生硬的工具。游戲程序員的真正工作,我覺得應該是折騰出工具讓策划和美術配置出游戲,而不是無盡的迭代與溝通(或者說是扯皮)。引擎需要考慮到這點並努力去解決。
- 強大的UI系統。 可視化UI編輯器(美術人員一定要能直接使用)、自適應各種分辨率。以前端游(比如CGUI等)很多都要硬編碼,更別提VC6時代了;最近公司在使用一款國內很流行的2D引擎研發一款游戲,這款引擎雖然有個簡陋的UI編輯器,但需要非常多的硬編碼來搞定界面自適應。相同一個界面使用UGUI(新版Unity3D界面系統)來制作,效率提升近4倍,而且還沒算上后續的界面迭代。可見一個強大的UI系統,可以節省多少的人力物力啊!
- 易用高效的動畫系統。 Flash是2D動畫系統的標桿了,努力靠近他肯定沒錯
- 門檻足夠低。 首先在語言層面,盡量只用一種語言就好(前后端盡量一致);API應該少而精;接地氣,常用功能直接給插件;更進一步:提供數百個成型游戲開發模板,配上文檔。
渲染核心
渲染引擎是自己寫還是使用開源的?基於程序員的創造沖動,團隊不少成員自告奮勇希望自己來搞定,更可控。但我覺得意義不大,理由是:
- 2D渲染並不太復雜,技術門檻不高
- 一些開源渲染引擎已經足夠好,沒有致命缺陷
- 國外的一些引擎大牛,可不是吃素的;我們的水平不見得能超越他們,甚至遠遠不如他們
最終我們選擇了Phaser、PIXI作為我們的底層渲染,並根據需求做一些定制和優化,這樣一來,引擎開發成本被大大降低。
原型選擇
我們的能力不足以全新造個不一樣的輪子,並且還能比現有的更好用。有自知之明的做法,或者說更保險的做法是拿個標桿來模仿,再做點定制化功能。目前成熟的手游引擎主要有3個,Unreal、Cocos2d、Unity3D,這3個引擎我們都有使用過,因為對他們的優缺點就很好比較了:
- Unreal是個高大上的東西,或者說是不怎么接地氣。使用的成本相對偏高,工具鏈也相對復雜,剔除在外。
- Cocos2d-x是個最接地氣的引擎,特別是針對國內做的幾個優化:引入Lua和渠道一站接入等。在當前環境中,能使用Lua支持熱更新是個極大的誘惑力,應該說也是最大的優點。缺點也很明顯,工具鏈只能說可用,但算不上好用;工具鏈整合能力比較差;UI系統沒做好;引擎版本兼容性問題比較多;API設計得有點丑陋(這純粹是我個人喜好了);文檔比較混亂,沒建設好。
- Unity3D目前是全世界范圍內最火的手游引擎了。早期Unity3D專注於3D市場,連基本的UI系統都沒提供。后續出了大名鼎鼎的NGUI插件,再到當前官方的UGUI,Unity3D介入2D游戲。毫不客氣的說,UGUI是我用過的最好用的游戲UI系統,沒有之一。Unity3D的集成開發環境整合得非常好,編輯器定制簡單且功能強大,其可視化開發完全釋放了美術和策划的生產力;可視動畫編輯器、關鍵幀調度等,非常方便實現界面效果。Unity3D絕對是敏捷開發的首選。當然,他也不完美,否則不就一統天下了。首先Unity3D是閉源的,一旦出現程序崩潰等問題難以自行排查;其次是無法支持熱更新,這在國內市場比較致命(Appstore的提審周期可以搞死無數游戲不是);Unity3D打包出來的游戲包會比較臃腫;Unity3D面向組件式編程雖然非常靈活與強大,但一定程度上提高了入門門檻。
很明顯,Unity3D的致命缺點在我們這邊可以被完美解決:我們的引擎開源、JavaScript支持熱更新,因此Unity3D成為青瓷引擎的原型。因為青瓷引擎是個2D引擎,所以需要做一些“瘦身”,並且也需要融合一些其他引擎的優點(比如骨骼動畫支持、Excel支持等)。總之,青瓷引擎會像是個“HTML5版的Unity3D”。
基於瀏覽器的引擎
初始我的想法是弄個V8引擎,做一些定制做成Native版本的引擎編輯器。但我們團隊中有個十幾年HTML5經驗的同學,Hightopo是他的傑作。他的建議是放到瀏覽器不就完了?然后我們做了一些考量:
- 性能足夠。在瀏覽器渲染類Unity3D的引擎界面,效果是很流暢的。當然,在發熱量上肯定會高於Native,但可以容忍;
- 基礎組件有積累。在Hightopo項目上已經有了比較多的沉淀與積累,可以拿來改造使用,不需要從零開始;
- 后續的游戲編輯器,需要有這方面的技術積累;
- 開發環境與發布環境可以保持一致,真正所見即所得;
- 完美利用瀏覽器自身的開發工具,比如chrome。那才是最強大的;
- 后續可能可以做雲編輯,可以在平板上做部分開發工作,可以無縫的跨所有平台
- 還順便可以裝裝逼,炫炫技術:我們能用HTML5技術完整構建整個引擎工具鏈
青瓷引擎應該是第一個敢於這么干的游戲引擎了。
談談runtime
做不做runtime在項目初期有過糾結,作為過渡瀏覽器插件帶來的好處非常明顯,他能很大部分解決android的一些問題:
- android下各瀏覽器兼容性不是很好,特別是聲音與WebGL;
- 很多瀏覽器性能差,特別是國內的一些瀏覽器
如前面所說,壞處也很明顯,否則Flash就不會死翹翹了。基於我們自己的考量與市場判斷,我們的初衷是做HTML5游戲而不是照搬PC的頁游模式,市場的規模不能只局限於國內少數平台而應該放眼全球,瀏覽器的發展需要時間但不會太久。最終我們決定將全部精力投入到原生支持的開發中,先全力做好HTML5市場。至於做不做加速器,等有app打包工具需求時再來考量也不遲。
產品驅動力
引擎開發的驅動力來源於兩點:
- 自我游戲產品的研發需求
- 廣大HTML5游戲開發者的實際需求
我們的引擎不是用來講故事,做給投資者看,搞這些不是我們這群技術宅的長項;在我眼里,大部分開發者聰明、簡單,對開發者吹牛忽悠只會招來反效果;開發者的要求其實很簡單:能實實在在的幫我解決一些問題,別忽悠我少讓我走彎路。在引擎的研發中,我會盡量把自己放在開發者的角度來思考問題。
秉承的做事態度
快速解決問題
每個項目都會有BUG,持續的開發並持續產出BUG,持續解決BUG並引入新的BUG……
對於版本的快速迭代非常重要,沒有必要官僚的固定時間一個版本。在我看來,一天兩個、三個版本都是可行的:一個新版本可能只修復1個BUG。
大部分引擎,都要等上很長時間才能解決開發者當前遇到的問題;在我看來,想方設法繞過問題或者等待別人解決問題,是件非常非常惡心的事情,我希望能改變這種狀況。
技術支持:耐心、快速
“技術支持非常重要”,這個不少引擎公司不停的掛在口頭上,但也就僅僅掛在口頭上而已。技術支持要實際落地需要投入巨大的人力、物力,很多公司會覺得投入性價比太低。
在青瓷,有很好的基因來做這塊。我們的游戲制作人和其他團隊成員都會耗費大量的時間和玩家交流、溝通並回答問題,上到CEO下到普通的基層員工,無一例外。在引擎支持中,我們的要求是:
- 所有引擎研發人員,都是客服,都需要解決開發者問題
- 所有技術支撐工程師,都必須同時做游戲開發工作
- 有耐心。我們一定會遇到很多水平參差不齊的開發者,會遇到無數“重復的”、“隨口一問的”、“沒有提問技巧的”問題;我沒有任何信心去改變這種現狀,那么只能加幾個數量級的耐心去解決問題
- 快速。提個問題,幾個星期甚至幾個月后再來回答,黃花菜早就涼了
開發者不是小白
誠然,引擎需要大量開發者的使用才會逐步穩定下來,這過程會躺到不少的坑。但絕對不能以此為借口,讓無數開發者為我們的疏漏買單:我們有責任將坑降到最低,有責任自己帶頭先躺一遍。
“自己拉的屎自己先吃吃看”。因此,每個引擎開發者、每個客服團隊成員都需要做游戲並保證上線;內部有N個其他團隊使用引擎開發產品。
誠實
咱不來虛的,吹牛皮的事少干。
出錯了就認,趕緊改正,粉飾太平的事少干。
別怕得罪人,有問題直接點指出來,當老好人的事少干。
做精、做透
不要追求大而全,找個點投入全部精力去做好。近來不少公司去做3D引擎,“青瓷會不會做3D引擎?”,近期肯定不會:
- 2D引擎都做不好,做神馬3D的啊。我看過幾個發布會,一些3D效果做得不是一般的渣,可還拿出來大吹特吹,至少在我看來是不認同的。如果把這些精力拿來先全力做好2D不是更好?
- 不具備炫技術的能力。3D引擎門檻是比較高的,我們團隊短期還干不了,畢竟這方面的積累不多。做個渣引擎丟人現眼,我可不干這蠢事(以目前團隊配置來看,估計弄3D的HTML5引擎9成以上就是渣了)
- 2D引擎做好了,市場就足夠大了,並且更能貼合中小開發者
- 在HTML5領域,2D渲染性能目前問題還比較多,更別提3D了;短期內3D引擎的呼聲沒那么高
對位思考
更多的把自己定位為:游戲開發者、引擎使用者