我爲何要作青瓷引擎
寫了十幾年的遊戲,歷來沒有想過本身去實現一個遊戲引擎之類的。一來實現個遊戲引擎並非件容易的事;二來我不是個技術控的碼農,不想本身去創造需求;三來算有點自知之明:水平距離那些技術大神太遙遠了,用他們造的輪子就行了。前端
在2014年,青瓷開始關注HTML5遊戲領域。隨着HTML5標準的落地,整個生態發展很是的快。這期間也冒出來了諸多HTML5遊戲引擎,好比國外的Phaser、PIXI、IMPACT、three.js等,國內的Egret、Cocos2d-js等。同時,《愚公移山》做爲青瓷的試水項目,也得到了成功。年末,咱們肯定進入這個領域,面向玩家推出遊戲編輯器。android
可是首先咱們得先找一款合適的遊戲開發引擎;在我眼裏,一款好的HTML5遊戲引擎至少應該具有:程序員
- 完整工具鏈。Unity3D的一站式工具鏈整合得很是好,其餘大部分引擎的工具是很是分散的(有的甚至以「幾十個工具」來標榜),而更多的就只是純API了。一站式工具鏈確定最高效最易用,這理念應該是有共識的,只是爲何不少引擎公司沒法進行合理的整合,有點讓我難以理解(我猜測的緣由是:一開始沒有作好回頭太難了)
- 無瀏覽器插件。Flash之因此會死,容易發燙是一個緣由,但可能更重要的是其安全性。瀏覽器插件的操做權限過高了,幾乎能夠隨心所欲。說內心話,若是能把插件集成進各主流瀏覽器,我仍是會用的(畢竟能夠定製,性能擺在那),安全性對我這樣的開發者沒關心那麼多。惋惜的是,chrome和safari不見得願意讓你幹這事。
- 原生。有一些引擎是使用其餘語言(好比C\C++\ActionScript)來轉換,而且宣稱100%轉換,並不怎麼可信(在他們已知領域內可能真是100%)。一旦讓你遇到一個轉換不對的(我遇到好屢次了),大部分普通程序員不具有這樣的調試與排查能力。
- 界面與動畫。我以爲一個2D遊戲引擎最重要無非就2個功能:界面和動畫。好的UI工具可讓開發效率提高一個數量級,但不少遊戲引擎很容易忽略這一塊。有些UI編輯器編輯後與實際運行效果有誤差,有些須要寫很是多的代碼來自適應各類屏幕分辨率(甚至有些引擎官網的Demo直接留黑邊)。我指望的遊戲界面實現流程是:美術人員拼好界面後,程序員直接拿來寫業務代碼就能夠了。至於動畫,不少引擎實現得挺好,這得益於Flash這款專業動畫編輯器
- 專業。不少引擎實現得大而全,既能夠用來作遊戲,也能夠用來作企業應用,什麼均可以幹。遊戲引擎若是以此方向來作,很難作透作精,所以我更喜歡純粹的「遊戲引擎」。更有意思的是,有些遊戲引擎的主刀,居然歷來沒作過遊戲,我的懷疑是否是真的靠譜(可能作遊戲的大神都忙着寫遊戲賺錢去了吧?)!
- 開源。
- 性能。簡單的2D渲染引擎,性能大部分是半斤八兩(上插件的排除在外)。固然也有少部分引擎性能差得出奇,這些列到不合格程序員行列。
用了大半年來試用各類引擎,實在沒有找到合適我用的。被Unity3D慣壞後,咱們也不想隨便拿個來將就,怎麼破?「順便本身作個遊戲引擎吧」,請原諒我用「順便」兩個字,並不是狂妄,由於遊戲引擎並不是咱們的最終目的,產出遊戲和遊戲編輯器纔是。這階段性產品若是能讓更多開發者更快作出遊戲,同時也能豐富咱們的遊戲編輯器,就能實現雙贏(歷來就沒有活雷鋒啊,雙贏!)。總結下:chrome
- 市面沒有的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」。app
基於瀏覽器的引擎
初始個人想法是弄個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引擎的呼聲沒那麼高
對位思考
更多的把本身定位爲:遊戲開發者、引擎使用者