如果说破坏飞行类作品的制作默认,常常是「先做出塌下来的热闹,卡顿再靠感觉关特效、砍碎片、猜哪一帧贵」,那么 2026 年十月初,荷兰独立工作室 Trilithon Games 的 Alex van Rossum 在自家引擎开发日志里摊开的那一组数字,等于把这套默认的账单改写成可回放的工单。游戏叫《Wreckwing》,跑在 Mac Apple silicon 上,引擎是自研的 Trilithon Engine,Swift 加 Metal 加 Jolt Physics。商店页还没上,作品仍在开发中。本稿未试玩成品,以下场面与数字均来自作者公开开发日志与官网资料。
我把能找到的几篇引擎笔记对了一遍。能钉死的事实并不复杂。十月六日,大城市试玩里出现多次慢下来,最重时几乎爬行。遥测把它们钉在模拟侧,落在炸开一百四十到五百块结构件之后的零点七到一点四秒。玩家侧报出的卡顿从零点二秒到一点四秒。同一周前后,他们又写了决定论 digest、无头回放,以及四 K 帧里光照如何少算像素。草稿由 Claude Code 在仓库里起草,Alex van Rossum 本人审过每一组数字。
贯穿本稿的意象,是回放,也是 digest。它听起来像工具名,落到制作伦理上,却是一组可核验的���诺。先让世界能按同一指纹重演,再谈哪一刀省了时间。省下来的必须留下证据,改的是时间,世界指纹仍对得上。

一、行业默认,卡顿靠猜,优化靠关特效
破坏场面贵,几乎人人都知道。爆炸一响,结构碎开,碎片互相顶着睡不着,渲染还要清掉已经断掉的零件。行业默认写法也很固定。先凭手感说「好像是物理」,再试着少拆几块、早一点冻住碎石、把灯光或阴影档位拧低。玩家侧也学会了用同一套语汇阅读卡顿。他们会说「爆炸后会顿一下」「大城市别开高配」。这种默契让「猜」变成可被原谅的制作语法。
《Wreckwing》偏偏把猜测成本抬得很高。它是大尺度城市里的破坏飞行。一次导弹可以砸出几十米弹坑,一次火箭齐射可以叫醒上万个刚断下来的刚体。贵的瞬间往往叠在同一秒里,移除钩子、地形去重、爆炸表现、网格压实、支撑检查,谁都能贡献几十到两百毫秒。你若只靠「感觉哪一帧卡」,很容易修错人,或者修对了却改坏世界。
分叉点就在这里。默认问的是,关什么特效能让帧率好看一点。他们改问的是,能不能先把那一点四秒钉成可重演的会话,再逐项量、逐项修,并且用世界指纹证明,修完以后玩家撞见的仍是同一场坍塌。

