中EN
概念页

游戏内调试工具

In-Game Debugging Tools

各子系统(渲染、动画、碰撞、物理、音频、网络、玩家机制、AI……)都有大量配置项,能在游戏运行时调整而无需改代码、重新编译链接再运行,可大幅节省调试和搭建关卡/玩法的时间。GEA 介绍支撑这一点的几类游戏内工具:游戏内菜单(及 Dear ImGui 等第三方 GUI)、游戏内控制台、调试摄像机与暂停/慢动作、作弊功能、截图与录像。(卷 I 10.3–10.7 节)

游戏内菜单(卷 I 10.3)

菜单项可以:切换全局布尔设置、调整全局整数和浮点值、调用任意函数(可在引擎内做任何事)、打开子菜单(层级组织便于导航)。菜单应能方便地呼出,如按一个手柄组合键(要选正常游玩中不会出现的组合,组合键检测见 引擎输入系统)。呼出菜单通常会暂停游戏:开发者可以玩到问题发生前一刻,呼出菜单暂停,调整引擎设置让问题更易观察,再取消暂停深入检查。

Naughty Dog 引擎(《最后生还者 重制版》):顶层菜单包含各主要子系统的子菜单;渲染子菜单下又有很多子菜单,进入 Mesh Options 可关闭所有静态背景网格只显示动态前景网格(书中图 10.8 借此找到了「那头讨厌的鹿」)。与配置文件、命令行等配置途径的关系见 引擎配置系统。

第三方 GUI(10.3.1):很多团队用第三方 GUI 库给引擎加菜单等调试设施,常见选择是 Dear ImGui——立即模式 (immediate mode) GUI:通过调用函数构建界面,每帧调用 ImGui::Begin() / ImGui::End() 画出可缩放窗口,中间调用 ImGui::Text()、ImGui::BeginMenuBar() 等添加控件;想让界面显示多久就每帧调用多久。

ImGui::Begin("Debug", &debug_active);
ImGui::Text("Hello, world %d", 123);
if (ImGui::Button("Save")) MySaveFunction();
ImGui::InputText("string", buf, IM_ARRAYSIZE(buf));
ImGui::SliderFloat("float", &f, 0.0f, 1.0f);
ImGui::End();

