我所理解的Cocos2d-x

broadviewbj發表於2014-11-21

我所理解的Cocos2d-x完全基於Cocos2d-x3.0,深度剖析計算機圖形學,OpenGL ES及遊戲引擎架構,全面提升遊戲開發相關知識

秦春林 著  

ISBN 978-7-121-24625-8

201411月出版

定價:79.00

404

16

內容提要

《我所理解的Cocos2d-x》針對最新的 Cocos2d-x 3.x版本,介紹了Coco2d-x遊戲引擎的基本架構、渲染機制,以及各個子模組的功能和原理,並結合OpenGL ES圖形渲染管線,深入探討了遊戲開發中涉及的相關圖形學的知識,內容包括:Cocos2d-x的基本架構及渲染機制、紋理相關的知識、OpenGL ES 2.0渲染管線、計算機字型的繪製、多解析度支援、事件分發、碰撞與物理引擎、遊戲物件模型架構、Genius-x開源框架、指令碼在遊戲引擎中的架構等。《我所理解的Cocos2d-x》偏重講解每個知識模組的概念及原理,使讀者能夠透過現象看到其背後的工作機制,所以本書在內容組織上並不是圍繞Cocos2d-x的介面使用來展開,而是按照通用遊戲引擎架構及圖形學的內容進行組織。

《我所理解的Cocos2d-x》面向中、高階開發者,可作為初級開發者進階的教程,也可作為高校遊戲引擎架構及圖形學相關專業的參考教材。

目錄

1  全新的Cocos2d-x 3.0  1

1.1  Cocos2d-x 3.0的歷史意義     1

1.1.1  迴歸C++風格     2

1.1.2  更靈活的渲染架構     2

1.1.3  更自由的發展     2

1.2  Cocos2d-x 3.0的新特性     3

1.2.1  使用C++風格     3

1.2.2  跨平臺的Label 6

1.2.3  新的渲染系統     6

1.2.4  統一的訊息分發     8

1.2.5  物理引擎整合     9

1.2.6  新的資料結構     10

1.2.7  其他     14

1.3  Cocos2d-x引擎展望     15

1.3.1  3D   16

1.3.2  Cocos Code IDE  16

1.4  本章小結     17

2  Cocos2d-x架構一瞥     19

2.1  Cocos2d-x引擎系統總覽     19

2.2  Cocos2d-x記憶體管理機制     21

2.2.1  C++顯式堆記憶體管理     21

2.2.2  C++ 11中的智慧指標     22

2.2.3  為什麼不使用智慧指標     23

2.2.4  垃圾回收機制     23

2.2.5  Cocos2d-x記憶體管理機制     24

2.2.6  Cocos2d-x中的智慧指標     29

2.2.7  怎樣進行記憶體管理     35

2.3  UI樹及執行時遊戲物件     35

2.3.1  位置與變換     35

2.3.2  座標系     36

2.3.3  UI樹     39

2.3.4  UI元素與記憶體管理     45

2.4  應用程式架構     46

2.4.1  遊戲生命週期     46

2.4.2  視窗尺寸     48

2.4.3  場景管理     48

2.4.4  遊戲迴圈     49

2.5  實時更新遊戲物件     52

2.5.1  幀率     52

2.5.2  Scheduler  53

2.5.3  時間線     54

2.5.4  邏輯更新優先順序     55

2.5.5  效能問題     56

2.6  Cocos2d-x的主執行緒     56

2.6.1  在主執行緒中執行非同步處理     57

2.6.2  紋理的非同步載入     58

2.6.3  非同步處理的單元測試     60

2.7  本章小結     60

3  OpenGL ES 2.0概覽     62

3.1  圖形處理器簡介     62

3.2  什麼是OpenGL ES  63

3.3  OpenGL ES 2.0渲染管線     64

3.3.1  頂點陣列     65

3.3.2  頂點著色器     66

3.3.3  圖元裝配     66

