1. 程式人生 > >用Go 實現 Minecraft(一定要看到最後)

用Go 實現 Minecraft(一定要看到最後)

golang

主題:用 Go 實現 Minecraft

內容:

  • 下載編譯運行
  • 圖形庫
  • 為什麽用 go 實現
  • 一些例子
  • 顯示優化
  • 持久化

主講師:餅幹

架構師,曾就職騰訊。主要技術方向是高並發以及分布式系統的設計與實現。

效果圖

技術分享圖片

技術分享圖片
項目地址

下載編譯運行

安裝

go get github.com/icexin/gocraft

運行

cd $GOPATH/src/github.com/icexin/gocraft && gocraft

圖形庫

  • 沒有使用引擎,純手工調用 OpenGL 實現,最小依賴。
  • 窗口以及鼠標鍵盤相關的庫使用的是 glfw 實現。

為什麽用 go 實現

  • 速度快,跟 C++ 一個量級。
  • 靜態編譯,容易分發
  • 內置協程,寫並發方便。
  • 內存模型透明,容易控制gc壓力
  • 好玩

一些例子1

角色周圍的方塊是動態生成的,一角色為圓心的輻射區域才會渲染,所以後臺有一個檢查協程定時補充新的方塊。

一些例子2

  • gc 的問題在 minecraft 裏面動輒就是幾十萬上百萬的方塊,這些小對象如果控制不好對 gc 的壓力很大,那 gc 的時候就是卡幀的時候。
  • go 繼承了 C 的思想,區分值和引用,可以合理的控制內存布局。

顯示優化

  • 按 32*32 聚合 chunk,剔除不會顯示的面
  • 按視野來渲染,沒有看到 chunk 不會渲染
  • 一角色為圓心緩存 chunk,轉身不會卡頓
  • opengl 的面剔除以及深度測試

持久化

  • 使用 boltdb 作為存儲
  • 以chunkid+blockid 作為 key
  • 增量存儲+實時計算

多人遊戲

  • 存儲部分跟單擊一樣
  • 通信方面使用雙向 rpc,使用 yamux+net/rpc 實現
  • 服務器主動推送有變化的 block
  • 多人的角色渲染使用線性插值來避免卡頓

報名方式

分享時間:18年4月12日(周四)

21:00-22:00

分享方式:網絡直播

報名方式:

1、掃碼進入分享群,還可參與 GO 課程半價抽獎(2個名額)

技術分享圖片

用Go 實現 Minecraft(一定要看到最後)