-
1 # 領導藝術
-
2 # 苅鬱症
來自一位資深網際網路工作者的個人經歷與感受。
以前學了現在沒用的技術,有很多,越數越傷心,回憶下 2007年的事情吧:
1. 業餘在玩 Flash 遊戲開發,當時頁遊還沒有火,我覺得是個機會,市面上很多頁遊都是八位機的水平,估計他們以前都沒什麼遊戲開發經驗,所以大家都持懷疑態度,我想看看 Flash 的 2D 效果能做到什麼程度,於是花了了兩週時間做了 Flash 下的第一個小遊戲:
Flash Game - Final Weapon 。。。
嗯,模仿 PopCap 的 heavy weapon 加了些有趣的元素,比當時所有市面上的 Flash 遊戲效果都好一大截,至今為止,仍然有很多市面上的 Flash 遊戲沒達到這個 Demo 的效果。
2. 帶領一隻六人團隊開發 XBox 360 的預研專案,把公司一套 3D引擎移植到 XDK 的 D3D9下面,D3D8 到9 跨度很大,廢了比較多的時間,覺得 D3D9 才是未來。當時 360 的效能並沒有說的那麼好,單核效能差不多隻能到我筆記本單核的 50% 左右,但是它有六個核,和原有引擎的單執行緒體系差別比較大,因此效能十分堪憂,這個坑填了很久。原有引擎很多基於 SSE 的運算程式碼全部不能使用了,花了不少時間改寫成為 PowerPC 的 AltiVec 指令,最終才將整個引擎終於在 360 上從 “不能用” 變為 “能夠一用” 了。當時寫了篇關於 360 的最佳化文章:
PowerPC 彙編入門與最佳化 。
3. 研究遊戲同步技術,當時國內沒人覺得遊戲還有 “同步” 問題,沒有任何參考資料,2007年遊戲市場上清一色的 MMORPG 遊戲,大家覺得只有做 MMO才是掙錢的。我看當時網遊裡 95% 的 RPG遊戲,在對比單機遊戲上只有 39%的 RPG比例,覺得十分不合理,玩家遲早要厭煩,RPG壟斷的局面必然被打破。但是傳統 RPG那一套在快速動作遊戲上基本沒法行得通。我不斷的抓包,推敲模擬傳統局域網遊戲和國外快速動作遊戲的同步方式,寫了篇文章:《幀鎖定同步演算法》配合之前寫的《網路遊戲同步法則》以及《影子跟隨演算法》,基本上從兩個方向討論遊戲同步的兩大核心方法:幀同步和狀態同步(客戶端預測插值)。
4. 學習策劃知識,翻譯 MUD之父 Richard Bartle 的《MUD玩家分類理論》,當時遊戲“成就係統” 在國外剛剛興起,國內遊戲還沒有這個東西,覺得十分不錯,我又翻譯了 《成就係統最佳實踐》。
5. 弄 server 記憶體分配最佳化,參考 kernel 的 slab 記憶體分配演算法,於是最佳化並重新設計了一套 slabtree 分配演算法,給服務端整體記憶體分配效能提升了一倍,不再受執行時間和碎片的影響 。大致原理見:如何設計記憶體池? - 知乎
10年後:
1. Flash 基本掛掉了,沒人再提了,不過如今頁遊還是在發展,只是遠沒當初那麼火爆,當年學習 Flash 的程式設計師都紛紛 cocos 和 u3d了,現在做頁遊想招聘一個 Flash 程式設計師更是難上加難,不過 Flash 的 API 我覺得設計的真的很漂亮,我見過 2D 引擎裡比較上乘的介面設計了,今天很多用 H5封裝的遊戲引擎,比如白鷺引擎,沒事掃了一眼,他們從物件樹到 API名稱,還是再模仿 Flash 的介面,可見影響力有多大。
2. 360也掛掉了,當年遊戲機清一色的 PowerPC (主機)和 mips(掌機,PSP)架構,如今換成了 x86(主機)和 arm(掌機)結構了。D3D9 也早已被淘汰。
3. 同步技術到今天都還在很多討論,作為研究的比較早的人,我的三篇文章曾經幫助了不少遊戲解決他們的同步技術。《街機三國》的製作人跟我說,當時做 DEMO就是卡在同步上,後來看到了我的 《幀鎖定同步法》解決了《街機三國》的同步問題,最終專案得以立項,然後他們就發財了,我得到一句真誠的 “感謝”。聽說《王者榮耀》也還在用基於 “幀同步” 的改良方式。
4. 當年花過好幾年的時間學習策劃知識,業餘也喜歡自己兼任策劃和程式做些小遊戲,但如今成就係統早已不是什麼新東西,巴圖的理論也出現了更為科學先進的玩家分類方法的論文,加上 2009 年以後我就不做遊戲了,這些知識基本也就白費了。
5. 後來發現和 tcmalloc 很像,用了 7年這套程式碼,比 libc 自帶的 malloc 強太多了,一路都是最好用的記憶體分配演算法,後來我自己忙其他專案懶得新增新特性和繼續最佳化就換成 jemalloc 了。當年 “記憶體分配” 這個技術,但凡有點經驗的人,都會來兩手,也是比較關鍵的模組之一,如今好玩看看就行,自己重新實現邊際效用太低。
----
總結下,翻翻歷史,以前學過現在沒用的技術實在是一大把,我承認技術是有 “道” 和 “術” 的區別,我寫了十多年程式碼的時候以為 “術” 容易淘汰,而只有 “道” 就能長存,一旦掌握了恆久不變的道,就可以以不變應萬變;而又寫了十多年程式碼以後發現從更長的尺度上來看,並沒有一成不變的東西。
道法精深,短期是可以幫助你儘快的掌握運用新的 “術” 但是隨著具體實踐的不斷髮展,人類認識世界的範圍逐步擴大,理論體系這個上層建築的 “道” 也需要不斷修正,推陳出新,適應新的實際情況。
早期基於的端遊開發經驗,幫我在 Flash 平臺上可以更短的時間內掌握要點,並做出超過同期水平的東西。手遊興起後,我雖然沒趟這灘渾水了,但看到很多第一批成功的團隊,也都是早年在端遊或者頁游上有經驗的人。
另一層面上,道也不是一成不變的:以前積累的各種單核技術下的 “道”,碰到 360 這種 6核cpu,每個核都不行的體系,基本全廢了;以前寫程式碼,每一行我都想追求極致效能的做法,後面變得沒那麼重要了;記憶體分配演算法,在某一階段內自己可以做到領先,但不能持續瞭解最新相關方法,不持續迭代,興趣轉移了,隔段時間也就被 jemalloc 超過了,所以也並無一成不變的演算法。
總之,基本原理要掌握,不能成天只搞具體技術忽視理論提高;也不能痴迷純粹的 “理論”,還是要勇於實踐掌握新進的 “術” 才能更好的迭代進化你自己的 “道”,否則空有理論,只能坐而論道了。這不,我一把年紀了,最近幾個月還在玩 beautifulsoup4 做爬蟲呢。
並沒有什麼 “一成不變” 的 “基本原理” 可以讓你學一次就吃一輩子的。
錢學森不是說過麼,脫離工程的理論,是沒有價值的。
回覆列表
十年算不做一個節點,只要計算機的結構和技術沒有突破性創新,革新,顛覆,就還是會有用的。例如,量子計算機,全新的程式設計邏輯,全新的技術,最後發展為全光量子計算機,估計就是全新的知識了,不會有程式語言這一說了,程式設計思維還是在的,人最重要的在於改變和堅持學習希望祖國走在最前列,引領世界潮流!