3.3.4  光柵化     69

3.3.5  片段著色器     70

3.3.6  片段測試     70

3.4  渲染管線中的平行計算     71

3.5  構建高效能的渲染引擎     72

3.6  幀緩衝     73

3.7  本章小結     74

4  全新的繪製系統     76

4.1  新繪製系統的特點     76

4.2  繪製系統概覽     77

4.3  RenderCommand  79

4.4  RenderQueue  80

4.5  GroupCommand  81

4.6  Render  84

4.6.1  RenderCommand的排序     84

4.6.2  QuadCommand  85

4.7  元素的可見性     87

4.8  繪製的時機     89

4.9  示例:自定義RenderCommand  91

4.10  本章小結     95

5  紋理     96

5.1  光柵化     96

5.1.1  多重取樣     97

5.1.2  紋理座標     98

5.2  畫素矩形     99

5.2.1  畫素儲存模式     99

5.2.2  紋理資料的傳輸     99

5.2.3  解包     100

5.3  客戶端影像格式     103

5.3.1  紋理格式的對應關係     104

5.3.2  影像資料格式轉換     105

5.4  紋理物件和載入紋理     107

5.5  紋理單元與多重紋理     109

5.6  紋理縮放     110

5.6.1  紋理縮小     110

5.6.2  紋理放大     111

5.6.3  Cocos2d-x中設定過濾模式     112

5.7  多級紋理     113

5.7.1  多級紋理過濾模式     113

5.7.2  多級紋理的上傳     114

5.7.3  多級紋理的生成     115

5.8  紋理壓縮     116

5.8.1  壓縮紋理的特點     116

5.8.2  壓縮紋理的實現     117

5.8.3  Cocos2d-x中使用壓縮紋理     118

5.8.4  PVRTCPVRTC2  120

5.8.5  ETC   122

5.8.6  針對不同裝置使用不同的壓縮紋理     123

5.9  紋理快取管理     123

5.9.1  紋理的生命週期     124

5.9.2  TextureCache來管理紋理     125

5.9.3  場景過渡中的資源管理     127

5.9.4  Android下的紋理恢復處理     130

5.10  紋理所佔記憶體的計算     131

5.11  使用紋理最佳實踐     133

5.11.1  硬體層面     133

5.11.2  程式層面     133

5.11.3  資源層面     134

5.12  本章小結     135

6  精靈     137

6.1  Sprite繪製一個矩形區域     137

6.1.1  V3F_C4B_T2F_Quad結構體     138

6.1.2  使用QuadCommand進行繪製     139

6.1.3  Sprite作為子元素     140

6.2  Sprite的繪製屬性     140

6.2.1  顏色混合     141

6.2.2  顏色疊加     144

6.3  Alpha預乘     148

6.4  精靈表     150

6.5  精靈動畫     152

6.6  批繪製還是自動批繪製     154

6.6.1  SpriteBatchNode  154

6.6.2  TextureAtlas  156

6.6.3  SpriteBatchNode的特點和限制     157

6.7  部分拉伸:九宮格     157

6.8  本章小結     158

7  OpenGL ES著色語言     161

7.1  概覽     161

7.2  基礎型別     162

7.2.1  空型別     163

7.2.2  布林型別     163

7.2.3  整型     163

7.2.4  浮點型     163

7.2.5  向量     164

7.2.6  矩陣     164

7.2.7  取樣器     164

7.2.8  結構體     165

7.2.9  陣列     165

7.3  儲存限定符     166

7.3.1  預設限定符     167

7.3.2  常量限定符     167

7.3.3  屬性限定符     167

7.3.4  全侷限定符     168

7.3.5  易變數限定符     169

7.4  構造器     170

7.4.1  標量的轉換構造     170

7.4.2  向量和矩陣構造器     171

7.4.3  結構體構造器     172

7.5  向量的分量     173

7.6  矩陣的分量     174

7.7  結構體和成員     174

7.8  向量和矩陣運算子     175

7.9  本章小結     176

8  OpenGL ES著色程式     177

8.1  頂點和頂點陣列     177

8.1.1  圖元與頂點     178

8.1.2  頂點屬性狀態     178

8.1.3  頂點陣列     180

8.2  頂點緩衝物件     185

8.2.1  頂點陣列緩衝物件     187

8.2.2  索引陣列緩衝物件     188

8.2.3  使用VAO快取頂點陣列狀態     190

8.3  著色器程式     192

8.3.1  著色器程式字串     192

8.3.2  著色器的載入和編譯     193

8.3.3  著色器程式物件     195

8.4  Cocos2d-x著色器子系統     196

8.4.1  GLProgramNode之間的關係     197

8.4.2  GLProgramState  199

8.4.3  著色器程式的使用過程     202

8.4.4  GLProgramState的管理     204

8.4.5  GLProgramState的限制     205

8.5  頂點著色器     206

8.5.1  輸入引數     206

8.5.2  頂點座標輸出引數     207

8.5.3  易變數輸出引數     208

8.6  片段著色器     209

8.6.1  輸入引數     210

8.6.2  紋理取樣     210

8.6.3  輸出引數     211

8.7  著色器編輯工具     211

8.8  示例     213

8.8.1  使用ETC壓縮紋理     214

8.8.2  動態設定著色器引數     217

8.9  著色器程式最佳實踐     220

8.10  本章小結     220

9  幀緩衝     223

9.1  GroupCommand  223

9.1.1  使用GroupCommand的流程     224

9.1.2  GroupCommand的限制     225

9.2  幀緩衝     226

9.2.1  繫結和管理幀緩衝     227

9.2.2  將影像附加到幀緩衝     228

9.2.3  渲染緩衝物件     228

9.2.4  Renderbuffer附加到幀緩衝     230

9.2.5  Texture附加到幀緩衝     230

9.2.6  幀緩衝完成狀態     231

9.3  RenderTexture  234

9.3.1  RenderTexture的初始化     235

9.3.2  RenderTexture的繪製     238

9.3.3  ReadPixels  239

9.3.4  RenderTexture的限制及用途     240

9.4  本章小結     240

10  片段操作     242

10.1  片段操作簡述     242

10.2  邏輯緩衝區     243

10.2.1  位平面     244

10.2.2  按位計算     245

10.3  片段測試     248

10.3.1  模板測試     248

10.3.2  深度測試     250

10.3.3  模板測試的步驟     251

10.3.4  片段測試的用途     252

10.4  全緩衝區操作     254

10.4.1  控制緩衝區的更新     254

10.4.2  清理緩衝區     254

10.5  ClippingNode  255

10.5.1  ClippingNode的繪製流程     255

10.5.2  ClippingNode的模板測試分析     256

10.6  本章小結     258

11  多解析度支援     259

11.1  概述     259

11.2  設計解析度     260

11.2.1  縮放策略     261

11.2.2  調整元素位置     262

11.2.3  幾個有用的變數     263

11.2.4  使用螢幕解析度     264

11.2.5  視口設定     264

11.2.6  什麼時候縮放了     265

11.3  資源解析度     267

11.3.1  資源解析度的設定     267

11.3.2  真實解析度InPixels  268

11.3.3  什麼時候縮放資源     269

11.4  本章小結     270

12  事件分發     272

12.1  概述     272

12.1.1  什麼是事件     272

12.1.2  事件的工作機制     272

12.1.3  事件系統的特點     273

12.2  訂閱者     274

12.2.1  事件型別     275

12.2.2  註冊與管理訂閱者     276

12.3  事件的分發     278

12.3.1  訂閱者的排序     280

12.3.2  巢狀事件     282

12.3.3  在事件分發中修改訂閱者     282

12.3.4  停止分發事件     283

12.4  事件與Node  284

