第 19 章

管线即疆域

引擎不是工具箱。这个判断在2018年听起来像是哲学夸张,但到2021年,它已经变成了一个可以用秒表验证的工程事实。

2014年11月,BioWare艾德蒙顿工作室的构建日志提供了最早的一批证据。凌晨两点十七分,一名技术美术盯着屏幕,看着进度条在83%处停滞了四十分钟。日志每一行都在报告同一个问题:某个材质引用了三十二个纹理,其中一个纹理的路径在两年前被重命名,但引用关系从未更新。引擎没有报错——它只是反复扫描所有可能的路径,每一次构建都重复这一过程。《龙腾世纪:审判》是首款采用寒霜引擎开发的角色扮演游戏,BioWare团队在开发周期中不断撞上资产管线的隐形天花板:当项目资产数量突破六位数,文件之间的引用关系便从一棵可以遍历的树,变成了一张无法预测的网。

那一年,决定项目生死的已经不是GPU能绘制多少三角形。寒霜引擎的运行时性能在当时堪称顶尖——它能在PS4上稳定输出每秒三十帧的开放世界画面。但真正消耗团队精力的,是那些发生在艺术家关闭Maya、提交文件之后的黑暗时间:构建系统开始运转,资产从源文件转换为引擎格式,依赖关系被解析,包体被组装。在这个过程中,时间与精度从无数缝隙中泄漏出去,而没有人——无论是程序员、技术美术还是制作人——能够准确说出损耗发生在哪里。

这不是BioWare独有的问题。2014至2015年间,整个3A产业都在经历一场静默的规模危机。一个典型3A项目的资产数量从PS3时代的数万件膨胀到数十万件,团队规模从两三百人跨越到千人以上。当一千个人同时向同一个项目提交文件时,资产管线就不再是一个技术问题——它变成了一个物流问题。

这个物流问题的本质,在2018至2021年间被三大引擎厂商以不同的方式诊断,又以不同的方式治疗。而这场诊断与治疗的过程,揭示出一条清晰的断层线:引擎不再是创作者的“工具箱”,而正在演变为一座管理数百万数字资产的“物流枢纽”。竞争重心从“运行时能力”的军备竞赛,悄然转移至一个更隐蔽却更具决定性的战场——内容生产管线。

要理解这场转移的深层逻辑,必须先把时间拨回到更早的时刻。2005年6月,旧金山Moscone中心,苹果全球开发者大会。斯科特·福斯托在台上展示了一款名为Unity的软件。他打开Mac OS X的界面,将一个3D模型文件拖拽进Unity编辑器窗口,几秒钟后,模型在场景视图中被渲染出来。福斯托又拖入一个脚本,点击播放——那个模型开始旋转。整个演示不超过十分钟,但它在游戏引擎史上刻下了一条清晰的边界:在此之前,导入一个3D资产需要程序员编写解析器、设置渲染状态、手动管理内存;在此之后,拖拽即可。

Unity 1.0的“民主化宣言”——让游戏开发大众化——在2005年并未立即改变产业格局。但它的拖拽导入机制埋下了一颗种子:引擎开始承担起管理资产的责任,而不仅仅是渲染资产。当艺术家将FBX文件拖入Unity窗口的那一刻,引擎必须在后台完成一系列操作:解析文件格式、提取网格数据、转换为内部表示、生成材质槽位、建立引用关系。这些操作在2005年几乎是瞬时完成的——那时一个项目只有几百个资产,引用关系的深度不超过三级。

但种子会长大。到2010年Unity Asset Store推出时,资产管理的复杂性已经开始显现。Asset Store允许开发者购买和导入第三方资产,但每个资产都有自己的一套材质、纹理、脚本和依赖关系。当开发者同时导入三个来自不同创作者的资产包时,材质命名冲突、脚本版本不兼容、纹理路径重复——这些问题开始频繁出现。Unity的编辑器仍然保持着2005年的核心假设:资产是手工导入的,数量是可管理的,引用关系是清晰的。这个假设在2010年已经开始动摇,但还没有崩溃。

真正的断裂发生在2014至2016年间。那三年里,三条独立的技术路线同时触及了资产管线的天花板,而它们的碰撞揭示了问题的本质。

第一条路线来自Epic的Unreal Engine 4。2014年UE4发布时,Epic做出了一个在当时看来激进但在事后看来必然的决定:放弃UE3使用的UnrealScript脚本语言,全面转向C++与蓝图可视化脚本系统。这个决定的公开理由是性能——C++比虚拟机上的脚本语言快得多。但它有一个被低估的副作用:资产格式必须彻底重写。UnrealScript中的类可以直接序列化为资产数据,但C++类的序列化需要一套全新的反射系统和资产注册表。Epic的程序员花了两年时间构建这套系统,而在这个过程中,他们逐渐意识到:资产格式不仅是存储问题——它是整个管线的骨架。

第二条路线来自Unity对Enlighten全局光照系统的整合。2014至2016年间,Unity押注于动态预计算光照——Enlighten在编辑器中进行复杂的离线计算,生成运行时可以高效查询的光照数据。

但Enlighten的预计算过程对场景几何体有严格的要求:模型必须被正确标记为静态,UV布局必须满足特定规范,材质属性必须被精确设置。任何一个资产的任何一项属性不符合要求,预计算就会失败——而且失败信息往往淹没在数万行日志中,难以定位。Unity的技术支持团队在那两年里反复收到同一类问题:光照烘焙运行整夜后产出黑色结果。

答案几乎总是:某个模型缺少第二套UV,或者某个材质的金属度值超出了合法范围。但找到那个模型,在一个包含三万四千个资产的场景中,本身就是一项工程。

第三条路线来自一个看似无关的领域——程序化生成。2016年8月,《无人深空》发售。Hello Games的这款游戏试图用程序化生成技术创造一个包含1800亿亿颗行星的宇宙,但发售时的灾难性崩溃揭示了一个残酷的事实:程序化生成管线的调试难度与生成内容的规模呈指数关系。当一颗行星的地形由数十个数学函数叠加生成时,一个函数的参数偏移0.01,就可能导致整个生态系统崩溃。

Hello Games的程序员在发售后的数月里,面对的不是传统的bug报告——那些报告无法复现,因为每一颗行星都是唯一的。他们被迫发明了一套全新的调试工具,能够追踪一个特定坐标上的所有生成函数调用栈。这套工具后来被总结为一篇GDC演讲,标题是《在确定性混沌中寻找秩序》。

三条路线,三个不同的领域,但它们在2016年汇聚到同一个问题上:当资产数量突破临界点,传统的“文件-资源-内存”管线模型就会从透明变为不透明。艺术家不知道自己的修改何时会反映在构建中。程序员不知道哪一个资产拖慢了加载时间。制作人不知道为什么昨天的构建是成功的,今天的构建却失败了,而两次提交之间只改了三个纹理。

这个问题在2017至2018年间达到了危机点。一个标志性事件发生在Epic内部:当《堡垒之夜》从一个小型合作项目迅速膨胀为Epic最大的运营中游戏时,它的资产管线开始表现出所有3A项目的症状——构建时间从四十分钟膨胀到四个小时,增量构建的命中率下降到不足30%,这意味着每次构建都要重新处理绝大多数资产。Epic的工程师们被迫面对一个痛苦的现实:他们自己的引擎——那个授权给全球数百个团队使用的Unreal Engine 4——在处理Epic自己最大的项目时,管线的效率已经低到不可接受。

2018年春天,Epic成立了一个内部团队,任务只有一个:重新设计Unreal Engine的资产管线。这个团队后来被称为资产管道组,他们的第一项工作不是写代码,而是测量。他们在《堡垒之夜》的构建过程中插入了数千个计时点,生成了一份长达数百页的报告。报告揭示了一个令人震惊的事实:在全量构建的四个小时中,只有约40%的时间花在真正的编译和压缩上。剩下的60%被消耗在路径解析、格式探测、依赖图遍历和重复的文件I/O操作上。

更具体地说,报告指出,《堡垒之夜》的一个典型角色资产——比如一个皮肤模型——在构建过程中会被引擎访问十七次。第一次是在扫描阶段,引擎需要确认这个文件存在。第二次是在依赖解析阶段,引擎读取文件头以提取引用列表。第三次到第八次是在各种验证阶段——材质是否合法、纹理尺寸是否是二的幂、骨骼数量是否超过限制。第九次到第十四次是在转换阶段——FBX转UAsset、TGA转UTexture、WAV转USoundWave。第十五次是在打包阶段,引擎需要将转换后的资产序列化到包体文件中。第十六次是在补丁生成阶段,引擎需要比较新旧版本以生成增量补丁。第十七次是在最终的完整性校验阶段。

十七次访问,大多数读取的是同一个文件的同一段数据。为什么不能一次读取,缓存结果,然后分发到所有需要它的阶段?

答案是:Unreal Engine 4的资产管线是在UE3的基础上逐步叠加而成的,每个阶段都是由不同的团队在不同时期编写的,它们之间没有统一的缓存层。构建流程不是一个设计出来的系统——它是一个生长出来的堆积层。

这份报告在Epic内部引发了一场哲学辩论。一方主张渐进式修复:在现有管线的基础上增加缓存机制,优化热点路径,将构建时间压回到可接受的范围。另一方主张彻底重构:废弃UE4的资产管线,从头设计一套以“资产即数据流”为核心理念的新系统。辩论持续了三个月,最终后者胜出。理由是:如果只是修复热点,引擎将在两年后再次撞上同一堵墙——因为资产规模仍在以每年40%的速度增长。

这场辩论的结果,就是后来被称为“虚拟资产系统”的基础架构。它的核心理念简单得近乎粗暴:引擎不应该关心一个资产是存储在本地磁盘、网络服务器还是云端——它只需要一个统一的键去请求数据,然后由底层系统负责定位、加载和缓存。这个理念并非Epic首创——它借鉴了现代操作系统的虚拟内存管理——但将它应用到游戏引擎的资产管线,意味着必须重写从文件I/O到序列化到依赖解析的每一个环节。

虚拟资产系统的第一个公开亮相是在2019年的GDC上。Epic的工程师展示了一个技术演示:同一个项目,使用UE4.25的构建时间为三小时四十七分钟,而使用搭载虚拟资产系统的实验版本的构建时间为五十二分钟。

这个数字震惊了在场的3A开发者。但更让他们震惊的是增量构建的改进:在修改一个纹理后,UE4.25需要十二分钟来重新构建,而实验版本只需要四十秒。

四十秒。这个数字意味着艺术家可以在修改后立即看到构建结果,而不是提交后去吃午饭、回来再看。这个数字意味着技术美术可以快速迭代着色器参数,而不是每次调整都要等待一个完整的材质编译周期。这个数字意味着,在3A开发中,反馈循环的粒度从小时级被压缩到了分钟级。

但Epic并不是唯一意识到管线问题严重性的引擎厂商。同一时期,Unity也在进行一场同样激进但方向截然不同的重构。要理解Unity的选择,必须回到2016年12月。那个月,Unity官方做出了一个看似微小但意义深远的决定:放弃纯数字版本号,改用年份与版本号的复合形式——Unity 2017.1、Unity 2018.2,以此类推。这个决定的公开理由是引擎更新速度加快,数字版本号已经无法准确反映发布节奏。但更深层的原因是:Unity正在同时推进多项互不兼容的底层重构,传统的线性版本号无法表达分支与合并的复杂性。

