12/14/2019

C++高效能伺服器引擎設計 與 Unity 實戰 課程規劃

C++高效能伺服器引擎設計 與 Unity 實戰
課程規劃(週六:每次四小時)

六週課程概要
- C++伺服器引擎製作概要
- winsock API 應用
- 記憶體池管理和資料結構應用
- 多執行緒伺服器設計
- Unity連線實作
- Unity聊天室完成和分散式伺服器概要

//--------------------------------
課程內容

第一週
  ◉ C++伺服器講座概要
  ◉ 如何學習開發遊戲引擎?(心法&獨立思考&實作)
  ◉ 為什麼要使用C++?優點?
  ◉ 為什麼要使用C++?缺點?
  ◉ 使用C++只需要使用部分語法(語法其實很簡單,難的是設計框架framework)
  ◉ 引擎核心必須使用C/C++
  ◉ 業務邏輯使用 C++ vs Script 的比較
  ◉ 主流遊戲引擎對於Script的選擇
  ◉ 引擎檔案模組架構(引擎主體是.EXE,功能元件是.DLL,業務邏輯也是.DLL)
  ◉ 減少繼承,多用組合
  ◉ 遊戲用框架設計的歷史演變
  ◉ 給自己的小型伺服器引擎命名
  ◉ 實作:工具集:Log函式
  ◉ 實作:工具集:記憶體計數器
  ◉ 實作:單向鏈結串列
  ◉ 實作:雙向鏈結串列
  ◉ 實作:樣板鏈結串列
  ◉ 實作:組件式框架設計(參考unity & 使用遞迴呼叫)
  ◉ 實作:C++黑盒子class寫法(真正隱藏實作的C++寫法)
  ◉ C++專案超快速編譯方法

//--------------------------------
第二週
  ◉ winsock - TCP UDP(概要)
  ◉ 第一步:製作最簡單的TCP server
  ◉ IP & Port 相關設定
  ◉ winsock 基礎函式介紹
  ◉ 阻塞式 vs 非阻塞式
  ◉ 輪詢檢查 vs 事件通知
  ◉ 實作:winsock - TCP server class(阻塞式)
  ◉ 實作:winsock - TCP client class(阻塞式)
  ◉ 實作:winsock - TCP server class(非阻塞式)
  ◉ 實作:winsock - TCP server class(接受多人連線)
  ◉ 實作:TCP client class(非阻塞式)

  ◉ 測驗:TCP server class(接受多人連線)專案改為:聊天訊息廣播給所有玩家

//--------------------------------
第三週
  ◉ 什麼是記憶體破碎?
  ◉ 虛擬記憶體切換問題 與 記憶體池
  ◉ 記憶體破碎問題要不要注意?
  ◉ 如何避免記憶體破碎?
  ◉ 伺服器可以永遠不重啟嗎?
  ◉ 為什麼要用記憶體池?
  ◉ 善用CPU cache hit(CPU快取命中率&高效能)

  ◉ 為什麼要用記憶體池版本的List?
  ◉ 實作:記憶體池class
  ◉ 實作:記憶體池版本Linked List

  ◉ winsock - select API(概要)
  ◉ winsock - select API(進階優化)
  ◉ 字串封包格式(封包編號+暱稱+訊息)

  ◉ 實作:winsock - TCP server class(使用select)
  ◉ 實作:winsock - TCP server class(使用select(接受多人連線:使用記憶體池List))
  ◉ 實測:C++ client 與 server 互相通訊測試(使用select/字串測試)(本機server測試)
  ◉ 實作:字串封包格式(封包編號+暱稱+訊息)

  ◉ 測驗:client連線成功後,
          先輸入client暱稱,
          然後client接著開始輸入聊天訊息...
          測驗結果:例如client畫面要顯示:recv_len= 29, [1] ANDY:hello world.
 
  如果封包格式正確傳遞完成,再繼續把封包訊息傳給全部的client,即完成!
 
  從下列二個專案開始改:
          修改client專案:chapter 02 - 5 - TCP client - non-blocking
          修改server專案:chapter 03 - 3 - TCP server - select - multi-client