12.4.1  暫停與恢復     284

12.4.2  刪除訂閱者     285

12.5  觸控事件     285

12.5.1  EventListenerTouchAllAtOnce  286

12.5.2  EventListenerTouchOneByOne  286

12.5.3  單點和多點觸控之間的關係     288

12.5.4  觸控點的位置判斷     288

12.5.5  可見性與觸控事件     289

12.6  其他     289

12.6.1  其他作業系統事件     290

12.6.2  EventCustom    290

12.6.3  記憶體管理     290

12.6.4  回撥與返回值     291

12.6.5  單元測試     291

12.6.6  其他事件     291

12.7  本章小結     292

13  字型的故事     293

13.1  計算機字型的歷史     293

13.2  輪廓字形概述     294

13.2.1  點     295

13.2.2  輪廓     295

13.2.3  輪廓的方向     296

13.2.4  輪廓的交叉     296

13.2.5  混合輪廓字形     296

13.2.6  字形格子     297

13.3  FreeType字型引擎     297

13.3.1  字型檔案及字形索引     298

13.3.2  字元度量     298

13.3.3  FreeType字形解析過程     299

13.3.4  FreeType字形裝載     301

13.4  FontAtlas  304

13.4.1  Font  305

13.4.2  FontAtlasCache  308

13.5  Label 309

13.5.1  通用屬性     310

13.5.2  Font字符集     312

13.5.3  輪廓字型的縮放     312

13.5.4  特效     316

13.6  使用字型的最佳實踐     319

14  動畫系統     321

14.1  概述     321

14.2  線性插值     323

14.2.1  標量插值     323

14.2.2  向量插值     323

14.2.3  變換矩陣插值     324

14.2.4  插值在動畫系統中的運用     324

14.3  給元素新增動畫     326

14.3.1  Action是一個自描述的物件     326

14.3.2  Node上執行動畫     327

14.3.3  控制動畫的動畫     329

14.4  動畫系統架構     331

14.4.1  Speed  333

14.4.2  緩動函式     333

14.4.3  自定義動畫——精靈閃白     334

14.5  本章小結     337

15  碰撞及物理引擎     339

15.1  物理引擎概述     339

15.2  碰撞檢測系統     340

15.2.1  剛體     340

15.2.2  接觸和碰撞     343

15.2.3  碰撞查詢     348

15.3  剛體動力學     349

15.3.1  控制剛體的運動     349

15.3.2  碰撞響應     350

15.3.3  約束     351

15.4  整合物理引擎     352

15.4.1  剛體與可視物件     352

15.4.2  物理世界     355

15.4.3  遊戲迴圈階段     357

15.5  預處理與工具     357

15.6  本章小結     358

16  執行時遊戲物件模型     360

16.1  概述     360

16.2  執行時遊戲物件模型     361

16.2.1  以物件為中心的架構     362

16.2.2  元件模型     364

16.2.3  以屬性為中心的架構     367

16.3  Entity Component System    369

16.3.1  屬性結構     370

16.3.2  分離資料與行為     371

16.3.3  資料驅動     372

16.4  物件查詢與訊息通訊     373

16.4.1  根據唯一識別符號查詢     374

16.4.2  根據型別查詢     375

16.4.3  面向型別程式設計     375

16.4.4  遊戲物件資料庫     376

16.5  實時更新遊戲物件     377

16.5.1  更新的效能最佳化     377

16.5.2  更新的時序     377

16.6  本章小結     379

17  Genius-x開源框架     381

17.1  Genius-x是什麼     381

17.1.1  Genius-x架構一覽     382

17.1.2  Genius-x專案結構及使用     384

17.2  遊戲物件模型     385

17.2.1  Entity  385

17.2.2  Component  388

17.2.3  System    391

17.2.4  ECSManager  394

17.2.5  資料驅動     397

17.2.6  NodeCom    399

17.2.7  物件的層級結構     403