其中最重要的一项重构,就是可寻址资产系统(Addressable Assets System)。它的核心理念与Epic的虚拟资产系统惊人地相似:将资产的物理位置与逻辑标识分离。开发者不再通过文件路径引用资产——那是一条脆弱的、会在项目重组时断裂的链——而是通过一个唯一的地址来引用。底层系统负责将地址解析为实际数据,这意味着资产可以随时被移动到不同的文件夹、不同的包体甚至不同的服务器上,而引用关系不会断裂。

可寻址资产系统在2018年进入实验阶段,2019年正式发布。它的设计文档中有一段话准确地抓住了Unity面临的独特挑战:Unity的开发者群体横跨从独立制作人到大型工作室的整个光谱,前者管理着数百个资产,后者管理着数十万个资产,这两类用户对管线的需求几乎是互斥的——前者需要零配置、即时反馈和最小认知负荷,后者需要可扩展、可审计和确定性构建。

这正是管线战争的核心矛盾。通用引擎必须同时服务于规模迥异的项目——从三人独立团队到三千人3A兵团——而这两端对管线的需求确实是互斥的。独立开发者不会容忍一个需要数据库管理员来维护的资产系统。3A工作室不会容忍一个无法追溯三年前某个资产变更历史的系统。Unity试图用可寻址资产系统同时满足这两端:对于独立开发者,它默认行为是拖拽即用,所有复杂性都被隐藏在自动生成的地址背后;对于大型工作室,它暴露了完整的地址管理API、自定义解析策略和构建报告工具。

但这条路比预想的更加艰难。2019至2020年间,Unity的可寻址资产系统经历了四次主要版本迭代,每一次都伴随着API的破坏性变更。在Unity论坛上,开发者们反复讨论同一个问题:为什么一个旨在简化资产管理的系统,需要阅读长达八十页的文档才能正确配置?答案隐藏在系统的架构深处:可寻址资产系统试图在Unity既有的资源管理框架之上构建一个新的抽象层,但既有的框架——那个从Unity 1.0时代继承下来的、基于Resources文件夹和场景引用的模型——从未被设计为支持间接寻址。每一次地址解析,都要穿越三层兼容性代码,才能抵达实际的资源加载函数。

2019年秋天,Unity的一位高级工程师在一篇内部备忘录中写道:公司在一个为数百个资产设计的系统上,强行叠加了一套为数十万资产设计的管理层,这两层之间的摩擦正在以尚未完全理解的方式消耗着性能、可维护性和用户耐心。这份备忘录后来被泄露到社区,引发了一场关于Unity技术债务的广泛讨论。

Unity还在推进另一项更底层的重构:DOTS(Data-Oriented Technology Stack)。DOTS的理念源自2014年Mike Acton在CppCon上的“异端宣言”——游戏引擎应该围绕数据的流动来设计,而不是围绕对象的继承关系。DOTS包含三个核心组件:实体组件系统(ECS)、C#任务系统(C# Job System)和Burst编译器。它们的组合目标是让Unity能够高效利用多核CPU,处理前所未有的实体数量。

但DOTS对资产管线的影响被严重低估了。ECS的核心理念是将数据与行为分离——实体只是ID,组件是纯数据,系统是纯逻辑。这意味着传统的GameObject-组件模型中的所有资产引用方式都必须被重新设计。一个Prefab不再是一个包含所有组件和子对象的自包含资产,而是一组分散在不同数据块中的实体原型。构建系统必须理解这种新的数据布局,必须能够将ECS实体正确地序列化到包体中,必须在加载时以正确的顺序重建实体之间的依赖关系。

可寻址资产系统解决的是“如何找到资产”的问题。DOTS解决的是“如何高效地存储和访问资产数据”的问题。

两者在理论上应该协同工作,但在2019至2020年的实际开发中,它们经常互相绊倒。可寻址资产系统的地址解析依赖于GameObject的引用机制——而DOTS正在逐步废弃GameObject。DOTS的实体原型需要一种全新的序列化格式——而可寻址资产系统的构建管道还无法识别这种格式。

Unity的工程师们发现自己被困在两场同时进行的战争中:一场是对资产管线表层的重构,另一场是对资产数据模型底层的重构。两场战争都必须打赢,但它们的推进速度不一致,依赖关系错综复杂,资源分配相互竞争。到2020年底,Unity的多个大版本都在同时包含这两套系统的部分组件,而没有任何一个版本能够提供完整的、文档齐全的、经过大规模项目验证的端到端管线解决方案。

Epic和Unity在管线战争中的不同路径,折射出更深层的结构差异。Epic是一家游戏公司,它的引擎首先服务于自己的项目——《堡垒之夜》的管线痛苦直接驱动了虚拟资产系统的开发。当Epic的工程师设计新管线时,他们有一个明确的目标场景:一个包含数十万资产、由数百人同时编辑、每周多次更新的在线游戏。这个场景的极端性迫使Epic做出极端的选择——废弃旧管线,从头构建新系统。

Unity不是一家游戏公司。它不运营一个拥有数十万资产的在线游戏。它的工程师必须从数千个使用Unity的项目中抽象出通用需求,而这些项目的规模差异跨越三个数量级。这种抽象过程不可避免地会丢失具体性。当Unity的设计师试图定义大型项目的资产管线需求时,他们依赖的是合作伙伴的反馈、论坛上的抱怨、GDC上的交流——这些信息是碎片化的、有时相互矛盾的、缺乏统一上下文的。结果就是,Unity的管线重构总是在过于通用和过于特化之间摇摆。

这种摇摆的一个具体表现,是2019至2021年间Unity对构建系统配置界面的反复修改。在Unity 2019.1中,构建设置被组织为按平台分类的选项卡。在Unity 2019.3中,它们被重构为按资产类型分类的列表。在Unity 2020.1中,又增加了一个构建配置文件系统,允许开发者保存和切换不同的构建配置。每一次修改都是为了解决前一个版本暴露的问题,但每一次修改也引入了新的复杂性。到2021年,一个需要同时构建iOS、Android和WebGL版本的项目的构建配置,已经包含超过两百个可调节参数。

Epic在UE5的开发中走了一条不同的路。2020年5月,Epic发布了UE5的早期版本,其中最引人注目的特性是Nanite虚拟几何体和Lumen动态全局光照。媒体和开发者的注意力几乎全部集中在这些运行时渲染特性上。但被忽略的是,UE5的资产管线已经与UE4完全不同。虚拟资产系统被完全集成到引擎核心中。资产格式从UE4的双文件结构改为单文件打包结构。依赖图的构建从编辑器启动时的一次性扫描改为持续的增量更新。

UE5的资产管线有一个被低估的特征:它强制规定了资产的命名规范和目录结构。在UE4中,开发者可以将资产放在任意位置,使用任意命名。在UE5中,虽然引擎不会拒绝不符合规范的资产,但构建系统会对它们施加惩罚——更慢的加载速度、更长的构建时间、更频繁的缓存失效。Epic没有通过文档或规则来推行规范,而是通过管线的性能特征来训练开发者。这是一种软性的强制:如果你想让构建时间从两小时降到二十分钟,你就必须按照引擎期望的方式组织资产。

这种设计哲学与Unity形成了鲜明对比。Unity的传统哲学是不强制任何工作流——开发者可以自由选择如何组织项目、如何命名文件、如何管理依赖。这种自由在小型项目中是优势,但在大型项目中变成了诅咒。当一千个人各自按照自己的习惯命名和组织资产时,管线的效率就会崩溃。Unity试图通过可寻址资产系统来缓解这个问题——地址抽象层理论上允许底层文件结构保持混乱——但抽象层本身引入了性能开销,而且当地址解析出错时,错误信息往往无法追溯到具体的文件。