二、方法,四千零九十六帧环缓冲,标记键,无头回放,digest
十月六日上午,他们先给自己做了一把能指向卡顿的工具。游戏在内存里保留最近四千零九十六帧的现场,大约三十四秒(按一百二十帧每秒计),并记下帧内各部分与模拟各阶段各花了多少时间。键盘 X 或手柄 Y 一按,界面跳出 Marked 计数,同时存下相机位置、标记前二十秒与标记后五秒。任何超过四十毫秒的帧,即便没人按标记,也会带着分项自动落盘。记一帧的主线程中位成本不到五微秒。开着记录与关着记录,收束状态一致。
有了环缓冲还不够。游戏本来就会记下整场试玩。回放工具能在无窗口条件下,按原始游戏时间重新点燃那些爆破与炮击,城市仍是该会话最后加载的那一座。一次混城回放把某个卡顿重演到单步物理八三六毫秒。物理步是引擎一次算完的六十分之一秒模拟切片。卡顿因此变成可重复实验。后面每一项修复,都靠重放已记录会话、比对状态 digest 来验收。digest 是整世界收束时的指纹。对上了,才说这一刀只改了耗时。
决定论是这套方法的地基,写在稍早几天的另一篇笔记里。九月二十九日,同一间办公室爆破测试,两次录像分别倒下六百九十六与一千一百二十三块结构件。他们按物理引擎文档把查询、活动体列表、撞击事件、接触点全部按稳定顺序排好,断裂也按请求顺序应用。改完以后,同一场景稳定倒下一千二百六十六块,捕获、录像与无头计时跑出相同 digest。digest 把每个刚体位置收到毫米。差一毫米,指纹就变。
十月一日他们开始把模拟、断裂与步进拆进可复用的引擎模块。每一步都要求世界原样留下。于是有了 `tools/digests.sh`。它跑十三套测试场景,回放两场实机试玩,另加隔 tick 步进、开声音,以及全场景屏幕捕获,再拿 release 构建与清空环境开关后的基线比对。整轮大约十分钟。无头模式关掉窗口、渲染与声音,十个场景大约一分钟就能跑完,指纹仍与带渲染的应用一致。这证明画面没有回流进模拟。
回放自己也会撒谎。市中心会话大约七次里有一次收束不同,街区城大约五次里有一次。原因是测试窗口启动时抢焦点,旁敲的键会进模拟。中途按一次 T,画质档会从高切到中。修复很土。离线跑只显示窗口不抢焦点,丢掉键鼠,质量档由命令行钉死。再往测试里塞电源状态通知与六百步后的 T,指纹仍与干净跑一致。市中心回放连跑三次,收束相同。
到这里,方法已经齐了。环缓冲负责指认。无头回放负责重演。digest 负责证明。十分钟脚本负责把证明变成日常。
三、罪名表,钩子、哈希、爆炸、压实,以及一点四秒的产品抉择
有了可重演的会话,他们把原因拆成一张表,一次只动一项。
渲染器的移除钩子,原先对每个断掉的零件,都去扫场景里每一个已绘制部件,家具、饰条、车、船全扫。两枚导弹进城,应用完成断裂分别要一百二十四与一百三十四毫秒。改完以后是七点九与八点一毫秒。
地形顶点去重哈希只读了乘积的低位。整米与四分之一米网格上那些低位经常是零,顶点挤进少数槽位。一枚导弹的弹坑曾吃掉一百九十二毫秒,回放最差模拟帧到二百零二毫秒。混入 Murmur3 finalizer 之后,最差模拟帧落到三十一点五毫秒。
四十米爆炸的表现层,要在一百米可达范围内搜索,并对每个刚体查所属结构。回放里是五十二与八十三毫秒,实机一帧一百六十四毫秒里它占过八十六。改完回放是五点一与六点一毫秒。
城市绘制网格在一帧内压实,回放二百二十一毫秒,实机二百三十三到三百一十一。第一轮改到八十七毫秒。十月七日会话的第二轮,又从一百二十五与一百三十四毫秒压到六十与六十五。低配档大城市里,超过三十三毫秒的步进,从每次跑四十到七十九次,落到四到四十八次。弹坑支撑检查也从三十二毫秒(六十四米弹坑,其中约三十毫秒在检查)落到十二点六毫秒。
还有一类嫌疑,五刀都没省下时间。第一城最重窗口、Low Power Mode 基线里,火箭齐射可叫醒约两万二千个活动刚体,百分之九十九是断裂碎屑。其中约一半几乎不动,却被七千到九千八百个互相碰到的群体拴住,物理引擎只能整组一起睡。步进到八十四到一百一十四毫秒。他们试过少开作业线程、少迭代、放宽接触缓存、放宽睡眠阈值、加爆炸地板,五条都接近白做。把碎石冻结从两秒改到一秒,最慢步进才落到六十二到七十毫秒。
产品抉择在这里显形。减负有两条路,更早冻碎石,或者少拆几块。他们保留现有断裂密度,把冻结定在一点四秒,而不是测试里的一秒。高配档从两秒改到一点四秒,还要等第二轮回放确认。十月七日早上,大城市十分钟试玩成了新基线。一秒级冻结几乎消失。巨型导弹砸进城中心,以及其他几次大落点,都没有再冻住。他们只给飘着的碎屑标了一个时刻。
这张表的力量,很少来自某一行的华丽百分比。它来自每一行都带着前后数字,以及「digest 对得上」这句冷硬的验收语。修错人的成本,被回放压低了。改坏世界的风险,被指纹挡住了。

