有了客户端的无限大地图,服务器端也可以做做尝试了,服务器比客户端单纯了很多,不用做裁减等复杂的计算工作,但是要维护大量的信息通讯,最棘手的问题就是,如何让“身边”其他玩家知道你在哪里,player数量那么巨大,如果所有的player的状态通知所有的人那就是n的n次方的通讯,可以看来这样的通讯方式是完全不合理的,所以如何确定“身边”这个概念就至关重要了。
有了客户端无限大地图的实现,这个思路就豁然开朗了,有个图例:
把服务器打上格子,把整个地形来个定义
定义为 blocks_Tx_Ty_Bx_By
Tx Ty 代表的是 Tile的第几行第几列
Bx By 代表的是该Tile下Block的第几行第几列
把每个block的范围给筐定,这个可以事先计算出来的,很简单
人物一旦发生了移动就会发出udp的信号,服务器改变每个人物所在的位置
那么客户端的Role(玩家所操纵的角色)最关心的是周围9个tile里面活动的其他玩家的信息
因为客户端要进行视锥剪裁,
反过来说,角色A移动了,就要通知周围9个tile里面所有的角色,你当前的位置
另外,移动的时候还要看你所在的block发生了改变没有,如果发生了改变,这个信息也要发出去
那么客户端可以更新所观测的角色所在的block,这样客户端的tile作culling和rending以及collising的时候就方便了
客户端要作的只是简单的terrain.AddSenceModel 和 terrain.RemoveSenceModel就能动态更新block中的角色模型了
一个block好歹也有33x33,被观测对象只有block改变了才会做(terrain.AddSenceModel 和 terrain.RemoveSenceModel)这样的操作
这样的操作应该不会特别频繁,客户端应该开销的起
客户端,应该存在一个可观测的9个tile的rolelist,每次发过来的其他玩家的udp positionpack还是要作即时更新的。
目前根据这个思路我就要开展工作了,效率是至关重要的。
按照这个工作实现了再来测试效率,预计本周之内搞定角色之间位置信息的相互通讯。
激动人心的时刻就要到来了。。。。。。
目前只是尝试,更多的细节和感受我会逐步发放上来。