用 Go 实现 Minecraft

小林 · · 3900 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

主题:用 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
  • 多人的角色渲染使用线性插值来避免卡顿

有疑问加站长微信联系(非本文作者)

本文来自:Segmentfault

感谢作者:小林

查看原文:用 Go 实现 Minecraft

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3900 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传