四、另一刀,八百万像素上的光,以及「少算」如何保持字节一致
卡顿表收束之后,他们把刀伸进四 K 帧。最大城市、High 预设、Low Power Mode,基准里 GPU 大约三十毫秒一帧,约三十三帧每秒。最大单步是表面加光照,十三点一毫秒。
消融很直白。整步关掉光照,剩八点七,于是光照本身约四点五。关掉最多十二盏动态小灯,剩十点七,于是小灯约二点五,占光照一半以上。天空可见度约零点九,地面反弹约零点五,室内灯与 PCSS 软影边在噪声里≈零。八百万像素,每像素对最多十二盏灯各做三次评估,本体、高光、烟雾辉光。灯的可达半径最远约十六米。街上绝大多数像素其实落在所有灯的球外,却仍在空转检查。
改法是先为每盏灯算出加过边距的屏幕矩形,像素只检查盖住自己的那些灯。三盏灯打墙的对照测试里,改前改后画面字节一致。同一步从十三点八毫秒均到十一点八,大约从三十毫秒整帧里抠出两毫秒。极限也写得很清楚。玩家引擎常贴在追逐镜头前方,灯的矩形会铺满全屏,那盏灯仍要被每个像素检查,其它灯继续被跳过。
材质细节同样被拆开。全部细节材质约二点九毫秒,其中程序化混凝土噪声一层就大约一点三。建筑间颜色变化约零点五五,风化与积尘各约零点三。城市三百万三角形写入 G-buffer 约三点五毫秒。早期尝试跳过屏外建筑,约省零点四毫秒,却让七十五个像素着色不同,他们选择不换。会改画面的优化,要先拿前后静帧比过再进主干。
旁支里还有资产与加载。带贴图的 Sniper 舰约三十万三千四百五十八三角,旧模型约八千八百。六架 Sniper、三八四〇×二一六〇 High,帧时从七点一六毫秒到十点三九。阴影改用约三万三角的 LOD 之后,阴影成本从一点九毫秒落到零点二。宽城加载从九点七秒到三点一秒,武装飞船残骸搭建卡顿从二百九十毫秒到十二毫秒。这些数字写在 0.15 系列后续笔记里,方向与主线一致。先量,再改形状,再证明观感或世界没有偷偷换人。
收束,独立等于愿意为可重演付十分钟
把这组十月笔记放回 2026 年秋天的独立引擎现场,它首先打击的是一种隐蔽的制作惯性。大家默认卡顿靠猜,默认优化等于关特效,默认「修完能玩」就够了,很少有人追问修完以后的世界是否仍是同一场戏。Alex van Rossum 把另一条路径摊开。工具可以土到一个标记键。验收可以硬到毫米级指纹。十分钟 `digests.sh` 可以把决定论从口号变成每日闸门。
对小团队,这组材料尤其有用。你未必自研 Swift 引擎,也未必有两万二千个醒着的碎屑。你一定有自己的「默认已经够用」清单。某次爆炸后的卡顿只凭感觉归因。某次优化只看平均帧,不看最差步。某次重构没有无头对照。某次测试窗口抢了焦点,把 flaky 回放当成物理非决定。Trilithon 的公开作业把成本写得很土。录帧可以低于五微秒。无头十场景大约一分钟。完整 digests 大约十分钟。贵的是愿意每天付这十分钟,以及愿意在产品上承认,一点四秒冻结是保留断裂密度之后的显式抉择。
可执行的提示很短。
- 先给卡顿做「可指向」能力。环缓冲、自动超阈值落盘、标记键带前后窗口,三者里至少落地一样,再谈优化会议。
- 每次修性能,固定两问。前后数字是多少,世界指纹是否仍对得上。对不上的「变快」,先当缺陷,不当胜利。
- 怀疑渲染回流进模拟时,用无头与带渲染各跑一轮。指纹一致,才能把刀伸进画质。
- 会改变画面的剔除与烘焙,先做字节级或静帧对照。省两毫秒可以进主干。改了七十五个像素却只省零点四,可以留下记录,先不换。
一点四秒的卡顿、八三六毫秒的单步、八百万像素上的灯、十分钟的 digests。在商店页尚未打开之前,制作人已经把审计标准写进公开日志。先让坍塌能重演,再让时间变便宜。

来源与延伸阅读
Alex van Rossum / Trilithon Games(2026-10-07)Finding 1.4-second stalls by replaying play
Alex van Rossum / Trilithon Games(2026-10-01)Making a collapse repeat exactly
Alex van Rossum / Trilithon Games(2026-10-13)Skipping pixels and tearing down a 4K frame
Alex van Rossum / Trilithon Games(2026-10-10)Textured ship models
Trilithon Games(2026-10-07)Release 0.15