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

主題:用 Go 實現 Minecraft

內容:

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

主講師:餅乾

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

效果圖

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

用Go 實現 Minecraft(必定要看到最後)
項目地址github

下載編譯運行

安裝 緩存

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:00ide

分享方式:網絡直播高併發

報名方式:

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

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

相關文章
相關標籤/搜索