Quake引擎指示器

Fabien Sanglard 新闻

摘要

Quake引擎中四个隐藏的诊断指示器(TURTLE、RAM、DISC、NET)的技术文档,说明其用途及如何帮助开发者诊断性能问题。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/05/16 03:34

# Quake Engine 指示器 来源: https://fabiensanglard.net/quake_indicators/index.html 2025年11月24日 Quake Engine 指示器 --- 我曾在修复 Chocolate Quake 网络代码中的一个 bug(https://github.com/Henrique194/chocolate-quake/issues/59)时工作。问题是一个边界情况:在同一台机器上启动两个客户端,第二个会导致第一个“僵尸化”。当 bug 发生时,并未断开连接,但客户端无法再移动,取而代之的是屏幕左上角会出现一个看起来像未插网线状态的“指示器”。 [](https://fabiensanglard.net/quake_indicators/quake_640.png) 随着我深入代码,发现还有更多这样的指示器。它们位于 `pak0.pak` 内部,嵌套在 `gfx.wad` 中,文件名为 TURTLE、DISC、RAM 和 NET。我找不到任何关于这些“指示器”的资料,所以在此记录下来。 ## TURTLE --- [](https://fabiensanglard.net/quake_indicators/TURTLE.png) 当帧率低于 10 fps 时,*TURTLE* 指示器会显示在屏幕上。它不太可能是为玩家设计的,而是为 id Software 的开发人员准备的。程序员可以看到引擎哪些地方不够快,更重要的是,地图设计师可以查看地图特定区域的多边形是否过多。 *TURTLE* 指示器可以通过命令 `showturtle 1/0` 启用/禁用。相关代码全部在函数 SCR_DrawTurtle(https://github.com/id-Software/Quake/blob/bf4ac424ce754894ac8f1dae6a3981954bc9852d/WinQuake/screen.c#L362)中,其中 `host_frametime` 是绘制上一帧所花费的秒数。 在 Quake 2 源码中也有一个(https://github.com/id-Software/Quake-2/blob/372afde46e7defc9dd2d719a1732b8ace1fa096e/client/cl_scrn.c#L412C30-L412C44)`scr_showturtle`,但它不起任何作用。 图标实际上描绘的不是海龟(turtle),而是陆龟(tortoise)。海龟在水中游泳,而陆龟在陆地上行走。 ## RAM --- [](https://fabiensanglard.net/quake_indicators/RAM.png) Quake 并不会直接用纹理和光照贴图渲染多边形,而是将两者合并成一个“表面”(surface),然后送入光栅器。表面在使用后不会被丢弃,而是被缓存起来,因为下一帧很可能需要同样的表面。 *RAM* 指示器用于警告:当引擎从缓存中驱逐掉在同一帧内生成并缓存的表面时(就会亮起)。这意味着地图的几何结构迫使引擎超出了其表面缓存容量。在这种条件下,渲染器会进入灾难性的“死亡螺旋”,不断驱逐当前帧后续还会用到的表面。不用说,帧率会受到严重影响。 这很可能是为地图设计师准备的功能,用来提醒他们场景超出了 Quake 所分配的表面缓存内存量(https://github.com/id-Software/Quake/blob/bf4ac424ce754894ac8f1dae6a3981954bc9852d/WinQuake/d_surf.c#L35)。更多细节可以查看检测颠簸的 D_SCAlloc(https://github.com/id-Software/Quake/blob/bf4ac424ce754894ac8f1dae6a3981954bc9852d/WinQuake/d_surf.c#L130)。 与龟形指示器类似,这个指示器也可以通过命令 `showram 1/0` 启用/禁用。 ## DISC --- [](https://fabiensanglard.net/quake_indicators/DISC.png) *DISC* 指示器包装了通过 `Sys_FileRead`(https://github.com/id-Software/Quake/blob/bf4ac424ce754894ac8f1dae6a3981954bc9852d/WinQuake/common.c#L1574)进行的硬盘访问。它不太可能是开发者用来诊断问题的,因为它的屏幕位置与 TURTLE 指示器重叠。它只是用来给玩家反馈游戏正在加载。 由于当 `Sys_FileRead` 返回时图标会隐藏,所以看到它在屏幕上闪烁是正常的(而且看起来也蛮酷的)。这个指示器的代码在 Draw_BeginDisc(https://github.com/id-Software/Quake/blob/bf4ac424ce754894ac8f1dae6a3981954bc9852d/WinQuake/draw.c#L882)中。 ## NET --- [](https://fabiensanglard.net/quake_indicators/NET.png) *NET* 指示器在客户端超过 300ms 没有从服务器接收到任何数据包时显示。这很可能是为玩家设计的,帮助他们判断自己的连接有多差(在那个通过 PPP 调制解调器拨号上网的时代,远程服务器很容易有 500ms 的 ping 值),或者是否已经完全与服务器断开连接。 该指示器的代码在 SCR_DrawNet(https://github.com/id-Software/Quake/blob/bf4ac424ce754894ac8f1dae6a3981954bc9852d/WinQuake/screen.c#L387)中。 NET 指示器在 Quake 2 中仍然存在并处于活跃状态。代码仍在 SCR_DrawNet(https://github.com/id-Software/Quake-2/blob/372afde46e7defc9dd2d719a1732b8ace1fa096e/client/cl_scrn.c#L442)中,但图像不再存放在 wad 文件中,而是存储在 `pak0.pak` 的 `pics/net.pcx` 路径下。 ## 综合 --- 下面是一个糟糕的用户体验场景:帧率导致引擎颠簸其表面缓存,帧率下降到 10 fps 以下,并且引擎最后一次从服务器接收数据包已经是 300ms 之前了。 [](https://fabiensanglard.net/quake_indicators/quake_all_together.png) ---

相似文章

WinQuake 存在的原因及其工作原理

Fabien Sanglard

深入探讨创建 WinQuake(Quake 的 Windows 原生版本)的历史原因,以及它如何在 Windows 95 和 NT 上实现接近 DOS 版本的性能。

打造一台1997年的Quake PC!

Fabien Sanglard

作者记录了打造一台1997-1998年古董PC的过程,用于运行所有版本的Quake,涵盖了硬件选择,如Pentium MMX、3dfx Voodoo2和Socket 7主板。