【问题标题】:Appropriate architecture for event logging in a game游戏中事件记录的适当架构
【发布时间】:2015-01-05 12:09:56
【问题描述】:

我正在尝试修改游戏引擎,使其记录事件(如按键),并将这些事件存储在远程服务器上的 MySQL 数据库中。游戏引擎是用C++编写的,我目前有如下简单的架构,使用mysql++直接INSERTrecords到合适的数据库:

不幸的是,连接到 MySQL 服务器时的开销非常大,并且游戏会停止很长时间。将一批价值 Xs 的事件推送到服务器会导致游戏严重延迟(价值 60s 的事件可能需要 12s 才能同步)。公开访问 MySQL 端口显然也存在安全问题。

我正在考虑另一种选择,而不是向服务器发送命令,它可以在自己的时间与数据库交互:

这里游戏只会发送必要的信息(例如要更新的表和要插入的数据)。我不确定速度提升是否足够,或者哪个系统适合管理游戏发送的命令。

Someone else suggested Log4j,但显然我需要一个 C++ 解决方案。是否有合适的现有框架来完成我想要的?

【问题讨论】:

标签: c++ mysql events game-engine


【解决方案1】:

大多数收集用户界面交互数据(在您的情况下为击键)的应用程序将其放入某种本地文件中。

然后在适当的时间(例如在游戏结束或另一场游戏开始时),他们将该文件(通常以压缩形式)发布到可公开访问的网络服务器。 Web 服务器上的软件解压数据并将其加载到分析系统(在您的情况下为 MySQL 服务器)进行处理。

所以,我建议如下。

  1. 停止将您的 MySQL 服务器端口提供给您不认识和不信任的人。
  2. 让您的游戏以某种方式在本地收集击键。
  3. 当您的游戏未处于实时模式时,让它大量上传数据。
  4. 编写一个 Web 服务来接收和解释这些文件。

这样您将构建更安全的分析系统和响应速度更快的游戏。

【讨论】:

  • 我同意这一点。此外,如果游戏已经具有客户端-服务器架构,则服务器无论如何都应该验证用户命令,因此它也可以将它们记录在进程中。除非目标是记录本地输入而不是从输入生成的命令。在这种情况下,只需在输入状态中记录更改和时间戳,以将记录保持在最低限度。
猜你喜欢
  • 2021-07-11
  • 2011-07-24
  • 2016-04-01
  • 2018-11-18
  • 2017-08-22
  • 2020-01-25
  • 2012-12-12
  • 1970-01-01
  • 2011-01-06
相关资源
最近更新 更多