2021年夏天,一个在游戏开发者社区广为流传的帖子准确地捕捉了这种对比。一位曾在Epic和Unity都工作过的技术美术写道:在Unreal中,引擎告诉你应该这样做,如果不这样做,后果自负;在Unity中,引擎告诉你你可以做任何你想做的事。两种哲学都有代价——Unreal的代价是学习曲线,你必须花时间理解引擎希望你如何工作;Unity的代价是规模天花板,当你突破某个临界点后,你做任何想做的事的自由,都会转化为构建时间的失控。这个帖子在一天之内获得了超过两千条回复。回复中反复出现的一个词是“物流”。开发者们开始用物流的术语来讨论资产管线——吞吐量、延迟、瓶颈、库存管理。这种语言的变化本身就是管线战争的标志。

物流枢纽的隐喻值得进一步展开。在实体物流中,仓库的布局决定了货物从入库到出库的效率。如果货物随机堆放在任意位置,每次拣选都需要搜索整个仓库。如果货物按照分类存放在固定位置,拣选效率大幅提升,但灵活性下降——当一种新类型的货物出现时,仓库必须重新规划。如果引入自动化分拣系统,效率进一步提升,但系统的初始投资和维护成本急剧增加。

引擎资产管线同样如此:随机堆放对应Unity的传统模型,固定位置对应UE5的规范模型,自动化分拣对应虚拟资产系统。

游戏引擎的资产管线面临完全相同的权衡。随机堆放对应着Unity的传统模型——资产可以放在任意位置,引擎在构建时遍历所有文件以解析引用。固定位置对应着UE5的规范模型——资产按照类型和模块存放在预定义目录中,引擎可以快速定位。自动化分拣对应着虚拟资产系统和可寻址资产系统——通过地址抽象和缓存层实现高效的数据流动,但需要复杂的底层基础设施。

三种模型在不同的规模下各有优势。当资产数量在一万件以下时,随机堆放模型的灵活性优势远超其效率劣势——遍历一万个文件只需要几秒钟。当资产数量在十万件左右时,固定位置模型的效率优势开始显现——遍历十万个文件需要几分钟,而定位到预定义目录只需要几秒钟。当资产数量突破五十万件时,即使是固定位置模型也开始吃力——目录结构会变得极深,单次路径解析可能涉及数十次文件系统调用。这时,自动化分拣模型——即地址抽象层——成为唯一可行的方案。

2018至2021年间,3A项目的资产规模正好跨越了从十万到五十万的区间。这就是管线战争爆发的结构性原因。它不是任何一家公司的战略失误,也不是任何一项技术的突然突破——它是产业规模膨胀到现有管线模型无法承受的临界点后,必然发生的架构重构。

但这场重构的后果远不止于技术层面。管线架构的选择,实质上锁定了后续十年的开发效率上限。一旦引擎采用了某种资产寻址和依赖解析的模型,所有构建在此之上的工具——版本控制、持续集成、自动测试、热更新——都必须在同一套模型下运行。改变管线模型意味着重写所有这些工具。这就是为什么Epic选择在UE4到UE5的过渡期进行彻底重构——这是代际更替提供的唯一窗口期。这也是为什么Unity的可寻址资产系统推进得如此艰难——它试图在不打断现有生态的前提下,替换运行中的管线模型。

到2021年底,管线战争的战线已经清晰。Epic押注于垂直整合:UE5的资产管线与Nanite、Lumen等渲染特性深度耦合,资产格式被优化为直接供给这些系统的数据布局。这种耦合带来了极致的效率——在UE5中加载一个由Nanite渲染的静态网格体,比在UE4中加载同一个资产快三到五倍——但代价是灵活性:如果开发者不想使用Nanite,他们仍然要承担管线为Nanite优化所带来的格式约束。

Unity押注于水平抽象:可寻址资产系统和DOTS试图提供一套与具体渲染特性无关的通用数据层。这种抽象带来了灵活性——同一个资产可以无缝地在2D移动游戏和3D PC游戏中工作——但代价是效率:抽象层的性能开销在大型项目中累积到不可忽略的程度,而且当抽象泄漏发生时——即底层实现的细节穿透抽象层暴露出来——调试变得异常困难。

