遊戲程式設計十年總結

深圳-寶爺發表於2016-05-12

自敲第一行程式碼起,已經十年多了,今天既不是十年整的日子,也不是一個有特定意義的日子,本來像這種大總結的文章,當擇良辰吉日,齋戒沐浴三日,方可動筆。一開始計劃是寫一篇五年總結的,但各種原因一拖再拖,於是就變成了十年總結。光陰似箭,時不我待,轉眼已經在奔三的路上了,離大叔的稱呼很近了,但離大神的稱呼還很遠,在此謹以此文總結反思這十年技術生涯的點滴,與諸君共勉。

程式設計之前

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

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

之後從修電腦的大叔那買了不少遊戲碟,如CS、紅警、帝國、炎龍騎士團等等,安裝遊戲是一個隱藏天賦,只要把遊戲碟插入光碟機中,這個隱藏天賦就會被自動啟用,自己摸索著把遊戲裝上去。從此電腦上的內容開始豐富了起來,獲得了近視成就。玩遊戲的同時也對遊戲和遊戲的背後產生了濃厚的興趣,那時候經常會思考遊戲是怎麼做出來的?實際上更多的同學比我接觸電腦和遊戲更早,但他們對遊戲的背後並沒有什麼興趣,所以他們現在很多都成了小老闆,而我成為了苦逼的程式設計師

初學程式設計

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、多執行緒、網路程式設計。並製作了一個內網聊天工具,在網上斷網之後可以和其他宿舍的同學聊聊天。

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

大二之後,我漸漸被兩位大牛甩在了後面,因為認識了我現在的老婆,這是一段一波三折的複雜故事,這裡就略過不談了。雖然學習的時間少了很多,但大二這一年還是看了不少書,例如C++Primer、EffectiveC++等等,對C++的理解上升了一個層次。DirectX3D相關有Windows遊戲程式設計大師技巧,精通DirextX3D圖形與動畫程式設計、DirectX9.03D遊戲開發程式設計基礎等等,OpenGL相關的有OpenGL遊戲程式設計、Nehe的OpenGL教程以及計算機圖形學等等,對3D程式設計的理解又上升了一個層次,計算機圖形學一書介紹得非常深入,如果完全理解了此書的內容,幾乎可以不依靠OpenGL和D3D手動實現一個軟渲染3D引擎。另外由於課程需要,還系統學習了Java語言,看完馬士兵的Java視訊,非常過癮,順帶學習了一下設計模式,感覺對物件導向的理解又上升了一個層次。如果說大一學習的是如何將程式碼寫對,那麼大二學習的更多是如何將程式碼寫好。

除了看書之外,大二還做了一些兼職,例如在勤工儉學那邊幫忙送桶裝水,送一桶水大概能賺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詳解》如讀天書,但在瞭解網路程式設計之後再看這本書反而津津有味,下班之後沒有其他事情,獨自回到白石洲的農民房裡就是看書。為了解答疑惑、解決問題而學習比起普通的系統學習效率要高得多,因為目標非常明確。

在工作中還了解了sql以外的nosql資料庫,如memcached、redis、mongodb等等,讓人大開眼界,在於彤的指點下,自己依葫蘆畫瓢用epoll+單執行緒非阻塞的模式寫了一個簡單的伺服器框架,用這個框架實現了一個負載均衡的伺服器,於彤看後讚賞有加,跟我重申程式碼要簡潔,這個詞深深刻入了我的腦海裡。那時寫的伺服器能在數萬併發連線的生產環境中穩健執行,是一份非常寶貴的經驗,像什麼遠端除錯,core和日誌的分析,效能瓶頸分析也是那時候總結下來的經驗。

後面在讀過於彤的底層框架、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,或者深入地學習一下演算法,這些東西都非常有趣。

相關文章