17.3  資料格式、載入及串流     403

17.3.1  資料格式     404

17.3.2  檔案載入和管理     405

17.3.3  遊戲世界的串流     406

17.4  遊戲通用系統     407

17.5  共享元件     409

17.6  示例     409

18  指令碼     411

18.1  指令碼的概念     411

18.1.1  指令碼語言的特徵     412

18.1.2  Lua指令碼語言     412

18.1.3  指令碼所需的架構     413

18.2  執行時指令碼語言的功能     415

18.2.1  對原生程式語言的介面     415

18.2.2  遊戲物件控制程式碼     416

18.2.3  在指令碼中接收及處理事件     423

18.2.4  傳送事件     427

18.2.5  物件導向指令碼語言     427

18.3  Lua bindings  430

18.3.1  生成繫結程式碼     430

18.3.2  在程式中使用繫結程式碼     431

18.3.3  自定義繫結     432

18.4  Lua中使用Genius-x  433

18.4.1  配置環境     433

18.4.2  建立Component指令碼     433

18.4.3  建立System指令碼     434

18.4.4  其他介面     435

18.5  本章小結     435

精彩節摘

16  執行時遊戲物件模型

 

到目前為止,我們討論的所有內容都可以稱之為低階引擎系統,例如Renderer如何將網格繪製到螢幕上,紋理如何被使用,字型如何被繪製,如何從人體學介面裝置獲取玩家輸入資訊,如何處理物體的碰撞,以及如何對物體執行動畫等。這些幾乎都是和遊戲性無關的一些基礎功能。

當開始設計遊戲的時候,開發者面對的往往是一個更上層的,可以稱之為遊戲性(Gameplay)基礎系統的高階引擎系統,例如怎樣表示遊戲中的物件,怎樣組織它們的行為和狀態,設計師怎樣透過資料驅動來快速修改關卡及遊戲配置,怎樣高效有序地組織遊戲物件之間的邏輯更新等。這些筆者稱之為遊戲性架構(Gameplay Architecture),或者很多開發者稱之為遊戲架構。理論上,遊戲性架構的一些理論和實踐甚至可以和遊戲引擎無關。

當然,遊戲性架構其實涉及很多內容,例如它可以包括執行時遊戲物件模型、關卡及串流、實時更新遊戲物件模型、事件分發及指令碼系統等。本章將會聚焦於執行時遊戲物件模型,講述常見的幾種遊戲物件設計的概念、方式及優缺點。

16.1  概述

在所有遊戲性架構相關的內容中,執行時遊戲物件模型可能是最複雜的系統,並且不同的遊戲引擎呈現出的差異極大。例如Unity3D提供的元件模型,虛幻引擎提供的物件導向繼承的模型,其他一些遊戲例如《末日危城(Dungeon Siege)》則使用一種不同於兩者的基於資料驅動的遊戲物件模型。

這些不同的遊戲物件模型之間呈現出很大的設計思維及使用上的差異,但是它們往往都提供或者必須具備一些通用的功能,這些包括但不限於:

1)管理遊戲物件的建立及銷燬。遊戲中經常會動態建立各種遊戲物件,例如一個塔防遊戲會定時出現一些小怪物,子彈在撞擊到目標時立即被銷燬等。許多遊戲引擎都提供一種統一的動態建立、銷燬遊戲物件的方式,並管理遊戲物件的記憶體及資源,例如第17章即將講述的Genius-x框架中使用createEntity()removeEntity(entity)來動態建立和銷燬一個遊戲物件。但是在Cocos2d-x中卻不是透過統一的方式建立和銷燬遊戲物件,它使用每個Node子類自己的建構函式來建立,並使用一種特殊的方式管理記憶體(參見第2章)。

