【问题标题】:Network Library for server side of a mmorpg (libuv/boost::asio?)mmorpg 服务器端的网络库 (libuv/boost::asio?)
【发布时间】:2013-04-22 13:19:22
【问题描述】:

我目前正在重写一个非常旧的 mmorpg 的服务器端,并且我正在寻找一个与 C/C++ 一起使用的好的开源网络库。

由于客户端已经存在,我不能使用任何强制某种数据包结构或通信的库(例如,RakNet)。

服务器将主要使用 UDP,在三个不同的端口上。

在网上搜索后,我发现了 boost::asio 和 libuv。

boost::asio 似乎是一个成熟的选择,因为我已经在使用 boost,但我读到他们的 UDP 实现有点差,并且由于某些原因,它无法实现多核处理器的最大性能使用 epoll 时的锁。

libuv 看起来不错,是事件驱动的,有大项目支持,但是目前还没有这样的项目使用它,所以我对使用它有疑问。

大家怎么看?我可以在这样的项目中使用 libuv,还是必须使用 boost::asio?我也对其他建议持开放态度(它们需要是跨平台的,我已经放弃了 enet、libevent 和 libev)。

【问题讨论】:

  • liblacewing 可能也很适合这个(在 Windows 上支持 epoll、kqueue 或 IOCP)。披露:我是主要开发者。
  • 很酷的项目,我会看看,但我很想使用 asio,因为我已经使用了 boost。
  • @RenatoUtsch 嗨,Renato,一年后,你选择了什么?你能给我们一些关于你的经验的回报吗?谢谢

标签: c++ boost network-programming boost-asio libuv


【解决方案1】:

libuv 或 Boost.Asio 都可以。我在实时和近实时应用程序中观察到库之间的相似结果。

如果您使用 Boost.Asio,请注意:

  • 如何最小化handler memory allocation的数量。
  • 可以通过向io_serviceconstructor 提供 1 的 concurrency_hint 来消除 io_service 锁定。但是,这不会阻止反应器内的锁定。

根据我的游戏开发经验:

  • 如果网络功能通过接口或队列提供给游戏代码,那么在一个基于事件的库与另一个基于事件的库(例如 Boost.Asio 和 libuv)之间进行交换是相当简单的。李>
  • 服务器架构的影响远大于网络代码本身。 Boost.Asio 和 libuv 都提供 IPC 功能,可能对多守护程序服务器架构有用。

虽然这两个库之间存在一些重叠,但可能值得阅读 this 的比较。

【讨论】:

  • 但是如果我将concurrency_hint 指定为 1,那么 io_service 将仅在单个线程上运行。那我该如何利用多线程呢?感谢您的比较,它真的很有帮助。
  • 您可以使用多个io_service 对象。这种方法类似于 libuv,因为 libuv 支持多个事件循环,但它不支持从多个线程运行相同的循环。使用 Boost.Asio,如果不设置 concurrency_hint,那么多个线程可以安全地为事件循环服务。
  • 但不设置 concurrency_hint 会导致反应器出现锁定问题。好,那我就根据处理器的核数来启动各种io_service对象。我在读到 asio 的 UDP 实现不是很好,是真的吗?如果它有所作为,我将不得不使用 libuv。你知道吗?
  • “非常好” 是主观的,但 Boost.Asio 的 UDP 套接字使用与其 TCP 套接字相同的服务,而且我还没有让套接字服务成为瓶颈。旧版本有一些开销,特别是在反应器内的事件注册,但 Boost.Asio 在其整个开发过程中一直在进行各种性能优化。虽然 libuv 可能会更快,但我在 mmorpg 开发方面的经验是 Boost.Asio 和 libuv 之间的差异通常可以忽略不计。最终限制最大性能的往往是服务器架构。
  • 感谢大家的帮助,我会选择 asio,因为我已经在使用 boost。
【解决方案2】:

libevent 非常好,令我惊讶的是你放弃了它。 ZeroMQ 相当不错,但对 Windows 的支持略有限制。 RabbitMQ 在 SF 被我的一个恶魔所害。

Boost.asio 也很不错。由于您似乎仅限于 c++,所以我正在使用 libevent,它在网络延迟和响应网络方面应该远远超过我工作过的其他 MMO 游戏,但它确实需要 tcp。

【讨论】:

  • libevent(和libev)的问题是他们的windows支持不是很好。除此之外,它确实看起来非常好。然后我找到了 libuv,它是作为 node.js 上 libev 的“替代品”而制作的,声称速度更快并且支持 Windows。我真的很想使用它。你有过这方面的经验吗?
  • 另外,你说“它确实需要 tcp”是什么意思?我不能只使用 UDP 吗?
  • libevent 看起来很棒......我在这里使用它大约 2 个月了,它非常敏感。对 libevent 的最佳支持是 tcp。然而,有一些支持......只是不是你需要的东西,比如数据包排序和保持活力。 IOW,您需要像在常规 udp 中一样实现这些。此外,您可能会喜欢阅读此链接。 stackoverflow.com/questions/11361208/…
  • 嗯,是的,我没有太多选择,因为我正在为闭源客户端制作服务器。谢谢你的帮助,我会去asio的。
猜你喜欢
  • 1970-01-01
  • 2018-03-07
  • 1970-01-01
  • 1970-01-01
  • 2016-03-10
  • 1970-01-01
  • 1970-01-01
  • 2012-03-07
  • 1970-01-01
相关资源
最近更新 更多