您的位置:首页 > 编程语言 > Go语言

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
b1
c1 2 3
d3
e3 4 5
f5
g5 6 7
h7
i7 8 1
这些外接关系,可以在整个服务器组启动完毕后,完整初始化掉。

即Cell启动初始化完毕后,都可以知道自身的每个area外接哪些Cell;以及这些Cell的信息

至此整个场景就可以完成构建。

即上述这些基础,能够做下面的事情:

Cell知道什么时候,实体需要在其他Cell上的创建或销毁

关于实体创建、销毁等应该很清晰,不再讲述了。

实体同步



如图, 实体A、B、C的实例分布

实体实例需要有Master、slave之分。

如何做主从切换,后续章节再介绍。

野怪优化

上述实体同步,是允许战斗的,但是毕竟涉及到不同服间的消息同步。因此应该仅量减少这样的战斗发生。

比如野怪刷新这种东西,最好限制在 area a区域即可。

这样可以确保 边界上的 战斗有更小的压力,更好的体验。

不规则区域组成的世界

在现在的正方形分割的基础上,可以通过多个正方形合并,并计算边界area的外接Cell即可。

详细 下一篇文章 介绍。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