2)聯絡底層遊戲引擎。每個遊戲物件要能夠透過某種方式訪問底層的遊戲引擎系統,例如能夠渲染三角形網格、執行碰撞檢測,對角色執行動畫等。在Unity3D引擎中,每個遊戲物件(GameObject)可以透過新增一個與底層引擎功能相關的元件(Componment)來訪問底層引擎系統。Cocos2d-xNode類則直接整合了物理模擬、動畫、實時邏輯更新等介面。

3)實時模擬物件行為。遊戲是一個高度實時的系統,遊戲物件的狀態、行為在每一幀都可能會隨著時間發生變化,這需要一套高效的遊戲物件更新機制。物件可能需要以特定的邏輯次序進行更新。此外,除了邏輯次序,遊戲物件之間還可能存在依賴關係,需要按照一定的次序更新(關於遊戲物件更新的次序會在本章後面講述)。

4)定義新遊戲物件型別。在開發過程中,隨著遊戲需求的改變和演進,遊戲物件模型必須有足夠的彈性,可以容易地加入新的物件型別。理想情況下,新的遊戲型別應可以完全用資料驅動的方式定義,但是在實際情況中,大部分新增遊戲型別都需要程式設計師的參與。在Genius-x框架中,新的不同行為的組合型別可以透過修改資料檔案來實現,而新的行為則可以透過指令碼來實現,然後修改資料檔案來新增新的行為。

5)唯一的物件識別符號。遊戲世界可能會包含成百上千的遊戲物件,在執行時必須能夠識別和找到想要的物件,這意味著每種物件需要有某種唯一識別符號。例如在Cocos2d-x 中可以透過給一個Node指定一個字串名稱,然後透過字串識別符號查詢一個遊戲物件。

6)遊戲物件查詢。除了上面按遊戲唯一識別符號查詢遊戲物件,遊戲性系統還需要一些更高階的查詢方式,例如找到某種型別的遊戲物件,或者某個範圍的敵人等。在面向元件或者屬性的架構中,遊戲物件是以元件/屬性為單位儲存的,很容易查詢具有某個屬性型別的遊戲物件組合,並且這種查詢遊戲物件的方式對資料驅動更友好,筆者稱之為面向型別程式設計。

除了上述提到的這些,執行時遊戲物件模型還包括有限狀態機,用於同一個網路內的物件複製、物件序列化和永續性存檔等。

作者簡介

秦春林: 自大學開始自學程式設計,先後從事過工作流軟體,雲端計算,Web等相關的工作。2011年開始進入遊戲開發領域,主持並移植了Cocos2d-x-for-XNA專案。喜歡技術分享,發起並組織了北京快樂技術沙龍,多次作為講師參與微軟,CSDN51CTO以及9RIA等組織的各類技術培訓和講座。參與了手遊專案《天降》的開發,目前主要的興趣方向是計算機圖形學和遊戲引擎架構,致力於用軟體技術豐富遊戲世界的表現及品質。

媒體評論

2014年,對於Cocos2d-x可以說是具有里程碑意義的一年:3.x大版本更新、向3D領域正式進軍、北大/浙大等重點高校開課、與ARM/微軟/Intel巨頭深入合作、在日本等市場實現後進者逆襲……引擎團隊的不懈努力得到了豐厚的回報。

Cocos2d-x 3.0版本的這一次飛躍主要實現了三大最佳化:一是新的渲染器,可建立渲染佇列,可簡單地實現批次渲染,跨平臺也非常容易;二是新修改過的API,將語言用法改為C++程式設計師更習慣的使用方式,穩定性與可讀性得到提升;三是效能再次提升最佳化,利用自動裁剪、自動批處理技術,效能得到很大提升,相容性方面在中國安卓平臺上也做到非常好用。

在版本跟進方面,秦春林的速度是最快的。現在你看到的這本《我所理解的Cocos2d-x》是國內第一本直接從Cocos2d-x 3.0版本入手的書籍,直接從更高的起點起步,可以說是國內最新。

