主题:用 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
多人的角色渲染使用线性插值来避免卡顿
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