id Tech在这场管线战争中保持了一贯的沉默。id Software在2018年发布了《狂怒2》,使用的是Avalanche Studios的Apex引擎而非id Tech。2019年,id Tech 7随《毁灭战士:永恒》亮相,但它的资产管线几乎没有公开文档。

从逆向工程和社区分析中可以推断,id Tech 7的管线延续了id Tech 6的极简主义哲学:资产格式被设计为可以直接映射到GPU内存布局,构建过程几乎没有格式转换——本质上,艺术家输出的数据被直接打包成GPU可以消费的二进制块。这种哲学在运行时效率上达到了极致——《毁灭战士:永恒》在基础版PS4上以每秒六十帧运行,画面质量在同期游戏中名列前茅——但它的代价是管线的通用性几乎为零。id Tech 7的资产管线被硬编码为服务于第一人称射击游戏的特定需求:角色、武器、小型封闭关卡。任何偏离这个范围的需求——开放世界、动态天气、用户生成内容——都需要从零开始构建管线支持。

三条路径,三种哲学,但它们在2021年共同揭示了一个事实:管线即疆域。引擎的资产管线不再是一个中立的底层设施——它是一个有偏见的系统,它通过性能特征、默认设置和错误信息,塑造着开发者组织工作、分配资源、规划进度的方式。管线不是中立的。它有自己的倾向、自己的惯性、自己的代价结构。选择一条管线,就是选择了一种生产关系的组织方式。

这个事实在2021年秋天的一次行业调查中得到了量化证实。调查覆盖了全球二百三十七个使用商业引擎的游戏开发团队,询问他们的构建时间、资产规模和管线满意度。

结果呈现出清晰的断层:资产规模在五万件以下的团队,对管线的满意度普遍较高,无论使用哪个引擎。资产规模在五万到二十万件之间的团队,满意度开始分化——使用UE4或UE5的团队报告了更快的构建时间,但更多的规范遵循成本;使用Unity的团队报告了更大的灵活性,但更频繁的管线故障。资产规模超过二十万件的团队,满意度全面下降——所有引擎的管线都在这个规模上表现出明显的压力症状,只是症状的类型不同:UE的规范开始变得僵化,Unity的灵活性开始变得混乱,id Tech的极简开始变得局限。

调查还揭示了一个被长期忽视的事实:管线效率对团队士气和人员流失有直接影响。在构建时间超过两小时的团队中,技术美术和构建工程师的年离职率比行业平均水平高出十二个百分点。一位受访者在自由评论栏中写道:当你的工作流程是修改一个材质、提交、等待构建、发现错误、修复、再次提交、再次等待,每天只能完成三到四次迭代时,你会开始质疑自己的职业选择——不是因为工作无聊,而是因为等待杀死了创造的节奏。

创造的节奏。这正是管线战争的终极赌注。当引擎的运行时能力已经足够强大——当Nanite可以处理数十亿三角形,当Lumen可以实时计算全局光照,当DOTS可以驱动数万个实体——真正限制开发效率的,不再是机器能渲染什么,而是人类能多快地看到自己的工作成果。反馈循环的粒度,从修改到看到结果的时间间隔,决定了迭代的速度。迭代的速度决定了质量的上限。质量的上限决定了游戏的命运。

2018至2021年的管线战争,本质上是一场关于反馈循环粒度的战争。Epic将构建时间从小时压缩到分钟。Unity试图在保持灵活性的前提下做同样的事。id Tech通过限制问题范围来回避战争。三条路径各有胜负,但没有一条路径能够同时满足三人独立团队和三千人3A兵团的需求——因为这两端对“足够快”的定义本身就是互斥的。独立开发者认为等待三十秒是可以接受的。3A兵团认为等待三十分钟是灾难性的。三十秒和三十分钟之间,横亘着一道无法用任何单一管线架构跨越的鸿沟。

