Quake引擎指示器
摘要
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)
---
相似文章
打造一台1997年雷神之锤PC:雷神之锤基准测试
针对各种1990年代CPU和配置下雷神之锤性能的详细技术分析,比较英特尔、Cyrix、AMD芯片以及DOS和Windows 95下的内存类型。
打造一台1997年的Quake PC:对GLquake进行基准测试
一位开发者讲述了他组装一台配备3dfx Voodoo显卡的复古PC,并对GLQuake进行基准测试的过程,同时讨论了硬件的小问题和性能印象。
打造一台1997年玩《雷神之锤》的PC:VQuake性能基准测试
一篇详细的回顾文章,讲述如何组装一台1997年时代的《雷神之锤》PC,并对硬件加速版VQuake进行基准测试,重点介绍Rendition Verite 1000显卡及其独特功能,包括双线性过滤和全亮度支持。
WinQuake 存在的原因及其工作原理
深入探讨创建 WinQuake(Quake 的 Windows 原生版本)的历史原因,以及它如何在 Windows 95 和 NT 上实现接近 DOS 版本的性能。
打造一台1997年的Quake PC!
作者记录了打造一台1997-1998年古董PC的过程,用于运行所有版本的Quake,涵盖了硬件选择,如Pentium MMX、3dfx Voodoo2和Socket 7主板。