本文來自于一位做游戲編程的網友。

  編程之前

  大概是讀初一的時候,家中有幸讓我得到了一臺二手電腦,那時的心情比現在讓我得到一堆蘋果電腦更加興奮。但這是一臺不能連網,也沒有任何游戲和軟件的電腦(掃雷、紙牌接龍等內置程序除外),這樣的電腦能有什么用呢?只能瞎折騰,很快電腦被折騰壞了。去電腦店修了幾次之后(被宰了幾次),決定自學電腦維修。

  跑了很多書店才買到跟電腦維修相關的書籍,也就是在這時建立了對計算機的初步認識,并掌握了屢試不爽拔插內存條、重裝系統大法。還從幫我修電腦的大叔身上學到了修電腦的裝逼套路,在幫別人修電腦時不論如何,一定要進一下BIOS搗騰一下,一定要在DOS的黑窗口下快速地敲幾條命令,讓旁人看不懂,以彰顯我的技術高超。在2002年左右,像老家那種小地方,估計會重裝系統的人都不多。

  初學編程

  2005年的某日,應該是在信息技術或數學課上,第一次接觸到了編程語言Basic,一開始用的并不是VB6.0,而是一個藍底黃字的命令行IDE,雖然只能倒騰出HelloWorld和一些簡單的數學程序,但對此仍然有著濃厚的興趣,因為我知道了游戲是通過編程來實現出來的,那時候滿腦子都是,游戲是怎么做的?但沒人告訴我,我只能自己探索。

  這時候對程序的了解,也只是最簡單的一些語法而已,直到一個親戚送了一套VCD,是開天辟地的視頻教程,里面介紹了VB6.0,在我看來,那是非常適合新手,培養程序思維的一套教程,在大叔那買了3塊錢一張的VB碟子,裝上VB6.0之后,就跟著視頻中的示例操作起來了。于是我寫出了人生中的第一個游戲,一個猜數字的小游戲,并嘗試著改變游戲的規則,制作類似石頭剪刀布這樣的游戲。

