
Robert Nystrom
遊戲開發一直是熱門的領域,掌握良好的遊戲編程模式是開發人員的應備技能。本書細緻地講解了遊戲開發需要用到的各種編程模式,並提供了豐富的示例。全書共分20章,通過三大部分內容全面介紹了與遊戲編程模式相關的各類知識點。首部分介紹了基礎知識和框架;第二部分深入探索設計模式,並介紹了模式與遊戲開發之間的關聯;第三部分介紹了13種有效的遊戲設計模式。本書提供了豐富的代碼示例,通過理論和代碼示例相結合的方式幫助讀者更好地學習。無論是遊戲領域的設計人員、開發人員,還是想要進入遊戲開發領域的學生和普通程序員,都可以閱讀本書。
2025年讀完的第十六本書,這本書真的寫得非常棒。最近的兩年內我讀了幾十本書,基本上都很少在讀書的過程中寫各種讀書的想法,唯獨是這本書,我留下了不止20個想法。唯一的缺陷就是,這本書很多地方的翻譯出現了錯誤,而且不夠“信雅達”,還有其他國外作者寫得不合時宜的玩笑。 在讀到“空間分區”的這個章節中,讀到的其中一個對高維度的數據進行“降維”操作,提升內存空間的利用率。這樣的方法論,在數據倉庫、數據湖或者相關的大數據技術具有異曲同工之美,也與互聯網的AI推薦算法“雙塔模型”如出一轍。“雙塔模型”也是對用戶和產品進行對標模型向量降維,通過餘弦函數求解用戶向量和產品向量是“垂直”還是“平衡”,以求解用戶與產品是否能正常匹配上。這讓我想起來,列寧說的“事物總是具有普遍的聯繫性”。 下面是讀書筆記: 1.衡量一個設計好壞的方法就是看它應對變化的靈活性。在我認知內,架構的設計需要因應需求、場景與成本綜合考慮,在設計的考慮上有所取捨,不能出現爲了設計而設計的過度設計。 2.快速迭代是一個需要被重視的東西,一是可以快速驗證,二是可以不斷打磨完善。但是在遊戲開發中,所謂的快速迭代並不是一定需要可運行的程序,可以是紙上的模擬,或者別的形式,國內很多的開發者大部分對這個問題是有誤解的。 3.將一款有趣的遊戲做得高效要比將一款高性能的遊戲做的有趣更簡單些。一種折中的辦法是保持代碼的靈活性,直到設計穩定下來,然後去除一些抽象,以提高遊戲的性能。 4.命令模式,命令就是面向對象化的回調(Commands are an object-oriented replacement for callbacks),命令就是一個對象化(實例化)的方法調用(A command is a reified method call)。一般用在控制遊戲中角色的動作,比較好地實現動作的撤銷(UNDO)與重做(REDO)。 5.享元模式通過將對象數據切分成兩種類型來解決問題。享元的思想,就是共享。將被所有實例共享使用的數據單獨拿出來,這部分數據只需要存儲一份即可,其它的個性化數據屬於每一個實例,用來表示實例之間的共享與殊相區別。一般在遊戲內實現相同的大量相同物品(例如樹,或草),但各個物品都略微有點差異的情況。 6.觀察者模式,“在對象間定義一種一對多的依賴關係,以便當某對象的狀態改變時,與它存在依賴關係的所有對象都能收到通知並自動進行更新。”例子:Model-View-Controller架構,遊戲中使用來做“解鎖成就”,它使得代碼能夠發出一個消息,並通知對消息感興趣的對象,而不用關心具體是誰接收到了通知。 7.原型模式:“使用特定原型實例來創建特定種類的對象,並且通過拷貝原型來創建新的對象”。 8.單例模式:確保一個類只有一個實例,併爲其提供一個全局訪問入口。 9.狀態模式:允許一個對象在其內部狀態改變時改變自身的行爲。對象看起來好像是在修改自身類。 10.雙緩衝:爲應對同時進行讀寫操作的對象所設計。主要是爲了實現渲染幀之間的平滑處理問題,使得前後幀的緩衝交換更高效。 11.子類沙盒模式,一步步“操作”的定義在父類,組合“操作”的“算法骨架”在子類;模板模式,“算法骨架”在父類,而算法中的某些“操作”(步驟)在子類中實現。 總結來講,這本書真的不是一般的好,下一年我一定要再抽時間重新讀一下這本書,再好好地重新總結下,看一下能不能從其它的角度獲得不同的知識。
2.Command GAS; AI(BehaviorTree actions); EnhancedInput(ActionBind); Multiplayer Replay System; Undo/Redo 3. Flyweight ISM&HISM; Material&M Instance; Texture sharing; Animation sharing; Niagara; Object Pool & Flyweight(e.g. bullet pool); Level Streaming & World Partition(SM in GameInstance, GameMode, DataAsset, World Settings in Level) 4. Observer Delegates or BP EventDispatcher(eg. UI/Inventory System); AI Perception System&AI Controller(UAIPerceptionComponent & AAIController); Animation Notify(UAnimNotify & Combat/Sound Manager, Effect System) 5. Prototype Data-Driven(Inventory Items, Enemies) 6. Singleton Log System; Save/Load System; Game/Audio/Global Input/Settings Managers 7. State Input Handling; Network 8. Double Buffer Concurrency Scenarios: Rendering(DX SwapChain); Physics Simulations(positions, velocities); AI State; Animation(skeleton&shape interpolations); Networking(packets); Load/Save; Audio; PCG; RTS(AI Decision Tree, Pathfinding); FPS(Networking, Projectile) 11. Bytecode Configs: Gameplay logics like NPC behaviors, event triggers, AI instructions; Cutscenes; Modding & DLC Support; Procedural Content Generation(heightmap, terrain, foliage, level etc.) 12. Subclass Sandbox AI Behaviors(AIController & Character/Pawn) Inventory Item(Category via subclass sandbox; Value Design via data-driven; eg. weapon, food, potion) 13. Type Object different item categories, complicated behaviors, to be extended in the future: subclass sandbox data sharing with slight differences: data-driven & type object, combined with factory method. 14. Component GAS 15. Event Queue Physics(deferred gameplay events like collision) Task System 16. Service Locator AI(multiple NPCs, globally decision making); Audio; Event; Logger Where to register: GameMode, GameInstance, Level setups, UE built-in subsystem. In functions like Init() or BeginPlay(). 17. Locality ECS(GAS&AoS, optimized: SoA); Level Streaming(adjacent partitions loading); Pathfinding 18. Dirty Flag Deferred Updating: Scene Graph(TFs); Rendering(materials, textures, buffers); UI; Animation; Collision Detection 19. Object Pool Niagara; SM & HSM; NPC; Bullet; Audio —— 例子是結合自己的理論和實戰知識潦草地總結出來的所以不全,有些寫過有的還沒親手寫過,主要針對UE5(Unity不熟😂)。 切換輸入法麻煩,有點亂就這麼着吧反正我能看懂就行😂
第二次讀完這本書,回想上一次讀還是22年研二準備秋招的時候,轉眼已經當了兩年社畜了。很多事發生了改變,不變的是我依然是條單身狗… 第一次讀這本書還是爲了解決面試中可能遇到的設計模式問題,而重讀這本書則是受到了ai編程的影響,真正想要提高自己的設計能力以更好地利用ai了。細節來說這半年來ai編程成本的急劇下降和效果的快速提高,讓我無論在日常開發還是工作中都越來越依賴ai,親自動手寫的代碼越來越少。雖然ai確實越來越強,基於agent的編程助手也演化出了Architect和Boomerang這種流程,但受到context長度的限制,項目大起來之後還是感到寸步難行,想用ai真正搭建起一套完善且可持續維護和擴展的軟件依然很困難。既然ai已經能很好地受指揮解決局部小功能的編寫問題,是context長度限制了ai的能力,那麼人就該更多着眼於設計用一個好的架構,將各個小組件清楚劃分,保持功能間的解耦和單代碼段的簡短,才能最大程度地適配ai較短的context並得到更好的生成效果,提高開發效率。 再說到這次重讀本身,最大的感觸還是實踐帶來的改變。上班前自己沒做過什麼很大的項目,寫的代碼也大多是一次性的,很多時候設計模式如何無關緊要,當時讀這本書只感覺是一本很適合新人快速入門並提供面試題解法的書。而兩年來在公司參與幾個項目後,很多書中提到的問題實實在在出現在了眼前,這種時候才真正意識到了解設計模式在實際開發中的重要性。很多代碼用了正確的架構後,無論是梳理思路,開發新功能,還是後續維護,都省心不少。經歷一些重構的煩惱後回來重讀這本書,一邊看一邊會聯想到曾經或者正在遇到的問題,有時候讀到作者的吐槽會心一笑,有時候一下子產生新的思路,作爲一本技術書能讓人有這種感覺,真是一本好書。
原書的內容非常棒,對於理解程序設計很有幫助,如果能理解書中提到的設計理念,受益匪淺。但是本書糟糕的翻譯讓作者的意思並不能很好的傳達出去,有時候看書中的句子甚至要比看代碼難理解的多,對一些術語的翻譯並不是很準確。像是頭等函數,第一眼看到還以爲是什麼新概念,查了一下才知道就是“第一公民函數”,類似的問題就不一一例舉。本書在github上原作者有開源,並有免費的英文原文網站可以閱讀,也有熱心讀者的免費開源的中文翻譯版,這裏的水平要比本書譯者的水平要高一些,翻譯更準確,原書註釋也更清晰,推薦閱讀原文或者自行編譯開源中文譯本。
很棒的一本書啊(」゜ロ゜)」,雖然還是有些部分沒看懂,值得來回看,有些代碼可以直接用,照着翻.部分模式在項目經驗或者引擎已經應用了。最後的空間劃分很厲害,作者淺嘗輒止,至於4四叉樹,八叉樹,不視頻,等等,菜雞傷不起一概不懂。很大牛差距get……組件模式,解決了oop多繼承的問題,後面部分提到odd的趨勢和應用,真心蠻好的。現在遊戲行業,odd相當火……沒事作爲工具書翻翻特別好。最後,仍需努力
私下請教Elringus時推薦我的,是一本很值得每次新項目時三刷、四刷的書,對於閱讀別人的代碼也很有幫助。讀完後對11章的字節碼部分甚有興趣,於是硬着頭皮把一直沒看完的張秀宏的《自己動手實現Lua》讀完了。由於做遊戲很容易接觸到Lua,兩個建議都讀一下。
我還以爲是我語文學得不好,看了評論才發現原來不止我一個人看不懂😢 書挺好的,用最簡單的例子說明白了遊戲中常用的設計模式。看了書再去看引擎中的源碼實現就輕鬆多了,推薦一下知乎上的文章,總結了ue中使用設計模式的例子。 https://zhuanlan.zhihu.com/p/652149505?utm_campaign=&utm_medium=social&utm_oi=770688606179196928&utm_psn=1687936294565658624&utm_source=zhihu
不適合毫無基礎的新手讀, 需要你已經有了一部分相關的經驗,帶着“鑰匙”去讀。 正如作者所說,不要一板一眼,逐字逐句的去讀。重點看對你重要的、你需要的部分。 不少成熟的設計模式已經嵌入到某些遊戲引擎的基礎中了。重點可以看看最後一章的優化。
對所有遊戲開發程序員都非常有用
算比較快的過了一下這本書,很多方法都在實際開發中運用到了,確實非常實用,很多都是工程實際上用到的方法再學術化的,我在不瞭解這些方法的時候其實也按照這樣的思想做過項目,但是瞭解了之後更難系統化宏觀的裝備自己的武器庫。初學者不一定能夠深入瞭解,還是需要一定項目經驗才能理解爲什麼這樣用