Featured image of post 游戏内测抓出了什么BUG

游戏内测抓出了什么BUG

「可是,在我自己电脑上能跑啊?」

作为非科班出生、无完整软件工程经验、第一次做游戏的单人开发者,我最恐惧的事情就是,别人下载了游戏,却玩出了死机之类的恶性BUG。

周围朋友多半用苹果。很多次有人问我,为什么游戏不出Mac或者Linux版。答案很简单,我怕出BUG。

Steam上,超过95%的用户使用Windows。而据前人经验,玩家提交的80%的BUG都来自于Mac和Linux。我不用苹果系统,也没在Linux上玩过游戏……对这些运行环境一无所知。

Steam用户操作系统分布

我之前对软件包依赖管理的理解,仅仅停留在Python的requirements/peotry/conda,以及一丁点儿docker上。而这些知识对windows游戏环境的系统兼容性、硬件差异、运行时依赖没有帮助。

会不会有一些我自己电脑无论怎么测试都发现不了的BUG?游戏内测几周下来,这类BUG还真不少……记录一下新手踩的坑,供其他开发者一笑。

问题都比较技术细节,可能仅对使用Godot游戏引擎的人有用。

以下都是「仅在游戏导出后或在别人电脑跑上时」才会出现,游戏引擎编辑器内无法复现:

(前三个会直接导致程序卡死)

  • Godot编辑器用缓存掩盖了资产文件缺失
    • 在本地不小心删了某动画资产。但Godot的缓存默默补上了,所以错误只有在运行导出的游戏exe到读取那份资产时才会暴露
    • 这个很难提前察觉,已经不记得什么时候手抖删过,动画资源也不进Git所以我diff看不见。只能在别人那里报错后,从日志中看出来
    • 感觉Godot应该警告一下这类只有import文件但资源文件本身不存在的情况
  • 资源的文件路径在导出后发生改变
    • Godot导出游戏后,在某些电脑上会改变资源文件夹结构,从而找不到资源。(在某些电脑上,它又不会变……)
    • 我在两处代码误用了FileAccess.file_exists函数检查某资源是否存在
    • 应该用ResourceLoader.exist,这个函数考虑到了资源文件夹结构可能的改变
    • FileAccess.file_exists应只用来检查游戏安装路径以外的用户数据文件夹(如存档、设置文件)
  • 有一个场景的文件名大小写错了
    • Windows平台本身不区分文件名大小写,所以Godot编辑器里没问题,但Godot导出后的运行时环境区分大小写
  • 在人物移动时,人物精灵图或背景图发生抖动,而不是平滑移动
    • 这个在我自己的三台显示器上要么不出现,要么不明显,要么偶尔随机出现。但测试者发来的视频里抖得触目惊心
    • 在调试过垂直同步、全屏模式、帧数限制、物理插值设置、检测显示器刷新率、Phantom Camera插件等等一长串可能性且无果后……
    • 最终的可靠解决方案是被资深开发者们诟病嘲笑的「直接将物理帧率设为当前显示器刷新率」(因为人物移动使用了_physics_process
    • 我没有想到2D游戏的屏幕抖动/撕裂会有这么多影响因素。特别是Godot 4.3已经重新实现物理插值之后。
  • 对话系统的单行命令紊乱或重复
    • 这个是开源的YarnSpinner-Godot对话系统自己的线程和编译相关问题,且问题只有在C#项目导出后才显得严重突出。
    • 它的最新版本已经彻底重写了出问题的部分,但由于我在很久以前fork的版本上改动较多,升级的成本非常高……
    • 于是,最后写了三处老版本的补丁以大大减少对话紊乱或重复的触发可能性
    • 这是唯一一个发现了但我却无法彻底消除的的bug。会以极小概率随机出现。打补丁后,已不影响正常游戏流程。
    • 头撞南墙地学到了一个软件工程101就会教的东西:千万别用不稳定的包作为自己游戏的核心系统。

万幸的是,内测中发现的其他BUG都相对微小。真的要特别感谢前几位参与内测的朋友,把上述恶性坑踩过一遍,才让后来者有了顺畅的游戏体验。

主题 StackJimmy 设计