本書由淺入深,共分18個章節,從Cocos2d-x 3.0及架構開始,逐塊剖析引擎的各個特性,同時搭配OpenGL ES的相關使用。在最後一章,秦春林還介紹了他自己基於元件架構模型寫的開源框架,可以說是一本很好的Cocos2d-x高階書籍,值得一讀。

另外,秦春林的團隊“魂世界”採用Cocos2d-x開發的作品《天降》在今年也取得了非常好的成績,已被樂逗遊戲以2000萬元的高價代理,是一款很酷的電競手遊。我本人非常期待,希望這款Cocos2d-x遊戲能夠取得更好的成績。

最後,祝秦春林的書本大賣、遊戲火爆,也祝更多的團隊能夠從Cocos引擎中受益。

 

Cocos2d-x遊戲引擎作者

王哲

前言

我與Cocos2d-x結緣於2011年,那個時候我所在的公司OpenXLiveCocos2d-x團隊合作移植Cocos2d-x遊戲引擎到WP7平臺,它採用C#語言基於XNA來實現,我是該專案的負責人。然而不久,微軟就用支援C++原生語言的WP8替代了WP7,該專案也逐漸被開發者淡忘。沒想到三年後我卻會為Cocos2d-x寫一本書,這三年,我和Cocos2d-x都在成長。

開源是我認為軟體最富魅力的部分,它給予我們閱讀和修改原始碼的自由。開源對人類和科技進步的貢獻是巨大的,如今,大多數軟體系統都有著各種各樣開源軟體的影子。開原始碼對技術人員的成長有著難以估量的價值,例如,沒有開源的Cocos2d-x,我就難以寫出本書中的很多內容。

本書定位為一本進階的書籍,它著重於講述Cocos2d-x引擎各個功能及元件背後的實現原理。因此,本書並沒有嚴格按照Cocos2d-x引擎本身的功能展開描述,而是從這些功能中抽象出一些設計或者架構層面的內容進行討論。例如本書沒有分別講述精靈、地圖、粒子特效等的介面使用,而是從紋理、渲染方式等多個方面來講述這些元素背後的工作機制;而OpenGL ES、物理引擎和指令碼等內容也幾乎是可以脫離於Cocos2d-x進行學習和理解的。

這就是本書標題的來源,也是本書與同類書籍在內容編排上的最大不同。我希望寫一本書,它可以讓讀者站在一個系統性的高度對遊戲引擎的一些架構設計及實現進行理解,從而不但提升和擴充自己的知識結構,更能夠在實際開發中去靈活解決各個層面的技術問題。本書同時追求系統性和實踐性的平衡,例如對於紋理部分,除了總結紋理相關的所有知識,也透過一些示例來演示它在各個層面的具體使用。

本書共分18章。

14章介紹了Cocos2d-x引擎的基本架構及新的繪製系統。這部分內容包括:Cocos2d-x的記憶體管理機制,UI樹的遍歷及結構,應用程式的生命週期,遊戲迴圈的各個階段,以及在Cocos2d-x中驅動各個子系統進行邏輯更新的機制和工作原理。這部分也介紹了Cocos2d-x 3.x新的資料結構,並詳細描述了新的渲染系統。總之,在這一部分,讀者可以對Cocos2d-x的基本架構有比較系統的瞭解。

 

510章圍繞OpenGL ES圖形渲染管線進行介紹。這部分從紋理講起,詳細講述了紋理的儲存格式、傳輸、縮放、壓縮及多重紋理等相關知識;第8章詳細講述了頂點陣列的結構、頂點屬性的繫結及傳輸、著色器程式的編譯及連結,以及Cocos2d-x新的著色器子系統,並舉例在Cocos2d-x中使用著色器的流程和怎樣使用多重紋理。這部分也對頂點著色器和片段著色器兩個階段在圖形渲染管線中的作用進行了詳細描述。