游戲編程十年的苦與樂

  視頻教程中的東西很少,很快就學完了,但這遠遠不夠,我只能寫出一些簡單的數字游戲,尋找新的資料成了當務之急,但騎著單車翻遍了老家周圍方圓十幾公里的新舊書店,都沒能找到合適的資料,如果是在廣州深圳這樣的城市或者是像現在這樣的網絡環境,應該可以很快地找到合適的資料,最后通過學校的上機課,上網找到了一本《Visual Basic游戲編程21天自學通》的書,學校的網速經常只有幾KB,尋找以及下載這本書都相當不易,實際上這本書也不是最適合我的,中間存在嚴重的知識斷層,但是最終我硬著頭皮挺過去了。

  書中的第二個例子是一個模擬細胞生存的游戲,里面用到了一些簡單的數據結構和算法,但在這時候我還不知道什么是數據結構,對書中的代碼盡是問號,大約經過了一周的死磕,在炎炎夏日,昏暗悶熱的小房間里,汗水不斷流進眼中,不為所動,因為完全沉浸在代碼中了,全神貫注地做一件事情,這是一種奇妙的感覺,這段回憶很是深刻。

  最后終于將細胞生存的游戲跑起來了,這是我到目前為止寫過最酷的東西了,并且在這個例子中領悟了簡單的數據結構與算法,貪吃蛇怎么寫?飛機游戲怎么寫?俄羅斯方塊怎么寫?五子棋怎么寫?似乎都能從腦海中模擬出來了,應該用怎樣的結構,怎樣的邏輯?我想這就是初步的程序思維了。接下來的時間里,我將腦海中想到的游戲都一個一個地實現了,雖然實現的效果看上去慘不忍睹(使用Windows自帶的畫圖工具繪制)。但依然是很有成就感的。細胞生存小游戲用的大概是一個簡單的圖結構,在做貪吃蛇的時候,依葫蘆畫瓢,寫出了一個鏈表結構,然而直到后面學習c語言的時候,我才知道這是數據結構、是鏈表……

  雖然寫出了一些簡單的游戲,但我想寫的遠不止這些,我想變強啊啊啊!!!我想寫出更好玩更炫酷的游戲,就像當時非常火的游戲《大話西游》,什么代碼可以寫出這么炫酷的畫面,什么代碼可以讓兩個人的屏幕同步出現這么炫酷的畫面呢?后來在云大組織的廣州skynet大聚會上面討論實時同步方案時,提到過在高中時就有在思考大話西游的實時同步,大家都笑了,這是一句緩解個人緊張情緒的話,但并不是信口開河。

  《Visual Basic游戲編程21天自學通》介紹了DirectX,看上去使用它就可以寫出更酷的游戲,但書中的代碼片段無法編譯,而且并不是循序漸進地介紹DirectX,掙扎了很久只能放棄。

  在這之后,又學習了一下ASP、Html以及JavaScript,這一方面是因為對網頁開發也略有興趣,另外一方面主要還是沒有好的學習資料,有什么資料就學什么。

  當我知道,做游戲應該用C/C++語言的時候,就開始尋找C/C++的資料,那時候沒有找到合適的入門書籍,不知從哪里找來一本VC++的編程書,一上來就是MFC框架的消息映射,各種控件等等,讓我覺得,C++真的好難啊。

  學校的上機課,我都用來找資料,下載資料。在網上找到了一些簡單的C語言資料,開始自學C語言,那時候最最讓我頭疼的就是指針了,聽很多人說指針很難,所以在這方面下了不少功夫。初步掌握了C語言之后,接下來開始學習一本《C語言游戲編程從入門到精通》,雖然沒讓我精通,但還是跟著寫了一些簡單的小東西出來,學到了不少古董級的知識,例如如何用圖形模式調用哪些系統中斷來繪圖,這些大概是最古老的像素游戲的開發技術了。

  學生的時間是最多的,上課的時間,腦海里想的都是游戲編程,偷偷地看著編程書籍。高中三年過得很快,轉眼就到了高考。像我這種不愛學習不認真上課的人,自然考不出好的分數,那時候對未來的憧憬大概就是,如果考得不好,那就在一家小網吧里面當當網管,修修電腦,繼續這種自學編程的日子。最后高考雖然沒考好,但還是考上了位于韶關的一所沒有什么名氣的大專學院,在那里,由于佛祖的庇佑,我的技術迎來了一個飛躍,并結識了不少益友。

  大學之路

  高考之后的暑假,決定系統地學一下C++,由于家里拉上了寬帶,所以極大方便了我找資料,在網上找到了孫鑫老師的C++視頻,通過這套視頻對C++、面向對象和MFC,都有了一個初步的了解,但對很多概念都還是一知半解。

  暑假很快就過了,2008年的九月份,來到了學校報到,飽受了缺乏資料之苦后,看到大學圖書館中海量的計算機書籍,仿佛幾年沒吃肉的人看到一盤美味的紅燒牛肉!這次的興奮僅次于得到生命中的第一臺電腦。在圖書館中找了一些VC++21天自學通之類的書籍,鞏固了一下C++基礎,以及如何使用C++來開發游戲的《VC++游戲開發》一書,讀完后嘗試著用了GDI寫了一些游戲,例如《坦克大戰》(這個應該是第二學期做的)。另外也鞏固了一下VB的基礎,使用VB做了一個簡單的系統管理工具,有點類似優化大師。

  由于高中階段的努力,讓我自認為在同齡人中的技術已經是很不錯,開始有些驕傲膨脹的時候,蚊子和志仔的出現狠狠地打擊了我的“囂張氣焰”,學無止境,一旦滿足于當前的技術,那便是逆水行舟不進則退。

  蚊子并不是我們學校的,是一位大學同學的高中同學,同他一見如故(其實那時候尚未見面),但相似的經歷,對技術的熱愛,讓我們有很多的共同語言。蚊子和志仔都是從高中便開始自學編程,并且學得比我好得多,大一時蚊子已經制作了不少看上去還不錯的軟件作品,對游戲外掛也略有研究,蚊子推薦給我的《Windows游戲編程大師技巧》,讓我受益匪淺,后來此書成為了少數幾本我反復翻閱多次的書。《C++Primer》和《EffectiveC++》是另外的兩本,通過這些比較經典的書,我慢慢理解了C++和VC++的區別,面向對象、泛型。

  志仔是一個超級邋遢的人,發型雜亂,每次見他都穿著拖鞋和大棉襖,然后掛著一條鼻涕。但很多時候看上去越邋遢的程序員越牛逼,大一的時候他就已經在研究木馬之類的東西了,不是簡單地使用工具,而是開發木馬,終端控制,屏幕傳輸,視頻壓縮等等,都是他自己做的。對于php等網頁編程,他也頗為擅長,對于OpenGL和一些圖形學算法也有研究,這兩個家伙都自己寫過操作系統(當然,不是大一的時候),畢業之后,他們變得更牛逼了。受志仔和凱文米特尼克的影響,那時候花了一段時間玩了玩黑客,但僅僅只是停留在表面,玩了一段時間發現,編程才是王道,于是丟下手上的黑客工具包,繼續回到編程的正道上,有牛逼的對手一起前進,路上才有意思,這種相互競爭相互追趕的感覺非常地美妙。

  大學前期基本都是圍繞著C++游戲開發學習的。在大一的第二個學期,接觸了匯編語言,這是一種與之前的語言完全截然不同的語言,需要運用新的思維方式,應該算面向寄存器編程,看了一些匯編教程之后,自己調用各種中斷,用匯編寫了一個打飛機的小游戲。在后面接觸了面向對象的思想之后,就漸漸把匯編忘干凈了。在五一的3天假期中,準備了泡面在宿舍悶了3天時間,把之前沒看完的孫鑫視頻看完了,初步理解了C++的類、MFC、多線程、網絡編程。并制作了一個內網聊天工具,在網上斷網之后可以和其他宿舍的同學聊聊天。

  從大學開始就總是給自己制定著一堆完不成的學習計劃,因為不想讓自己有借口停止學習。特別是寒暑假,回家的行囊中總是塞滿了計算機的書。

  除了看書之外,大二還做了一些兼職,例如在勤工儉學那邊幫忙送桶裝水,送一桶水大概能賺5毛錢。與這種苦力活比起來,賺大錢的腦力活更適合我,輔導員給我和志仔介紹了一份兼職,維護一個PHP門戶網站,每個月兩三百的收入在那時看來已經頗為豐厚了,做這份工作也學到了蠻多東西,例如mysql數據庫,還有網頁抓取,正則表達式等等。

  除了看書和兼職之外,另外還做了一些小玩意,例如用自己寫的簡陋的OpenGL游戲引擎做了個3D的坦克小游戲(3D模型文件的加載是自己在官網研究這種文件格式,然后手寫的一個模型文件解析和渲染類),另外還學習了生命中的第一個游戲引擎——HGE,在七夕的這天花了一個上午用HGE制作了一個《鴨子下樓梯》小游戲送給了老婆。其他還用Java、VB、C++寫了一些亂七八糟的軟件。

  大三時,編程基礎勉強還算可以了,對C/C++掌握到一定程度之后,學習其他語言都非常快。大三只在學校待了兩個月,然后就提前出來工作了,這兩個月里就做了兩件事情。參加一場比賽和一場考試,學期開始時輔導員跟我說讓我去深圳參加一個省里面的比賽,有很多學校參加,這讓我很興奮,大一入學時,就聽到老師說某某學長在廣東省的XX比賽中拿到了三等獎,那時心里滿是羨慕和崇拜,而現在輪到我了。

  我決定用HGE制作一款塔防游戲,和老婆組隊(老婆是美術),第一個星期簡單地學習了Lua和Delphi,然后用HGE搭建了游戲框架,使用Lua編寫游戲邏輯,另外再用Delphi寫了一個簡單的游戲編輯工具,寫到差不多的時候出現了一個重大事故,硬盤壞了,無法修復,是希捷的固件門,于是只能重新寫過,幸好前些天去機房的上機課把代碼拷過去看過,損失并不算太嚴重,但從此再也不敢用希捷硬盤了。

  現在看來當年的這款作品實在是非常糟糕,但憑借著上臺演說時的對答如流,僥幸拿了一個一等獎。如果志仔也來參加的話,一定可以拿出一個比我好很多的作品,但他總是神龍見首不見尾。比賽之后開始潛心準備軟考,2010年的軟考還是蠻難的,考的內容特別廣,包括什么編譯原理、網絡等一大堆東西,考試時發現蠻多成年人來考的,學校參加這個考試的人不多,通過的就更少了,僥幸通過之后,就開始準備簡歷,打算到廣州或深圳好好歷練一番。

  美好的大學生活就這樣提前告一段落了,人總是在失去之后才懂得珍惜,工作之后回過幾次母校,每次回去,看著熟悉的場景,回想起和同學朋友們在學校渡過的時光,心中總是百感交集。大學生活結束了,但另外一段苦逼的故事即將開始……

  前面五年算是一帆風順,而接下來的經歷,則充滿了挫折與失敗。

  第一份工作

  由于學歷不高,還沒畢業,經驗不足讓我吃了不少閉門羹,在大三剛開始時就開始在網上投放簡歷了,但基本是石沉大海。雖然沒有面試邀請,我還是獨自一人來到了深圳,因為對深圳這個城市很有好感(因為前面來深圳比賽的經歷)。為了得到面試的機會,我不惜跑到人家的辦公樓去霸王面,可惜并沒有獲得面試的機會,但現在回想起來,直闖人家的辦公樓要求霸王面的時候,還是蠻有魄力的,雖然沒有拿到面試機會,但年輕人就該如此,想做的事情就放膽去做,不要逃避,不要讓自己后悔。

  初來深圳時,已經在深圳做了幾年游戲開發的梁師兄對我很是照顧(過來深圳比賽時認識的),在深圳晃蕩了一周之后,終于否極泰來,接到了兩個面試通知,面試的過程很順利,也學到了不少東西,兩邊的面試官都對我挺滿意的,拿到了一份轉正后3K的3D客戶端開發Offer和一份試用期4K的C++服務端Offer,于是我選擇了后面的那份Offer,除了因為薪資高些之外,上班的地方在師兄附近(后來住的地方也在師兄附近)。

  在工作的第一年里學習到了非常多的知識,網絡編程和Linux服務器開發是我從未接觸過的,幾乎是從入門到熟練掌握服務器開發,這段時間的進步比以往任何時候都要快。在入職之前BOSS就給我描繪了一下美好的未來,C++服務端這個部門現在就你和另外一個工作一年的程序,但是馬上會有3位經驗豐富的大牛入職,其中有超過10年經驗的大神,而且我們還有一位非常強力的技術支持——于彤,來自博雅的服務端大神,他為我們提供了一套高并發的服務端底層框架,雖然他只是偶爾來客串一下,但卻給了我非常大的幫助,也很大程度上影響了我,他的話不多,但每句都很受用。在認識的人中他的技術幾乎是最好的,但也是最謙虛的,他的頭銜是架構師,但他說他只是一個程序員。

  首先復習了網絡編程的基礎,并將其搬到linux上,這是我把linux玩得最溜的一年,在于彤的指點下看完了《APUE》《Unix網絡編程》《TCP/IP詳解 卷一》等著作,大學時看《TCP/IP詳解》如讀天書,但在了解網絡編程之后再看這本書反而津津有味,下班之后沒有其他事情,獨自回到白石洲的農民房里就是看書。為了解答疑惑、解決問題而學習比起普通的系統學習效率要高得多,因為目標非常明確。

  后面在讀過于彤的底層框架、memcached和libevent等開源代碼之后,自己又寫了一個開源的迷你服務器框架,之后包括現在的項目,用的都是這套框架在開發。如何設計分布式的服務器架構,來保證服務器的可擴展性,保證每臺服務器的功能單一簡潔,滿足一些跨網關的實時轉發的交互需求等等,這又是另外一份寶貴經驗。一個靠譜的后端程序員需要擁有能夠解決各種問題的能力,與前端程序員不同,后端程序員更多是靠經驗堆起來的,沒有經驗的后端程序員連可能會遇到什么問題都不知道。

  后端主程

  在公司待了一年,只為公司的一個頁游開發了一個PVP系統,之后由于沒有項目做,閑得發慌。由于和主程相處的不是很融洽,所以也就打算離開了,他的脾氣火爆,不尊重人,并且不喜歡承擔責任,在項目中解決了他的不少BUG,例如死循環、內存泄漏等等。記得他曾使用strlen來判斷一個結構體的長度,向他指出這個錯誤之后,他跟我扯我不懂操作系統內核實現的原理,于彤知道后笑了,說那你讓他講講操作系統內核是怎樣實現這個原理的。火爆脾氣的主程去到其他公司之后,聽那邊的朋友說,他的火爆脾氣一點沒改,并且還掌握了使用挖掘機挖坑的高級技巧。

  過完年,部門發生了巨大的變化,C++開發部的兩個大神就離開了。本來我也打算離開了,拿到了Double薪資的Offer,但由于是做Java,心里并不是太愿意。然而在準備提離職之前,公司讓我做后端主程負責一個新的MMO手游項目的后端開發,我一下子就來精神了,這顯然比寫Java要好得多,這可是領導對我的信任啊!而且如果去新公司的話,我上班得多踩10分鐘的自行車吧。開新項目的同時,新的血液也注入了進來,有3個小伙子進入了我們部門,其中的穗智小師弟后來成為了我最得力的助手,但有一個小伙子表現不佳,怎么帶都沒帶好,后來他轉行去做測試了,主管問我,他不是我面試的嗎?他是怎么通過我面試的?我說面試的時候,我出的各種題目他都答得很好啊,其他人都沒答對,就他答對了呀。直到前幾天想起這個問題才恍然大悟,面試時是在他們的培訓機構面試的,一群人在外面輪流面試,只準備了一份面試題,前面的人答錯了,我都會跟他們講解一下,估計最后一個進來的他,已經了解了所有的面試題……

  于彤說主程并不是要自己成功,而是要幫助下面的每一個人取得成功,這樣才是成功。所以后面招了一些新人進來的時候,我總會花比較多的時間進行培訓,當大家都能獨當一面的時候,主程也就輕松了。磨刀不誤砍柴工,幫助其他人進行提升,也是磨刀。新項目的后端比較簡潔,人也不多,開發進度也是穩步向前,但前端的進度看上去頗為糟糕,起碼從給我看到的一些代碼來看,算是耦合性較高,可讀性較差的代碼了。構建在這樣代碼之上的程序,BUG自然也是頗多,這個做不了,那個無法實現。在這個項目中我在技術上并沒有多大的提升,只是默默地攢著主程、管理的經驗值,包括如何規劃分配任務、溝通傳達、如何上政治課、如何給他們打氣加油、碰到問題幫忙解決等等。雖然是初任主程,但秉著負責的態度,基本上保證了后端的開發進度穩定快速。

  這一年因為總體上比較悠閑,所以業余時間自學了一下Irrlicht和Ogre等3D游戲引擎,翻譯了Ogre的初級和中級教程,CEGUI的相關教程以及PhysicX物理引擎的官方文檔,并用OpenGL開發了一款物理冒險游戲《小鐵蛋歷險記》。在差不多年底的時候,還和師兄使用Cocos2d-x一起開發了一款ios手機游戲。

  然而又是過完年,項目組發生了巨大的變化,項目經理、主策、客戶端程序紛紛離職,然后又空降了一波人過來,原先寫的代碼全部推翻,使用新的后端主程帶來的框架,項目重新開始…。新的后端主程也是一個經驗豐富的程序員,帶來了一套Windows的MMO服務器框架,什么東西都是現成的,需求大部分都是在這套框架上稍微改一改就做出來了,有點類似所謂的換皮,復制粘貼成為了最常用的開發技巧。但我并不喜歡做這些工作,也不喜歡開發Windows的服務器,與Linux相比性能要糟糕很多,在這里完成了一些簡單的模塊,吸收了框架里的一些經驗之后,我提了離職。

  這是一次裸辭,因為我和一個美術同學(我稱他為淡總)使用Cocos2d-x一起開發一款病毒塔防游戲,想離職了好好把這款游戲做好,業余時間開發游戲還是蠻累的,但這款游戲是我目前為止做過最棒的游戲了,有強力美術的加盟就是不一樣。這次辭職并沒有成功,改為了請兩個月的假期,假期里基本將游戲的代碼寫完了,還接入了ShareSDK,但是淡總慫了,因為后續要制作的各種關卡需要花費的時間太多了,從關卡的設計,到關卡中每個地圖的繪制,再到數值的調整,這些看上去還是需要一個專業的策劃才能搞定,于是這款游戲被擱置了。之后淡總提議用這套美術資源開發一些其他的不需要關卡的游戲,不要浪費,于是我們使用這套資源開發了病毒射擊和病毒消除小游戲,這兩個游戲都做完了,但是玩起來感覺很單調,于是病毒射擊又改成了病毒射擊塔防,在病毒射擊的基礎上增加了很多新元素,設計了各種地形,各種道具,看上去游戲的可玩性增強了很多,但最后又回到了和病毒塔防一樣的問題,關卡、場景、數值…..結果這些游戲一個都沒出來。

