Go游戏服务器开发的一些思考(三十四):无缝世界场景构建与同步(一)
2018-03-09 13:09
1466 查看
前提假设
本文称共同构建完整世界的服务为Cell即多个Cell服务共同组成一个世界场景
本文假设你已经实现了一个
分布式对象系统。
本文称为
实体
每个实体可以在多个Cell创建实例
世界场景构建
世界场景构建,简单的说就是每个Cell对应部分世界场景区域,这样拼凑成整个完整的世界场景。接下来,将按依次介绍:
规则正方形组成的世界
不规则区域组成的世界
规则正方形组成的世界
场景构建
假设世界被正方形分割,一个Cell对应1个正方形区域。
那么我们来考察下上图编号为0的Cell,以及它上面的实体同步。
根据这图,先做些假设(能从配置中获取,或硬编码的数值):
Cell0的左上角坐标为(x0, y0)
Cell0的右下角坐标为(x1, y1)
玩家视野为V
根据上面的这些数值,可以把Cell划分为9个部分a-i。
并且可以轻松的编写函数
GetArea(x, y),来得到(x, y)落在哪个Cell内区域。
也可以轻松的编写函数
GetAreaNeighbours(area),来得到预期a-i的外接Cell:
区域 | 外接Cell编号 |
---|---|
a | 无 |
b | 1 |
c | 1 2 3 |
d | 3 |
e | 3 4 5 |
f | 5 |
g | 5 6 7 |
h | 7 |
i | 7 8 1 |
即Cell启动初始化完毕后,都可以知道自身的每个area外接哪些Cell;以及这些Cell的信息
至此整个场景就可以完成构建。
即上述这些基础,能够做下面的事情:
Cell知道什么时候,实体需要在其他Cell上的创建或销毁
关于实体创建、销毁等应该很清晰,不再讲述了。
实体同步
如图, 实体A、B、C的实例分布
实体实例需要有Master、slave之分。
如何做主从切换,后续章节再介绍。
野怪优化
上述实体同步,是允许战斗的,但是毕竟涉及到不同服间的消息同步。因此应该仅量减少这样的战斗发生。比如野怪刷新这种东西,最好限制在 area a区域即可。
这样可以确保 边界上的 战斗有更小的压力,更好的体验。
不规则区域组成的世界
在现在的正方形分割的基础上,可以通过多个正方形合并,并计算边界area的外接Cell即可。详细 下一篇文章 介绍。
相关文章推荐
- Go游戏服务器开发的一些思考(三十七):无缝世界场景构建与同步(四)
- Go游戏服务器开发的一些思考(三十六):无缝世界场景构建与同步(三)
- Go游戏服务器开发的一些思考(三十五):无缝世界场景构建与同步(二)
- Go游戏服务器开发的一些思考(三十二):关于无缝世界的一些思考
- Go游戏服务器开发的一些思考(十一):IO游戏同步
- Go游戏服务器开发的一些思考(十七):IO游戏同步(三)
- Go游戏服务器开发的一些思考(十四):IO游戏同步(二)
- Go游戏服务器开发的一些思考(五):goroutine看似美好的陷阱
- Go游戏服务器开发的一些思考(三十一):排行榜服务器设计思路(二)
- Go游戏服务器开发的一些思考(二十六):Go Redis ORM库
- Go游戏服务器开发的一些思考(二十五):Redis的Docker Swarm部署
- Go游戏服务器开发的一些思考(十三):behavior3go的一些坑(备忘)
- Go游戏服务器开发的一些思考(十五):gochart图表制作
- Go游戏服务器开发的一些思考(一):语言层面
- Go游戏服务器开发的一些思考(三十八):MMO游戏移动同步
- Go游戏服务器开发的一些思考(二十一):Go语言的两处脑残设定
- Go游戏服务器开发的一些思考(二):综合考察(上)
- Go游戏服务器开发的一些思考(十二):行为树behavior3go介绍
- Go游戏服务器开发的一些思考(七):Redis
- Go游戏服务器开发的一些思考(二十七):Go Redis ORM库(二)