(项目地址 https://github.com/ocornut/imgui,书中所引。)

游戏内控制台(卷 I 10.4)

有的引擎提供游戏内控制台(代替或补充菜单):像 DOS 命令提示符或 csh/tcsh/ksh/bash 那样的命令行界面,可查看和修改全局引擎设置、运行任意命令。对打字不快的人不如菜单方便,但可以强大得多:有的只提供少量硬编码命令(灵活度与菜单相当),有的几乎能访问引擎的全部功能(书中以 Minecraft 的控制台为例)。若引擎有强大的脚本语言,而控制台「说」同一种语言,那么脚本能做的事都能在控制台中交互完成(脚本语言见第 17.9 节)。

工具优点缺点
游戏内菜单用手柄即可操作,方便;层级导航直观能力受预先定义的菜单项限制
游戏内控制台可非常强大,若接脚本语言则能做脚本能做的一切需要打字,不太方便

调试摄像机、暂停与慢动作(卷 I 10.5)

菜单或控制台最好搭配两项关键功能:(a) 把摄像机与玩家角色分离,在世界中自由飞行检查场景任一方面;(b) 暂停、取消暂停和单步游戏。暂停时仍要能控制摄像机:只要游戏逻辑时钟暂停时渲染引擎和摄像机控制继续运行即可。慢动作对审查动画、粒子、物理与碰撞、AI 行为等非常有用,实现也简单:只要所有玩法元素都用独立于真实时钟的时钟更新,让玩法时钟走慢就行;同理可做快进,迅速跳过耗时段落到达关注区域(作者调侃配上走调的 Benny Hill 音乐很搞笑)。时间线机制见 游戏时间线与时钟。

(注:原文此处写「单步见 8.5.5 节」,但 8.5.5 节讲的是断点处理,游戏时钟单步实际在 8.4.2 节;原文如此。)

作弊(卷 I 10.6)

开发调试时要允许为了效率打破游戏规则,即作弊 (cheats)。例如很多引擎允许把玩家角色「拎起来」在世界中飞行、关闭碰撞穿过一切障碍,飞到想去的地方再放回正常玩法模式,而不必真的玩到那里。其他常用作弊:无敌、给予任意武器、无限弹药(测试武器系统或 AI 受击反应时不必找弹夹)、选择玩家网格(多套「服装」时测试用)。也可以把一些作弊开放给最终玩家,通常通过在手柄或键盘输入未公开的作弊码和/或完成特定目标来激活。

截图与录像(卷 I 10.7)

  • 截图:细节因平台而异,通常调用图形 API 把帧缓冲内容从显存传到主内存,再转换为所选图像格式(.bmp、.jpg、.tga)写到预定文件夹,用日期时间戳命名保证唯一。常见选项:是否包含调试图元和文字;是否包含 HUD;捕获分辨率(有的引擎修改投影矩阵分别以正常分辨率拍屏幕四个象限,再拼成高分辨率图);简单摄像机动画(标记摄像机起止位置与朝向,逐步插值并连续截图)。
  • 录像:完整的录像模式以游戏目标帧率捕获截图序列,离线或运行时编码为 MPEG-2 (H.262) 或 MPEG-4 Part 10 (H.264)。引擎不支持时也可用外部采集硬件(如 Roxio Game Capture HD Pro),PC/Mac 上有 Fraps、Camtasia、Dxtory、Debut、Action! 等软件。
    • 原书问题:书中写「Camtasia by Camtasia Software」,Camtasia 实为 TechSmith 公司的产品(见 Wikipedia「Camtasia」条目、TechSmith 官网 About Us)。
  • PS5:内置分享截图和视频片段:游玩时持续录制最近 15 分钟,玩家随时按 Share 键保存到 SSD 或上传到在线服务。Naughty Dog 利用这一功能在每次崩溃时自动保存视频和截图,看清导致崩溃的情境。PS5 还支持直播;Sony 的 Remote Viewer 应用让开发者连接远程 PS5(同事桌上或工作室外)观看串流画面,甚至把 PS5 手柄插到自己 PC 的 USB 口远程操控——对「在我机器上是好的」这类问题特别有用,可直接在对方 PS5 上调试。
    • 原书问题(与官方资料并列):GEA 称 PS5 持续录制「最近 15 分钟」并按「Share 键」分享。PS5 的 DualSense 手柄上对应按键名为 Create(创作)键(取代 PS4 的 Share 键);PlayStation 官方支持页「How to capture PS5 gameplay and screenshots」说明「保存最近游戏画面」可保存最近 15 秒至 1 小时(15 分钟是 PS4 时代的缓冲长度)。
  1. Game_Engine_Architecture_4Ed_-_Jason_Gregory.pdf
  2. Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 I 第 10 章 10.3–10.7 节

相关页面

游戏开发日志与调试绘制Logging & Debug Drawing几乎所有专业团队都会为引擎打造一套调试与开发工具。本页记录其中最基础的两类:日志与追踪(格式化调试输出、详细级别、通道、镜像到文件、崩溃报告)和调试绘制(在游戏世界或屏幕上画线、形状和文字以可视化数学计算)。(卷 I 第 10 章 引言、10.1–10.2 节)游戏开发游戏内性能与内存剖析In-Game Profiling & Memory Tracking游戏是实时系统,要保持 30 或 60 FPS,同时受目标硬件内存限制。第三方剖析工具有局限、在主机上未必可用,所以许多引擎自带游戏内剖析器(手动插桩的代码块计时、层级关系、调用次数、导出 CSV)和内存统计与泄漏检测工具。GEA 讲解它们的实现要点和常见限制。(卷 I 10.8–10.9 节)游戏开发引擎配置系统Engine Configuration游戏引擎总会积累大量可配置选项:有的通过选项菜单暴露给玩家(画质、音量、手柄设置),有的只供开发团队使用、发售前隐藏或去除(如玩家最大行走速度在开发期可调、发售前改成硬编码)。GEA 讨论选项的存取方式(文本文件、压缩二进制、注册表、命令行、环境变量、在线档案)、全局与每用户选项,以及 Quake cvar、OGRE、Naughty Dog 三个真实例子。游戏开发游戏时间线与时钟Game Timelines & Clocks游戏引擎要同时处理多种「时间」:真实时间、游戏时间、动画片段的局部时间、CPU 周期等。GEA 用抽象时间线 (abstract timeline) 统一看待它们,并讨论帧时间 \Delta t 的测量方法、高精度计时器、时间单位与时钟变量类型的取舍,以及断点恢复后的异常 \Delta t 处理。(卷 I 第 8 章 引言、8.4–8.5 节)游戏开发引擎输入系统Game Engine HID System多数引擎不直接使用「原始」HID 输入,而是先加工(死区、滤波)使游戏内行为平滑直观,并在 HID 与游戏之间加至少一层间接(如按键映射表把原始按钮翻译成逻辑游戏动作)。GEA 列出引擎输入系统的典型需求并逐一讲解实现:死区、模拟信号滤波、按下/松开事件、组合键与序列手势、多设备多玩家、跨平台抽象、输入重映射、上下文相关控制与输入禁用。(卷 I 9.5–9.6 节)游戏开发 · UE5Gameplay 调试器与可视化日志Gameplay Debugger & Visual LoggerGameplay 调试器 (GDT) 用于在运行时实时查看玩法数据(Pawn、AIController、行为树与黑板、EQS、感知、导航网格),联网时客户端也能看,并且只复制已启用类别的数据。可视化日志 (Visual Logger) 则把 Actor 的状态和图形化信息录下来,之后在编辑器里按时间轴来回拖动查看,适合排查难以复现的 bug。游戏开发动画管线与动作状态机Animation Pipeline & Action State Machines低层动画管线把片段和混合规格变成局部姿势、全局姿势和蒙皮矩阵调色板;其上的动作状态机 (ASM) 给游戏代码提供"按状态驱动动画"的接口。每个状态是任意复杂的片段混合,跟踪当前所有片段的方式有扁平加权平均和混合树两种;过渡用数据驱动的过渡矩阵描述,控制参数通过节点搜索、命名变量或控制结构体暴露给代码(GEA4 卷 II 13.9–13.10)。游戏开发数据驱动与游戏世界编辑器Data-Driven Engines & Game World Editors当游戏行为可以部分或全部由美术和策划提供的数据控制,而不只由程序员写的代码控制时,引擎就是数据驱动的。它能提高团队效率、缩短迭代时间,但工具、健壮的运行时和预览手段都要花大量成本,过度设计反而降低生产力,所以要权衡并坚持 KISS。玩法领域里对应 DCC 工具的是游戏世界编辑器:创建世界块并放入静态和动态元素、设定对象初始状态和行为。GEA 列出了它的典型功能,并比较了不同引擎在何时做平台相关优化上的取舍(GEA4 卷 II 16.3–16.4)。游戏策划游戏测试Playtesting游戏测试是把幻想中的玩家体验拉回现实的"闹钟"。Schell 区分四种测试——焦点小组、QA、可用性测试、游戏测试——本章只谈设计师最关心的游戏测试:请人来玩,看游戏是否产生了它被设计要产生的体验。Schell 坦白自己讨厌测试(怕别人不喜欢自己的游戏),但这正是测试的意义。每次测试由六个问题定义:为什么、谁、何时、在哪、看什么、怎么做(第 3 版新增"何时"),并补充 WUBALEW、FFWWDD 等 Schell Games 的实用做法(第 3 版第 28 章 Good Games Are Created through Playtesting)。游戏美术动画抛光与调试Animation Polish & Debug第 13 章对应项目收尾:Alpha / Beta / RC / Gold 阶段动画职责,以及脚滑、pop、接触点、动量不一致、穿透等抛光清单;强调定向抛光、内存与压缩,以及一次只改一个因素的调试纪律。

输入关键词开始搜索

滚轮或双指缩放 · 拖动平移 · 双击放大 / 还原