游戲編程十年的苦與樂

  在這些小游戲的開發過程中,總結了不少經驗,那時Cocos2d-x剛剛興起,資料還很匱乏,于是有了編寫Cocos2d-x書籍的念頭,小游戲不搞了,那就將Cocos2d-x積累的經驗寫成書吧。

  U3D主程

  結束兩個月的假期回到公司,就開始了打雜,這時手機游戲和手機游戲引擎Unity3D、Cocos2d-x正是非常火熱的時候,BOSS希望搭建一套通用的Unity3D底層框架,把游戲的規則抽象出來,每開發一個游戲都只需要繼承一些類,然后實現類里面的一些接口即可,這樣就可以很快的開發一款新游戲。但我完全沒有接觸過Unity3D,多次的開會討論都沒有得出一個好的結果,因為這種框架很虛,如果說有這樣一套框架的話,那不就是Unity本身嗎?最后只是用C#的委托實現了一套消息機制底層,另外由于原先U3D的網絡底層實在是太糟糕了,根本無法重用,于是實現了一套U3D通用的網絡底層框架,代碼非常地簡潔易用。后面這套消息機制和網絡底層被應用在了公司的所有U3D項目上,MMO手游項目的新主程接手項目的時候,直接推翻了所有的代碼,只保留了這套消息機制和網絡底層,再后面一些這套消息機制和網絡底層也被應用到了不少其他公司的項目上了,然而在代碼中關于作者和日期等注釋信息,卻被刪掉了……這種感覺就是,我寫的東西,變成了別人的了,再跟我沒有任何關系。

  編寫框架并沒有花費我太多的時間,但為了設計好,為了簡潔好用,我投入的精力卻不少。業余時間仍然是和淡總他們一起開發著病毒系列小游戲。公司的一個主策建哥很有想法,很能忽悠,在他的忽悠下我和穗智小師弟也幫他開發了一些小玩意,穗智幫他開發了一個看美女圖片的應用,穗智拿到建哥整理給他的性感美女圖片時,穗智吐槽了建哥“這樣的圖片我百度可以隨便找到一堆”,都是一些普通的泳裝美女圖片,這款手機軟件的功能,就是一張張地翻閱這些圖片,30張之后的每10張會有一個密碼。建哥打算回老家賣低端的安卓機器,順便推銷這款軟件,當用戶需要看到心癢癢的時候,密碼輸入框彈出來了,然后用戶就要帶著手機過來找他,交錢之后,建哥偷偷地把密碼輸入進去,就是這么一個商業模式,建哥說靠這款破軟件,他一年就可以進賬100萬,雖然最后這款軟件一份都沒有賣出去,但建哥混的要比我們好得多,我還是主程,他已經是四個輪子的CEO了。

  另外一個獨立開發手機游戲的小團隊邀請我加入,他們策劃美術程序齊全,但我沒有答應,經過了反復的游說,我答應幫他們用Cocos2d-x搭建一個框架和基礎的Demo,僅僅是友情協助。在開發的溝通過程中,感覺并不是很靠譜,因為游戲不好玩,美術不好看,很多東西反而要我去催。Demo如期交付了Demo,一段時間之后,這個團隊解散了,因為在開發的過程中有人還去接外單,當這個團隊解散時,項目的進度仍然停留在我交付Demo的那一刻。這個團隊的解散給了我很深刻的印象,要么不做,要做就全力以赴,兼職開發的這種小團隊,一個拖后腿全部完蛋!每個人都要有很強的責任心,對自己做的東西有強大的信心,主動往前才行,如果是由一個帶頭的推著整個隊伍前進,這樣是走不遠的。不久之后,我和淡總的病毒游戲也告了一段落,大家都太累了,病毒系列的幾個項目的代碼沉睡在了硬盤上的某個角落。

  接下來學習了一下U3D,發現U3D這個引擎比Cocos2d-x成熟的地方太多了,了解了各種更加成熟的理念,C#這門語言用起來也非常爽快。我開始作為U3D主程負責一個項目,這是一款局域網對戰的項目,類似一個游戲平臺,內部可以嵌套很多個小游戲,公司已經做了一年多,已經做爛了,原項目組的程序都跑去MMO的項目組了,于是從新招了2個U3D客戶端一起搗鼓這個項目。項目的代碼實在是非常糟糕,各種不規范,BOSS希望我在這個基礎上繼續,然而我選擇了推翻重構。因為項目的業務邏輯都寫到了我的網絡底層框架里面了(像這種東西就該做成庫,不然他們改),原本這款游戲是可以單機和局域網對戰,BOSS希望可以加入廣域網對戰的功能,但廣域網對戰暫不開發。我和兩個小伙伴花了2個多月的時間,只保留了原有的美術資源,所有代碼全部重寫,重新設計。并實現了一些新的功能,完成了這個項目!重構之后的項目代碼簡潔,耦合性低,巧妙使用了消息機制,完成了單機版本之后,只花了1~2天,就把所有的小游戲實現了局域網對戰,再花上少量的時間,我們可以很輕松地實現廣域網對戰。雖然開發過程中換了3次人,來了又走,但我們還是按時完成了任務,最后打包的那天,我們好像加班到了快2點,這是加班的最高記錄。

  最后,這款游戲在商務階段,沒有了下文,又是一個無疾而終的項目,而這些絞盡腦汁寫出來的代碼,又在硬盤上的某個角落,沉睡了。

  臨危受命

  項目失敗之后,又有去意,但此時已經差不多是10月份了,想著過完年再說吧。離職的主管介紹了一份不錯的兼職,開發一款Cocos2d-x游戲,有點類似憤怒的小鳥吧,穗智小師弟跟我一起接了這個單子,大概花了3個月的業余時間比較輕松地完成了這款游戲,期間搭建了一個不錯的物理框架,設計好,代碼簡潔,開發效率自然高。游戲的美術和關卡設計都挺不錯的,我們簽了一份5萬塊的外包合同,然而游戲做完之后我們只拿到了4萬塊,因為最后的一萬塊是要游戲上線之后才給,上線到Appstore時由于某個原因被打回來,然后這家公司就倒閉了……這個項目的代碼又在硬盤上的某個角落進入了沉睡。

