调试


游戏的编程阶段,无论是使用代码还是拖放模块,都非常容易犯错误 - 使用错误的变量,传递错误的参数或使用错误的函数是我们所犯的一些最常见的错误 - 脚本/动作编辑器附带的语法检查器并不能没有遗漏地检测到这些错误。这意味着,这些错误只有在你实际运行或编译游戏时才会变得明显,即使这样,有时也难以准确地知道出现的问题是什么。因此,及时了解你的游戏在所选设备上的表现,以及房间中的实例,所创建的全局变量以及其他详细信息,是至关重要的。

现在,你可以通过在游戏中添加所谓的“调试代码”,来在屏幕上显示所需的信息,或者你可以使它在出现错误时显示消息,这样可以自己检查这些信息,但是这通常会极大地增加工作量,如果你不确定问题在哪里,那么你可能在尝试和错误的追踪错误上耗费大量时间。对此,GameMaker Studio 2 提供了一个被称为 调试模式 的特殊测试模式,它将启动 调试模块 以及一个全面的错误报告系统,可在运行时显示信息,以帮助你跟踪游戏中出现的问题。

以下内容为你可使用的调试游戏的不同方式:

当在编译和执行项目时发生错误,会在 编译错误输出窗口 中显示一条消息,如下所示: 编译错误

大多数编译器错误消息遵循相同的模式,其中包含一条消息,指示物体发生错误,然后是事件与行号,最后简要描述错误本身。 错误报告提供的信息非常重要,因为它会检测并报告导致游戏崩溃的语法和语言相关的错误,但不会报告更多的细微错误,也不会给出修复反馈。 对于此类型情况你应该使用 调试模式(下一点即为该模式的详细解释)。

除了这些编译错误,你的游戏还可能有语法错误。当你添加 DnD™ 操作或代码时,将会检测到这些操作,并显示在 语法错误输出窗口 中,与下图所示相似: 语法错误

与编译器错误一样,语法错误窗口将引导你找到物体,事件和出现问题的特定行,并且通常也会简要说明错误是什么。


如果你需要更详细地检查,可以通过单击调试运行按钮在调试模式 下运行游戏。当你这样操做时,调试模块 将随你的游戏一起打开。该模块允许你监视游戏中从全局性能到各个变量值的一切工作。 你可以从以下页面中找到有关调试模块的更多信息以及如何使用它们:

  1. 调试模块

请注意,当你使用调试模块时,你还可以添加 断点 到你的代码或 DnD™。断点是游戏循环中你希望调试模块暂停,并让你手动遍历实际游戏代码的一个点。 你可以使用快捷键 F9 添加断点,它们将显示在 输出窗口 中,你可以根据需要启用/禁用它们。


当运行游戏进行调试时,你还可以通过使用 调试模块 中的 配置 选项来了解游戏的运行情况,并了解所有部件是否运行一致。 它将提供有关游戏运行情况以及执行特定功能调用或事件所需要时间的非常详细的信息(有关详细信息,请参阅 调试模块 一节)。 但是,这要求调试模块正在运行,这可能不是你所希望的,尤其是如果你希望测试设备上的最终可执行文件...

在这些情况下,作为分析器的补充,你可以在游戏中显示 调试状态条,这将显示游戏正在使用的内存量,CPU 功率和 GPU 功率。

调试状态条

此调试条在实际的游戏窗口中显示了 CPU / GPU 使用情况的帮助图示,并且可以使用函数 show_debug_overlay() 在游戏中切换开关。这个显示栏被分成几个部分,每个部分代表 1/60 秒。从下面的图像可以看出,显示条由各种颜色组成,每一种颜色都代表游戏性能的一方面,显示条越长,则该方面需要的时间越多,游戏性能受到的损失也更大:

  • 绿色 - 输入/输出处理(即:键盘,鼠标,游戏手柄,网络等)

  • 红色 - 步事件的更新速度

  • 黄色 - 绘制事件所需的时间

  • 橙色 - 调试更新时间,在使用调试模块时通常只能看到该部分

  • 白色 - GPU 剩余时间,这是 GPU 在下一个画面可以开始渲染之前完成当前画面渲染所花费的时间

  • 青色 - 文字渲染时间

  • 灰色 - 清除屏幕每个绘制步骤所需的时间

  • 深红色 - GPU 刷新,即 GPU 从存储器中清除图像所需的时间

除了彩色的显示条,顶部还有几个值。这些值所表示内容如下:

  • FPS - 这是你的游戏的“每秒帧数”,基本上代表了你的游戏的运行速度。这个值 能完全决定游戏的游戏速度,而是显示当你游玩时还有多少性能剩余。与你的游戏速度相比,该值越大,你的游戏将可以运行越流畅,并有更多性能剩余来让你添加更多东西。请注意,该值在某一段时间可能有很大的变化,但是当你关闭游戏时,GameMaker Studio 2 中的编译器输出窗口将显示最小值和最大值以及平均值(请注意,最小值 可以 为负数!这不是一个错误,而是由于启动时间和游戏在初始化时被处理的方式所导致的)。

  • 纹理交换 - 这个数字显示你的游戏每个游戏帧(该时间是 GameMaker Studio 2 运行所有事件的统一时间,每秒钟的游戏帧数由房间速度决定)交换纹理的次数。纹理(精灵和背景)存储在纹理页面上,如果你的游戏中有很多图像资源,那么 GameMaker Studio 2 必须在纹理页面之间进行交换以将其全部绘制,因此如果该值很高(例如超过20),那么你真的需要研究如何优化它,因为该值过高会影响你的游戏性能,特别是在移动端。

  • 顶点批次 - 这是每个游戏帧游戏将纹理批次发送到GPU的次数,以及(与纹理交换)一样,你会希望这个值尽可能低。纹理批次,基本上是一组数据,一次性发送到GPU进行渲染。当你更改字体,颜色,混合模式或影响全局绘制效果的任何其他绘图状态时,该批次将被“破坏”,因此你应该尝试将这些行为尽可能限制,否则批次数太大将对你的游戏性能产生不利影响。

注意: 纹理交换和顶点批次永远不会为零,通常会显示2或3,因为即使空房间内没有物体,GameMaker Studio 2 仍然需要绘制和批处理。

使用这些工具,你可以看到游戏的表现如何,以及需要“调整”哪些方面才能提高游戏的性能。你可以在 YoYo Games 帮助中心 - 优化你的游戏 中找到有关性能问题和优化游戏的方法的更多信息。

作为调试编译游戏的附加工具,当你在Window上运行最终游戏包时,可以使用某些 命令行参数。有关工作原理的信息,请看 这里