游戲引擎不僅是代碼,更多的是完善的工具
從洗腦開(kāi)始
記得若干年前,在做公司引擎研發(fā)的時(shí)候,時(shí)常會(huì)念到的一句話:引擎不僅是代碼,更多的是完善的工具。當(dāng)時(shí)只是用這句話還激勵(lì)自己,找準(zhǔn)引擎開(kāi)發(fā)的原則和位置。 而實(shí)際上,對(duì)這句話的理解甚少。時(shí)隔多年,這句話油然在耳,伴隨我左右。
親身體會(huì)
后來(lái),引擎項(xiàng)目砍掉了,進(jìn)入了頁(yè)游產(chǎn)品的開(kāi)發(fā)。 在這個(gè)產(chǎn)品開(kāi)發(fā)的第一周,我們就面臨著動(dòng)畫(huà)和場(chǎng)景編輯問(wèn)題,在腦海中第一時(shí)間浮現(xiàn)出的,依然是這句話。于是,我們花了兩個(gè)星期來(lái)做了一個(gè)簡(jiǎn)單的動(dòng)畫(huà)編輯器 和場(chǎng)景編輯器。動(dòng)畫(huà)編輯器只有簡(jiǎn)單的圖片導(dǎo)入,和錨點(diǎn)設(shè)置功能(因?yàn)楣治锎笮〔灰粯樱? 而場(chǎng)景編輯器,則只有圖片導(dǎo)入,怪物擺放功能……。但正是這兩個(gè)簡(jiǎn)陋的編輯器,使我們的項(xiàng)目能夠讓策劃在沒(méi)有程序的幫助下快速進(jìn)行關(guān)卡相關(guān)的內(nèi)容設(shè)計(jì)。 這也是第一次,讓我感受到,工具能夠給項(xiàng)目帶來(lái)的意義,絕非那兩句話可以概括的。
擴(kuò)展與定制
換了一家公司,是做和帝國(guó)時(shí)代差不多的開(kāi)發(fā)。這家公司的理念和我是一致的,就是先要開(kāi)發(fā)編輯器,然后再做游戲。 這家公司開(kāi)發(fā)了sprite editor,ai editor,level editor 一切的愿望都是美好的, 而唯一讓我覺(jué)得神奇的,是ai editor和level editor,消耗了大量的時(shí)間。同時(shí),內(nèi)置的許多東西,使得每一次需求變更,都要程序維護(hù)相應(yīng)的editor版本才能達(dá)到對(duì)應(yīng)的功能支持。 現(xiàn)來(lái)回想起來(lái),如果當(dāng)初使用配置文件來(lái)做一些和需求相關(guān)的東西,豈不是更好
上層開(kāi)發(fā)語(yǔ)言
我曾經(jīng)一度認(rèn)為,這輩子就靠C++吃飯了。C++這么好的語(yǔ)言,圖形和引擎底層都是用C++寫的,上層邏輯自然應(yīng)該用C++寫。 并且腳本語(yǔ)言的效率,完全是C++沒(méi)法比的。
這只是當(dāng)時(shí)的想法,據(jù)我所知,成都的逸海情天,在很早的時(shí)候,就已經(jīng)使用 C++底層+JAVA邏輯的開(kāi)發(fā)模式了。 曾經(jīng)我還笑過(guò)這種方案,覺(jué)得是一堆不會(huì)C++的奇葩貨弄出來(lái)的玩意兒。當(dāng)我接觸到UNITY3D后,我才發(fā)現(xiàn),C++ + JAVA的模式,是多么的高大上啊。 C++高效率的特性用在底層無(wú)疑是不二之選,但好東西都是一把雙刃劍,C++邏輯開(kāi)發(fā)中遇上的各種問(wèn)題,不是一己之力能夠杜絕的。
現(xiàn)在在手機(jī)平臺(tái)上,將腳本作為上層開(kāi)發(fā)語(yǔ)言就更是比比皆是了。 原因就是那讓人神往的IOS。為了游戲能夠在游戲中進(jìn)行更新,不得不采用腳本作為邏輯開(kāi)發(fā)。這也使得引擎使用C++底層+腳本邏輯走上了正軌。 而實(shí)際上,早期的許多公司或者引擎也是這樣做的。比如torque,unreal等
發(fā)布與布署
在端游的時(shí)代,發(fā)布和布署可能并沒(méi)有受到在大的重視,只要編譯好,放到適合的位置就可以了。
而隨著頁(yè)游聯(lián)運(yùn)的興起,發(fā)布和布署的成本就隨之提升了,因?yàn)闀?huì)針對(duì)不同的運(yùn)營(yíng)商做一些功能定制,若為每個(gè)運(yùn)營(yíng)商開(kāi)發(fā)一分支,維護(hù)起來(lái)成本就更高了。因此我 們選擇在同分支下做處理,而將運(yùn)營(yíng)商相關(guān)的東西做一些標(biāo)志,根據(jù)不同運(yùn)行商進(jìn)行加載。 這都還不是終點(diǎn),在一定程度上,我們可以解決問(wèn)題。
隨著手游的興起,先不說(shuō)雜七雜八的國(guó)內(nèi)ANDROID平臺(tái),首先面對(duì)IOS和ANDROID系統(tǒng),我們的引擎就需要針對(duì)性地做一些優(yōu)化處理。拿圖片處理為 例,在IOS上,通常使用PVRTC 4bp格式,而在ANDROID上,則使用ETC。 如果兩個(gè)版本做不同分支,就更不科學(xué)了。因此,我們需要做一些腳本化的東西,使我們的資源可以在發(fā)布前,打包或者轉(zhuǎn)化為目標(biāo)平臺(tái)可識(shí)別的資源。 因此,在這個(gè)地方,SHELL工具,又變得不可缺少了,而不僅僅是給策劃和美術(shù)使用的編輯器
Shell與python
很多時(shí)候,我們使用shell就可以搞定許多問(wèn)題,但是,python作為一個(gè)強(qiáng)大的腳本語(yǔ)言,它提供的各種工具庫(kù)不是shell能比擬的,比如文件搜 索,MD5生成,圖片處理等等。 更讓shell不能比的是,python是跨平臺(tái)的,這就讓我們?cè)贛AC,LINUX和WINDOWS上,可以復(fù)用我們寫好的工具。 而shell則只需要做一些簡(jiǎn)單的平臺(tái)權(quán)限相關(guān)的操作。 如果使用python能夠搞定的,我們盡量使用它。 因?yàn)槭謾C(jī)游戲的開(kāi)發(fā),很多時(shí)候MAC與windows都有需求。
Unity3D
雖然從來(lái)沒(méi)有使用過(guò)這貨開(kāi)發(fā)項(xiàng)目,但自從2011引擎項(xiàng)目砍掉后,我就一直關(guān)注它,研究它。一開(kāi)始,我對(duì)它的做法是很不接受的,覺(jué)得將一個(gè)引擎與工具綁定得如此 緊密,導(dǎo)致我在調(diào)試程序的時(shí)候,還要啟動(dòng)UNITY3D的IDE,是一件很不爽的事情。 很有早期使用FLASH CS來(lái)開(kāi)發(fā)FLASH游戲的感覺(jué)。 一直期待UNITY3D能夠像FLASH BUILDER一樣,出一個(gè)純代碼的開(kāi)發(fā)環(huán)境。 但后來(lái)發(fā)現(xiàn),UNITY3D之所以強(qiáng)大,正是因?yàn)樗木庉嬈?,而不是他那高端的組件化設(shè)計(jì)。 一個(gè)純組件化設(shè)計(jì)的引擎,如果沒(méi)有一個(gè)好的工具配合,是很難發(fā)揮效果的,甚至?xí)鄬懺S多代碼。而組件式這種巧妙的設(shè)計(jì),居然能夠?qū)⒕庉嬈髋c項(xiàng)目需求解耦。 也讓我刷新了引擎架構(gòu)方面的認(rèn)知-----引擎除了工具和渲染,良好的上層結(jié)構(gòu)依然重要。
Mono平臺(tái)的引入,雖然使UNITY3D發(fā)出的包略大,同時(shí)在CPU較低的機(jī)型上很吃力以外,沒(méi)有任何不好的地方。許多人吐槽這東西,但我覺(jué)得,大家應(yīng)該承認(rèn)時(shí)代的變遷。
Unity3d的2D支持引入雖然過(guò)晚,但充分說(shuō)明Unity3d對(duì)2D方面的勢(shì)頭,雖然重型的MONO平臺(tái)使得即使是2D游戲,也帶來(lái)一定的開(kāi)銷,但我覺(jué)得,在保證產(chǎn)品穩(wěn)定,快速迭代等前提下,少兼容一定量的低端設(shè)備,也是允許的。
Cocos2d-x
要說(shuō)影響中國(guó)游戲開(kāi)發(fā)界的開(kāi)源引擎,除了早期名噪一時(shí)的OGRE,如今就只有它了。 許多人說(shuō)它的架構(gòu)很2,許多人說(shuō)他其實(shí)就是一個(gè)山寨貨, 許多人說(shuō)他自己花點(diǎn)時(shí)間就能寫出來(lái)。 這些人的對(duì)與錯(cuò)我們不討論了,我們來(lái)看市場(chǎng)占有率。 或許這樣你會(huì)說(shuō)很俗。 但一個(gè)東西存在即是合理的。 一個(gè)引擎,能夠滿足你的項(xiàng)目開(kāi)發(fā)需求,同時(shí)為你省下大把時(shí)間,你有多少理由不使用它? 而非要自己去DIY一個(gè)蹩腳的引擎, 你覺(jué)得你寫出來(lái)的東西,坑就一定比別人少嗎?
3.x版本的cocos2d-x已經(jīng)與往日不同了,我很高興能夠看到cocos2d-x在代碼結(jié)構(gòu)方面的革新。(不僅僅是去掉了CC前綴)
cocostudio雖然還是一個(gè)半殘品,但不得不說(shuō),觸控官方出力開(kāi)發(fā)一個(gè)商業(yè)級(jí)的編輯器,這在開(kāi)源項(xiàng)目中還是很少見(jiàn)的。大家應(yīng)該給它時(shí)間成長(zhǎng)。 而在成長(zhǎng)期間,還是用最適合的方案來(lái)構(gòu)建自己的項(xiàng)目吧。試想,在cocostudio出現(xiàn)之前,也有無(wú)數(shù)的成功案例。
Irrlicht
這是我曾經(jīng)最喜歡的引擎,它伴隨著我渡過(guò)了大學(xué)生活,我在寢室里,時(shí)常閱讀它的代碼和注釋,雖然沒(méi)有特別的收獲(因?yàn)橥耆床幻靼祝?,卻使我保持了對(duì)引擎的熱情。
Nicko為這個(gè)引擎開(kāi)發(fā)了一個(gè)irrEdit,但隨時(shí)時(shí)間的推移,這個(gè)東西已經(jīng)不更新了,因?yàn)閚icko發(fā)現(xiàn),irrlicht沒(méi)啥意 思,irrEdit和irrKlang收益又不多。于是轉(zhuǎn)而投入一superCube的開(kāi)發(fā)。supercube賣得還挺貴的,支持 flash,html5,android app,ios app,windows exe等發(fā)布。 功能和特性都挺NB,但是界面和實(shí)際的功能,真的好像小朋友做的。 有興趣的朋友可以試試
OGRE
這是我接觸的第二個(gè)引擎,它的龐大使我望而怯步。有幸在研發(fā)過(guò)程中,研究過(guò)天龍八部的代碼,以及它的材質(zhì)系統(tǒng)。 整個(gè)東西都挺OK的,而美中不足的是它就像一個(gè)倉(cāng)庫(kù),什么都往里塞,而很多東西,也是停留在學(xué)術(shù)層次,如果想投入項(xiàng)目,還得自己改造一番。 cocos2dx可以說(shuō)是很直接的了(有人說(shuō)是因?yàn)?D很簡(jiǎn)單,但我覺(jué)得,是因?yàn)閏ocos2dx定位很明確,或者說(shuō),是因?yàn)閏ocos2d的定位很明 確)。 OGRE也沒(méi)有附帶編輯器。 而早期的項(xiàng)目,都不是基于UNITY3D那種解耦方式,許多都是為特定類型的游戲定制編輯器。我研究過(guò)大唐,神咒,天機(jī),以及剛剛說(shuō)的天龍八部的代碼和編輯器,都是為MMORPG定制的,且直接關(guān)聯(lián)游戲內(nèi)容。 這或許就是當(dāng)時(shí)的引擎發(fā)展層次吧。
Glitch
這是一個(gè)由Irrlicht發(fā)展而來(lái)的引擎,核心部分雖然有較多擴(kuò)展,性能和特性也是Irrlicht不可同日而語(yǔ)的,但核心部分依然保持了 IRRLICHT的風(fēng)格。 唯一不同的是,上層邏輯開(kāi)發(fā)的模式,與UNITY3D如出一轍,這也是讓我想到了,任何引擎,都可以慢慢的向UNITY3D的邏輯開(kāi)發(fā)方式靠齊,包括 cocos2dx,更甚至是ogre。glitch由于是內(nèi)部使用引擎,工具也是自家定制的,但工具的設(shè)計(jì)思路,也和unity3d頗為相似。這一點(diǎn)可以 說(shuō)是讓我十分欣賞。
時(shí)代在發(fā)展,行業(yè)在進(jìn)步,我們必須跟上大眾的步伐,才能在這無(wú)硝煙的戰(zhàn)爭(zhēng)中,贏得屬于自己的那一仗...