用Go 實現 Minecraft(一定要看到最後)
阿新 • • 發佈:2018-04-11
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(一定要看到最後)