//--------------------------------//--------------------------------
//--------------------------------//--------------------------------
第四週
  ◉ 行程和執行緒(Process / Thread)
  ◉ 分時多工 vs 即時多工
  ◉ 併發 vs 並行
  ◉ 使用執行緒API
  ◉ 啟用太多執行緒的代價
  ◉ 多執行緒的最佳數量?
  ◉ 多執行緒專用的鎖API
  ◉ 執行緒競爭問題
  ◉ 執行緒死結問題
  ◉ 如何安全的使用執行緒鎖?(避免死結)
  ◉ 業務邏輯最好不要使用鎖
  ◉ 原子性的數值設定系列函式API
  ◉ 執行緒的沉睡和喚醒可能會產生死鎖
  ◉ 需要用Sleep把執行緒控制權還給作業系統嗎?
  ◉ 善用WaitForSingleObject與Sleep,大幅減低效能損耗
  ◉ 正確安全的結束執行緒

  ◉ 實作:執行緒class
  ◉ 實作:鎖class
  ◉ 實作:鎖class(嵌套鎖)
  ◉ 實作:等待事件class(生產者與消費者)
  ◉ 實作:多執行緒經典範例(生產者與消費者:任務串列)
  ◉ 實作:multi-threading TCP server(多執行緒版)

  ◉ 測驗:(生產者與消費者:任務串列)的範例,原本是輪流增減,現在改為同步進行增減!

//--------------------------------
第五週
  ◉ 計時任務class概要
  ◉ 實作:計時任務class
  ◉ 什麼是黏包問題?
  ◉ 用code示範黏包的狀態是什麼
  ◉ 二進位封包檔頭 + 自定義內容(二進位/字串)
  ◉ 實作:封包序列編號判定是否為不正確的封包
  ◉ recv解決粘包方式
  ◉ 實作:修改recv函式接收,定義封包檔頭長度,處理黏包問題(WSAEWOULDBLOCK)(server/client)
  ◉ send也有發送不完全的問題
  ◉ 實作:修改send函式發送,因為會有可能發送不完全的問題 (WSAEWOULDBLOCK)(server/client)
  ◉ 實作:禁用Nagle演算法(TCP_NODELAY)(server/client)
  ◉ 實作:心跳包機制(失去反應時的斷線檢查處理)(server/client)
   
  ◉ 使用 Unity TcpClient class(概要)
  ◉ Unity TcpClient - 分散式讀取封包
  ◉ 實作:封裝 Unity TcpClient class

  ◉ 測驗:做一個新的訊息封包,client傳給server.

//--------------------------------
第六週
  ◉ 多執行緒伺服器交互通訊圖解(基本版)
  ◉ 多執行緒伺服器交互通訊圖解(加強版)
  ◉ 調整winsock的RecvBuffer、SendBuffer

  ◉ 使用DLL的優點?
  ◉ Server Engine DLL 使用範例
  ◉ 實作:DLL規劃設計,把做過的Library製作成DLL,讓主程式來使用.
  ◉ 檢查engine code是否保證執行緒安全
  ◉ 壓力測試 BOT
  ◉ 實作:壓力測試程式

  ◉ unity - 製作聊天介面
  ◉ 實作:登錄介面 UGUI(輸入暱稱)
  ◉ 實作:聊天介面 UGUI(全頻聊天)

  ◉ 進階課題概要:分散式伺服器的優缺點?
  ◉ 分散式伺服器:優缺點?
  ◉ Actor model 分散式伺服器:設計概念(每一個Actor都可以成為一個伺服器)
  ◉ Actor model 分散式伺服器:設計概念(撰寫時只需集成一個伺服器(方便撰寫),發佈時可根據ini設定成為分散式伺服器)
  ◉ Actor Model 圖解
  ◉ 分散式伺服器模組架構參考(Actor Model)

沒有留言: