状态同步的逻辑设计问题

服务器每秒都将游戏场景中的所有元素以数组的形式发送给客户端
[{guid: 0, x: 500, y: 100},
guid: 1, x: 500, y: 100},
guid: 2, x: 500, y: 100},
guid: 3, x: 500, y: 100},
]
客户端做了变量来接收数组, 如 let array = objectList;
客户端根据需要显示对应的元素,如:将guid:0 的元素根据位置XY显示到了场景中,即 array[0]

因为服务器一直都在发送数组到客户端,
而guid为0的元素创建的时候是通过 {guid: 0, x: 500, y: 100} 此对象创建的。
而服务器时刻都在将新的数组发送到客户端,如果服务器记录的guid0发生了移动,客户端的guid0元素因引用的并不是最新数组中的guid0数据,而无法知晓guid0发生了移动。
问题就是当这个数组变得很大时,如何以较为高性能的方式,将服务器传来的数组数据分发给每个场景中的元素,使其生效

变得很大代表两种情况,一同屏人数过多,二场景过大。同屏过多只能和策划沟通能否减少同屏人数,选择性显示同屏数量来控制。场景过大就选择场景分割成小块九宫格推送角色周边信息。另外服务器可以优化下那些没有变化的不必要数据同步这个看具体情况过滤减少通信消息。消息到了客户端如何通知UI更新这个最好有个分块机制层层定位避免大数组循环遍历。可通过guid设置一定规律将对象分组管理。这样能节省很大遍历的消耗快速定位要更新对象。

2赞

想来想去还是无法避免遍历数组,想了想还有个方案,遍历的时候先判断元素是否显示,如果显示了则发个通知,将数据发出去,又一想如果显示的过多,通知系统可能性能上会出问题

分组的同时合理使用map

服务器传来的对象数组,肯定是新的内存空间,而已显示元素使用的对象的内存空间似乎是没办法通过巧妙的方式直接连通对象数组,对象数组大小和顺序都无法确定的情况下,这个问题似乎只能用笨的方法了。

该主题在最后一个回复创建后14天后自动关闭。不再允许新的回复。