910章講述了OpenGL ES圖形渲染管線的最後兩個階段:幀緩衝和片段操作,並以Cocos2d-x中對這兩個階段的應用RenderTextureClippingNode為例進行講解。這樣,讀者將對整個渲染管線的每一個階段都能有所瞭解,並且能夠結合Cocos2d-x中的使用去思考每一個階段的意義和作用,從而對圖形渲染管線有更深刻的瞭解。這也是本書最具特色的部分。

1015章講述了Cocos2d-x的一些子系統,包括事件分發、多解析度支援、動畫系統及物理引擎整合。其中物理引擎部分也是我比較喜歡的章節,這部分講述了一些通用的物理引擎的架構及其使用,以及怎樣和遊戲引擎進行整合。

1618章探討應該怎樣去設計和管理遊戲世界中的物件。第16章講述了常見的物件模型、元件模型、屬性模型之間的概念、區別及優缺點;第17章則以屬性模型為例,講述了一個遊戲物件模型應該怎樣設計;第18章探討了時下最流行的指令碼相關的內容,但是與僅僅討論指令碼使用不同的是,我們站在一個遊戲引擎的高度去討論指令碼的架構,這樣讀者甚至能設計自己的指令碼模型。這一部分內容具有對前端架構設計的高度總結性與實踐性,不管是對經驗豐富的讀者還是初學者,相信都具有一定的啟發性。

另外,本書在寫作之初並沒有構建出整本書的內容結構,在寫前面的章節時我甚至不知道最後幾章的內容和結構會是怎樣的。在開始寫每一章的時候,我不會首先去給自己描繪一個目錄結構,而是首先把所有相關的內容列出來,如果之中有我不熟悉的內容,或者有Cocos2d-x以外的一些知識,我則會首先停下寫作去把這些內容整理出來。例如關於ECS部分的內容就是基於Cocos2d-x社群的一些討論,我花了很多時間去學習和理解。當最後所有相關的內容整理為一個列表時,我就知道該怎麼去寫作這部分的內容。因此,在這本書的目錄結構中,讀者找不到任何同類書籍類似的內容結構,因為這完全是基於個人的理解及知識結構體系去寫作的一本書。

所以,對我而言這本書還有一個有意義的目標,我希望透過這樣的方式去探討一種系統性的學習方法。當你開始學習某個知識點時,不要把自己限定在該知識點處,而是首先從該知識點進行適當的擴充套件,列出該知識點相關的所有內容,再逐個深入學習和研究細節,最後反過來整理該知識點的結構體系。這樣不僅能夠更深入地學習該知識點,還能夠延伸知識的廣度,所以本書有大量超出Cocos2d-x以外的內容,這些內容又是與Cocos2d-x緊密相關的。希望讀者在閱讀過程中能夠感受到這樣一種寫作風格和方法。

本書是一本進階類書籍,閱讀本書,你需要對Cocos2d-xC++有基本的瞭解。如果你是一名新手,可以首先閱讀同類書籍中相對比較入門的書籍,否則本書的一些章節可能會給你造成一定的困惑。

學習知識最好的方法永遠是多讀幾遍,書中關於OpenGL ES和遊戲物件模型部分的內容可能需要多讀幾次才能更加深入地理解相關的概念。當然,如果你在閱讀過程中遇到什麼障礙,隨時可以透過電子郵件或者我的部落格等多種方式和我進行探討。

本書可以作為Cocos2d-x開發學習的書籍,也可以作為單獨的OpenGL ES相關的教材,遊戲物件模型部分的內容也可以作為設計遊戲引擎架構的參考資料。本書也可以作為高校遊戲及圖形學相關專業的參考教程。

最後,由於個人經驗有限、思維有限,書中難免會出現一些錯誤和疏漏。真誠地希望讀者可以將這些錯誤的地方反饋給出版社,我們會及時地列出勘誤,以幫助更多的讀者更好地學習。

 

秦春林

2014725

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/13164110/viewspace-1341656/,如需轉載,請註明出處,否則將追究法律責任。

相關文章