主題:用 Go 實現 Minecraft
內容:
- 下載編譯運行
- 圖形庫
- 爲何用 go 實現
- 一些例子
- 顯示優化
- 持久化
主講師:餅乾
架構師,曾就任騰訊。主要技術方向是高併發以及分佈式系統的設計與實現。git
效果圖
![用Go 實現 Minecraft(必定要看到最後)](http://static.javashuo.com/static/loading.gif)
![用Go 實現 Minecraft(必定要看到最後)](http://static.javashuo.com/static/loading.gif)
項目地址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(必定要看到最後)](http://static.javashuo.com/static/loading.gif)