游戲編程十年的苦與樂

  在接外包之前,公司又開了一個新項目,這是一款精簡的多人在線大富翁游戲,主要是山寨一款PC上的大富翁,我們都覺得這款游戲很好玩,把它搬到手機上肯定有戲。于是我作為后端主程開始了這款游戲的后端開發,當前端還沒出Demo的時候,后端已經完成了復雜的游戲邏輯,例如各種隨機事件的觸發,并做了一個簡單的文本界面客戶端對服務端的邏輯進行了測試。大富翁的后端邏輯不同于一般的后端,一般是一個請求一個響應,但大富翁的一個請求可能觸發的事件是不一定的,事件的流程也會隨著不同的環境發生改變,并且中間有可能導致玩家之間的復雜交互。游戲的邏輯完全跑在后端,前端只需要執行少量的顯示邏輯即可。由于進度超前,所以也有足夠的時間完成外包項目。

  到了發Demo版本的時間,前端的版本問題很多,延期了一兩周還是沒能順利給出版本。由于突發了一些我們并不知道的緊急情況,經理對這次的延期有很大的意見,并決定親自操刀,他仔細閱讀了前端的代碼,并對一些代碼進行了刪改,對前端的代碼提出了很多疑議,并整天坐在前端小伙伴旁邊看著他們寫代碼,要求每一行代碼都寫上注釋,前端幾乎停止了開發,每天都在寫注釋。游戲也已經完全跑不起來了…..

  在前端小伙伴們奄奄一息的時候,經理找到了我,想讓我把前端帶起來,我一聽嚇了一跳。原計劃是年前出一個Demo版本,年后一個月內出一個Alpha版本,經理希望我按照原計劃把版本趕出來,在會議室中幾個人對著我猛灌雞湯,仿佛我能推平山岳,扛起這一切,把這個項目帶向成功。而如果我拒絕,這個項目就進垃圾桶了,難道我做的項目又不能上線了嗎????

  內心掙扎了很久之后,終于把這碗雞湯干了。干完雞湯之后,我大概向經理提了10個條件,包括不允許經理再看前端代碼,以及坐在前端程序身邊看他們寫代碼。砍掉了一些不必要的功能。給前端同學放一天帶薪假放松一下。給我一筆經費,在過年的時候將一些完不成的任務打包,明碼標價,外包給前端程序去做,這些任務量并不繁重,但價格還算比較不錯的,這樣即可以在過年期間讓項目前進,又可以避免前端同學年后回來對代碼生疏了,需要重新花時間熟悉代碼。各種討價還價之后,雷厲風行地扛起了前端項目的開發,接下來Demo和Alpha版本都按照原計劃完成了。雖然名義上是前后端主程,但實際上后端的工作已經完全丟給穗智小師弟了。

  版本完成之后,又是各種新需求和周邊系統,包括AI和托管等麻煩的功能,大概是五月份左右,騰訊的天天富翁上線了,我一看,跟我們的游戲一樣,這對整個團隊的打擊都很大,而過年前,經理就已經提前知道騰訊會代理這款游戲了,也就是這個原因,他才親自操刀。游戲接下來要做的功能已經不多了,但游戲的前景卻是一片迷霧。之后開始對項目的前端框架各種優化總結,沉淀了一套通用的UI框架、資源管理框架以及新手引導框架。沉淀下來的框架簡單易用,而且靠譜,這歸功于長期基類下來的設計經驗,以及在使用的過程中不斷地調整打磨,還有對模糊的技術點的徹底研究,例如?Unity AssetBundle爬坑手記,只有徹底搞清楚了,才可以更好地使用它。

  由于版權的問題,這個游戲最終還是沒有上線。這些代碼再次沉睡在了硬盤中。所以說,山寨并不靠譜,創新才是王道!

  又是一段空閑期,我和淡總商量了一下,決定快速開發一款小游戲,于是我們開發了一款躲避類的游戲,類似宮爆老奶奶,為了能吸引到眼球,我們決定嘗試一下色色的主題,也就是卵子躲避精子,游戲命名為《避孕達人》,經過精心的策劃之后,這款游戲上了一些安卓平臺。幾次優化之后,我們都覺得可玩性還可以,打算就靠賣點廣告來賺錢,結果到現在就賺了21塊錢的廣告費,其中的20塊還是我自己點的廣告……

