【问题标题】:How to send information fast like many games do?如何像许多游戏一样快速发送信息?
【发布时间】:2011-01-21 07:33:40
【问题描述】:

我在想反恐精英、魔兽世界等游戏使用的方法。在 CS 中,您通常只有 50 次 ping,有没有办法以这种速度将信息发送到在线 MySQL 数据库?

目前我正在使用我的程序请求的在线PHP脚本,但这真的很慢,因为程序首先要向它发送标题和帖子信息,然后将结果作为普通网页检索。

真的必须有更简单、更快捷的方法吗?我听说过 TCP/IP,这是我应该在这里使用的吗?是否有可能比间接通过 PHP 脚本更快地连接到数据库?

【问题讨论】:

  • 这是标记为 c#,但您使用的是 PHP?

标签: c# database tcp packet


【解决方案1】:

TCP/IP 由三个协议组成:

  1. TCP
  2. UDP
  3. ICMP

ICMP 是您在网络上 ping 另一台计算机时使用的。

像 CounterStrike 这样的游戏并不关心你以前做过什么。所以对完整性没有要求,能够重建你所做的事情(这就是为什么竞争对手必须记录他们正在做的事情)。这就是 UDP 的用途——不能保证数据的传送或接收。这就是为什么滞后会成为一个问题的原因——你已经死了,只是你不知道而已。

TCP 保证数据的发送和接收。比 UDP 慢。

要实现快速连接,需要注意许多事项 - 更少的跃点等。

【讨论】:

  • +1 说得好 - 我知道 UDP 是“无连接的”并且无法保证交付......但我从未考虑过性能提升的潜力......非常好! (+1 你也 kyoryu)
  • 通常,游戏会在 UDP 之上为需要接收且不会“过期”的消息构建可靠性层。因此,移动更新将不可靠地发送,而死亡消息或聊天等内容将可靠地发送。
【解决方案2】:

像您引用的游戏一样,大多数游戏都为此使用 UDP(TCP/IP 协议套件之一)。此应用程序选择 UDP 而不是 TCP,因为它重量更轻,可以提供更好的性能,并且不需要 TCP 的可靠性功能.

但请记住,这些游戏具有通常用 C 或 C++ 编写的独立客户端和服务器。如果您的应用程序是基于浏览器的,并且您正尝试通过 HTTP 执行此操作,那么请使用长期连接并尽可能去除标头,包括 cookie。你可能会对Tornado 框架感兴趣。您可能还想查看HTML5 WebSockets,但是距离广泛的支持还有很长的路要走。

如果您的目标是基于浏览器的插件,例如 Flash、Java、SilverLight,那么您也许可以使用 UDP,但我对这些平台的了解还不够,无法确认。

编辑:

另外值得一提的是:一旦你的网络代码和协议被充分优化there are still things you can do 以改善高 ping 玩家的体验。

【讨论】:

    【解决方案3】:

    用于延迟关键的东西的客户端到服务器?使用非阻塞 UDP。

    对于可能会慢一些的可靠数据,如果您使用 TCP,请确保以非阻塞方式(select()、非阻塞发送等)执行此操作。

    使用 UDP 的主要原因是如果您有时间敏感的数据 - 如果某个小动物的位置丢失,您最好忽略它并发送下一个位置数据包,而不是重新发送最后一个数据包。

    而且我不认为任何高性能游戏都会将每个调用都解析为对数据库的调用。更常见的是(如果甚至使用数据库)偶尔或在重要事件中持久化数据。

    你不会在 http 之上实现 Counterstrike 或类似的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多