1

一直在阅读有关该主题的一些信息,出于好奇,在线游戏维护了一个列出游戏的“游说”系统;
他们如何使每个客户端与当前游戏列表状态保持同步?

我说的是“客户端要求更新游戏列表”的术语,而不是事件驱动的术语(游戏的状态发生变化并立即广播它<---不可扩展!)。

可能的场景:
一台服务器拥有 5000 个与在线玩家的连接。
它有一个包含 1000 个游戏的列表。
客户要求每隔一秒更新一次游戏列表。
现在服务器需要遍历所有游戏列表并比较每个特定游戏的最后更新时间,然后如果它看到玩家的最后更新较旧,它将发送更新。
这意味着每一秒都会有 (5000 * 1000 = 5,000,000 )次迭代

有什么实用的方法可以避免吗?
你已经这样做了吗,可以和我分享一个小费吗?

我一直在考虑有一个缓存。你的解决方案是什么?

4

2 回答 2

2

首先,每秒进行 500 万次比较不会对现代硬件造成明显的负担。假设在 1 GHz Cpu 上进行比较需要 10 个周期。那么这将导致仅 5% 的 CPU 负载。当然可以很容易地优化它,但我们还有更重要的事情要做,不是吗?

一个更可能的瓶颈是网络带宽。我真的需要每秒向每个客户端传输大约 1000 个游戏的数据吗?让我们假设每场比赛有 100 字节的数据。这相当于每个玩家大约 1MBit 的带宽。

幸运的是,客户不需要了解每场比赛。一个典型的模式是用户说明他想要哪些游戏(例如按游戏类型),客户端将此过滤器发送到服务器,服务器只发送匹配的游戏。

于 2010-06-05T01:05:11.070 回答
1

您可以颠倒顺序:每当您的游戏列表更改时,您都会向所有客户发送更新。

如果您想节省带宽,您应该创建一个小的更新数据包,其中仅包含与上次发送的更新不同的信息,并带有int您的游戏的 id,这将很容易。

保持所有客户同步到同一个大厅状态,也是因为这是您需要做的。为什么您在发布通用列表时要关心不同的时间?

于 2010-06-05T01:03:36.310 回答