游戲編程十年的苦與樂

  一段有趣的面試經歷

  接下來朋友推薦了一個Cocos2d-x的面試,面試官并不是很友善,大概就是這種“呵呵,你很牛逼是吧?”,然后就試圖在面試中把我難倒,問了一些主觀性的問題,兩個人的思路根本就不在同一個頻道上,例如我說搭建U3D的網絡框架,他說U3D的網絡底層框架有什么好搭建的?不就是個連接連上去就可以了嘛。我說提供對socket的封裝,異步請求,自動處理半包粘包,將tcp流分割為完整的包最后傳遞到客戶端主線程的一個服務處理對象中進行處理。答完看上去他對半包粘包這些好像一點都不知道,追問了我一句,那你是如何處理TCP丟包的呢??然后我就不想討論這個話題了,TCP的定義講得很清楚,TCP提供可靠連接,TCP底層實現是可以保證不丟包的,我反問了一句你們又是如何處理TCP丟包的呢?他說很簡單啊,如果對方沒收到就循環發送,估計到了這里面試官已經自動將我判斷為沒有處理TCP丟包經驗的程序員。例如說到將第一個U3D項目代碼推翻時,他問我為什么要推翻,我說因為代碼耦合性太高了,游戲的業務邏輯都寫到我的網絡底層框架中,他說那說明你的框架設計得很糟糕(這個功能完全不需要寫在框架中,框架的接口足夠實現這個功能的,也許是這個框架無法處理TCP丟包,所以真是糟糕啊)。例如問了我一個特別泛的問題,大意是如何設計一個框架,我說這個要根據需求來啊,你可以現場提需求,我來設計,他堅持讓我回答這個問題,我也只能回答一些比較泛的答案,然后他說不對,我問他那正確答案是什么?他說是抽象和封裝……要不是看在我朋友的面子上,我真想抽他!

  本來我想通過這次面試,來積累點面試經驗,補充一下自己的不足,沒想到會變成這個樣子,接下來他開始問了我一些Cocos2d-x和Box2d的問題,我有氣無力地回答著他,扯了這么久,水都不給喝一杯,我都困了。反正我也不想和他共事,又學不到什么新的東西,就想草草結束這次面試了。接下來HR妹子和他一起來跟我聊,HR說他們的技術對我已經有了一個了解,雖然我了解的東西挺多的,但都不精通。嗯,我點點頭,我確實離精通還很遠。HR接著說到我的Cocos2d-x經驗比較欠缺,還沒有到達一定的水平。我愣了一下,剛剛明明Cocos2d-x相關的問題一個都沒難倒我好嗎,并且有些問題我還提出了比他們現在更好的實現方式,我已經用Cocos2d-x做了四五個游戲了,我那本Cocos2d-x的書也已經完成了第一次重構了,引擎的代碼更是讀了N遍,你可以說我其他的什么不精通,但你就算問我Cocos2d-x引擎底層的渲染流程我都可以給你詳細地說出來。我真想拽拽地對面試官說一句,那就請你隨便問一些Cocos2d-x的問題,來難倒我好嗎?但我克制住了自己,因為沒有意義,點了點頭說道,確實對Cocos2d-x不怎么熟悉。然后他們問我薪資要求,我說了一個14K。HR說我們覺得你不值這個價格,11K怎么樣?我點了點頭,嗯,確實,如果我對Cocos2d-x熟悉一些的話,應該會好一點。后來HR打電話勸我過去,說面試官覺得我還是可以培養的,轉正之后,如果你表現好的話,還是有可能拿到這個薪資的,我婉言謝絕了。

  后面,我帶過的一個小師弟意外地去到了這家公司面試,被格外器重,我不知道當時的面試官還在不在,只知道他們給小師弟開了12K。

  Cocos2d-x主程

  在2014年的年底,公司又開了一個新項目,是一款實時橫版競技塔防手游,我兼任Cocos2d-x主程和后端主程,游戲的進展還算比較順利,在這個項目中又沉淀了大量的經驗和一套好用的框架,踩了Cocos2d-x大量的坑,使用一套通用簡單的方案解決了實時同步的錯誤糾正以及斷線重連等等(后面有空會寫一篇文章分享一些實時同步的經驗),相比起項目剛開始時的設想手機網游實時同步方案,經歷實踐之后的方案更加地成熟。

  和策劃們一起用心打磨這款游戲的戰斗系統,實現了非常多的玩法,支持策劃配置各種特色關卡,例如雙方爭奪某個要塞,例如護送某個角色到達指定位置等等。各種擁有特殊能力的兵種都可以通過策劃配置出來,不需要程序調整代碼,類似LOL妖姬的標記,LOL大發明家的安置炮臺,還有分身、閃現、傳送、魅惑、隱身、召喚、復活、放逐等等一堆亂七八糟的功能,都可以配置出來。游戲關卡中的戰斗場景也支持豐富的互動,例如一個寒冰法術打過去會順帶凍住場景后的植物,例如一個火焰爆炸開場景中的植物也會被灼燒,甚至旁邊的石塊也會被炸飛,這些都可以通過策劃配置出來。開發的氛圍很好,沒有出現推卸責任這樣的情況,大家一起認真地討論著某個功能的實現,怎樣能讓它有更好的體驗。

  開發了一年左右,皇室沖突強勢上線了,這意味著我們做不了首款實時競技的策略手游了,或許會被套上山寨的帽子,或許山寨皇室沖突的游戲會爛大街,從而影響到我們游戲……,所以我們必須把游戲做得更好,比皇室沖突更好!誰說國人就只會山寨?

  通過不斷地打磨,關卡副本和PVP玩起來已經算是比較有意思了。直到現在,游戲終于到了最后的尾聲,周邊系統也基本完善,估計一兩個月內就可以發布最終的版本,希望這款傾注了我們大量心血的游戲到時能夠順利上線吧,皇室沖突的成功也證明了手機上的即時策略游戲是大有可為的,如果這樣一款有特色、有創意、玩法有趣、注重品質和細節的游戲都能失敗的話,我真不知道怎樣的游戲才能成功了。(為避免廣告嫌疑,現在手上的項目就不詳細介紹了,也不上圖)

  在繁忙的工作中,我完成了第一本Cocos2d-x書籍,這是第三次的推翻重寫。每次寫了一段時間之后,回過頭看之前寫的文章,頓時覺得慘不忍睹,必須推翻重寫,或者是Cocos2d-x的接口又改了,或者是自己能力的提升推翻了之前的一些想法。總之不想將就,就得重構!就這樣斷斷續續地寫了三年多,直到最近這本書終于出版了。雖然希望做到極致,但能力有限,精力有限。中間看著Cocos2d-x的出版物逐漸多了起來,有過停筆的想法,但最終還是堅持了下來,這個過程比想象中要難得多了,但語言組織能力、表達能力都能得到很大的提升,對于要表述的技術點也清晰了很多。寫書不易,經常加班的IT人寫書更是不易,有了這么一個經歷之后,對一些寫得不是很好的書籍,我也不會去吐槽它了。大概在項目上線的時候,第二本Cocos2d-x的書也該交稿了。第一本書介紹了Cocos2d-x的基礎,雖然是基礎,但有很多點還是挖得比較深,例如指針、內存、紋理、渲染等。這些往往是一些初級程序掌握得不好的點,相信對于基礎不扎實的同學會有很大的幫助。第二本的內容要比第一本精彩得多,聽了網友紫蝦的建議,把第二本寫成了一本雜文集,深入總結了Cocos2d-x實際開發中的各種技術,例如跨平臺開發的相關知識、實時同步游戲的前后端開發、Cocos2d-x的各種調試技巧、Shader、裁剪遮罩、加密解密、分辨率適配、Lua、Spine等等一系列實用的內容。甚至開發了一個類似U3D編輯器一樣,可以實時調試Cocos2d-x游戲內容的界面工具,這些內容都是實際工作中一點點總結出來的心血結晶。在征得出版社同意的前提下,接下來會將書中的一些章節發布到博客中。

  當完成書和項目之后,會有一段難得的空閑時間,可以好好陪陪家人,可以好好寫寫博客,可以好好踢踢球,可以把駕照考了。接下來也許會找一些志同道合的朋友繼續做一些獨立游戲,也許會好好學習一下如何編寫操作系統,或者是研究一下Arduino,或者深入地學習一下算法,這些東西都非常有趣。

除非特別注明,雞啄米文章均為原創
轉載請標明本文地址:http://www.cpbsu.com/software/569.html
2016年5月13日
作者:雞啄米 分類:軟件開發 瀏覽: 評論:0