到2021年底,这道鸿沟的具体尺寸已经被测量清楚。一个管理着三十二万件资产的UE5项目,在全量构建时需要五十二分钟——这是Epic在GDC上公开的数字。一个资产规模相似但使用Unity可寻址资产系统的项目,构建时间在一小时四十分钟到三小时之间波动,取决于地址配置的优化程度。一个使用id Tech 7的项目,资产规模被严格控制在八万件以内,构建时间为十二分钟。三组数字,三种代价。五十二分钟的等待换来了极致的运行时性能。三小时的波动换来了工作流的灵活性。十二分钟的速度换来了对项目范围的严格限制。

这些数字在2021年秋天被整理成一份内部报告,在三大引擎厂商之间私下流传。报告的结论是一句简短的话:当前没有任何商业引擎的资产管线能够同时满足通用性、效率和可扩展性的要求。这句话不是批评——它是诊断。它指出管线战争没有终局,只有权衡。而每一种权衡的后果,都会在下一个十年的开发实践中逐步显现。

最直接的后果已经清晰可辨。当Epic将UE5的管线与Nanite和Lumen深度耦合时,它实质上做出了一项决定:所有使用UE5的大型项目,都将被引导向使用Nanite和Lumen的工作流。这不是技术强制——开发者仍然可以选择不使用这些特性——但管线的性能特征会持续施加压力。如果一个团队选择不使用Nanite,他们的静态网格体加载时间将比使用Nanite的团队慢三到五倍。这不是惩罚,这是架构偏见的自然结果。引擎的管线假设你在使用Nanite,它为这个假设进行了优化,当你不符合这个假设时,你就会付出性能代价。

Unity面临的是相反的问题。可寻址资产系统试图不假设任何东西——它试图成为一个纯粹的水平抽象层,不偏向任何特定的渲染特性或工作流。但这种中立性的代价是,它无法为任何特定场景进行深度优化。当UE5的管线知道一个静态网格体将被Nanite渲染时,它可以跳过传统LOD的生成步骤,直接将高精度网格数据打包进适合GPU流式加载的格式。当Unity的管线加载同一个网格体时,它不知道这个网格体最终将如何被渲染,因此它必须保留所有可能的处理路径——传统的LOD、可能的GPU实例化、可能的动态批处理。这种保留意味着更多的中间数据、更多的转换步骤、更长的处理时间。

id Tech避开了这两种代价,但付出了自己的代价:它无法参与通用引擎的市场竞争。id Tech 7的管线在它所针对的场景中——线性第一人称射击游戏——达到了极致的效率。但一旦离开这个场景,管线的效率就会断崖式下降。这就是为什么id Software在2018年后不再将id Tech授权给外部开发者——它的管线已经变得如此特化,以至于外部团队需要花费数年时间才能将其改造为自己的项目所用。

三条路径在2021年底各自停在了不同的位置。Epic停在了垂直整合的尽头——管线与渲染特性深度耦合,效率极致但灵活性受限。Unity停在了水平抽象的中间——管线试图保持中立,但中立的代价是性能开销和配置复杂性。id Tech停在了领域特化的终点——管线被优化到极致,但通用性为零。没有一条路径是完美的。每一条路径都锁定了选择它的开发者在未来十年内必须承受的代价。

管线即疆域。2018至2021年的这场战争划定了三大引擎帝国的新边界。边界的走向不是由市场宣传决定的,不是由GDC的主题演讲决定的,而是由构建日志中那些被反复访问十七次的文件、由那些在凌晨两点十七分停滞在83%的进度条、由那些从十二分钟膨胀到三小时的等待时间决定的。这些枯燥的数字,这些被损耗在格式转换和路径解析缝隙里的分钟和小时,正在重新定义谁能在这个行业中高效地工作,以及高效工作的标准本身由谁来制定。