大家好。过去几个月,我一直在开发一款名为Eldir Online的MMORPG游戏。这是一款老派的MMORPG游戏,注重探索、战术战斗和角色多样性。

前两天,也就是5月29日,我在建立一个非常谦逊的社区的基础上,开启了游戏的试玩。我的同伴和我测试了游戏,以确保没有明显的破坏性问题。但是,当有超过3个玩家在线时,服务器的表现仍然很不稳定。

游戏的初期启动也有一点点的波澜。发射测试前大约30分钟,我发现部署的服务器上游戏的性能非常糟糕。地块没有正确加载,我的角色在世界中来回跳动。

说我有点紧张可能还不足以形容。玩家们都在期待游戏的上线,所以我急忙去找原因。应该说,我应该早些确保游戏的性能和稳定性,但我也在忙着修复其他一些小问题。

幸运的是,我在发射前10分钟左右解决了问题。原因是游戏的后端通过Cloudflare代理,而我在禁用代理后问题似乎就解决了。

然而,在游戏上线后不久,我就发现玩家们尝试创建新角色时会遇到相同的问题。

https://preview.redd.it/87j0sk5y1i4h1.png?width=536&format=png&auto=webp&s=afbaf8b1f8f37604d7c3433e9f382ca22a3fd292

后来我发现我没有正确配置Caddy来重定向新用户的认证请求到新的后端。

最终,玩家们终于可以上线了。

https://preview.redd.it/42nkadna5i4h1.png?width=700&format=png&auto=webp&s=0b2d13bd16e34e0e939307ca0b56d204e97d94db

在修复了这个问题后,游戏的性能和稳定性明显改善。但是,仅仅过了一个天后,另一个灾难性问题又出现了。玩家们的进度全部丢失,回滚到几个小时前的状态。有些玩家甚至失去了大量经验值、道具和徽章。

我立即退还了所有丢失的物品和经验值,并暂时关闭了服务器,以便调查问题的原因。这时我想,玩家们一定会失去兴趣的。

由于角色保存的日志非常有限,我发现数据库插入语句超时,或者在没有可识别原因的情况下关闭。另一个根源问题是服务器仅在玩家登出世界时才保存角色状态。如果保存过程中出现问题,角色将回滚到最后一次登出时的状态。

我通过以下措施来解决这个问题:

  • 在玩家断开连接时,保存玩家的状态到内存中,直到状态成功保存到数据库。
  • 将所有单独的插入和删除语句合并为一个批量插入和一个批量删除,减少对supabase API的请求次数,显著减少保存角色状态所需的时间。
  • 实现定期保存角色状态(每90秒一次),以防止角色在最坏的情况下回滚太多。

之后的热修复后,游戏的性能和稳定性似乎没有太大的问题,除了其他一些bug和问题外。

玩家们对游戏的反馈非常理解,并承认这只是试玩阶段,所以问题是正常的。

社区对游戏的反馈和建议非常有价值,我已经将它们采纳到我的开发路线图中。我的主要优先任务是解决反馈和问题,而不是继续开发新的内容和功能,直到游戏从预发行阶段进入测试阶段。

试玩后不久,我还实现了基本的玩家位置跟踪,以生成一个热力图,帮助我了解玩家的行为、他们的移动路径和游戏设计。

https://preview.redd.it/lnuvs8ug2i4h1.png?width=1134&format=png&auto=webp&s=ff9ce6cccaf960dc926e79925a3fcdbf01253ee3

事后,我想我应该早些做这个,因为我错过了很多有价值的数据,特别是在游戏的前几个小时。然而,我仍然认为它带来了很大的价值。

回顾性思考

说实话,游戏的上线比我预期的要好。玩家们的反馈非常积极,我还担心游戏会在玩家们登陆后立即爆炸。

我学到了很多东西,希望这些经验能帮助其他开发者:

  • 测试所有内容并确保游戏在上线前能正常运行,不要像我那样在上线前10分钟才解决问题。
  • 添加足够的日志和调试功能,以便在游戏出现问题时可以快速定位和解决问题。
  • 数据非常重要,它可以帮助你改进游戏,了解玩家的行为和游戏设计的不足。尽量捕获更多的数据(但不要太过intrusive)。
  • 游戏试玩的玩家们通常是来支持你的,而不是来批评你的。要对他们的反馈和建议做出响应,并解决他们可能关注的问题。

这些经验可能在事后看来很明显,但是在开发过程中,容易陷入自己的思维模式,或者在压力下匆忙解决问题,希望避免后来的麻烦。虽然有些问题可能会在未来解决,但现在解决它可能会避免后来的更大问题。

如果您感兴趣的试玩游戏,请访问https://eldironline.com/。我正在向注册试玩的玩家发送测试码。