开放世界新卷法?腾讯9人30天复现180万平方米秦朝古都
以下文章来源于腾讯游戏学堂 ,作者陈宇青 余果
在今年的游戏开发者大会(GDC 2025)上,腾讯游戏带来20场议题分享,围绕AI、渲染、跨端游戏开发等游戏技术应用及游戏研发经验与全球游戏开发者探讨交流。本文为"程序化生成之路:重建秦朝古都"分享的图文版干货内容。
分享嘉宾:
陈宇青 腾讯游戏天美工作室T1技术美术
余果 腾讯游戏效能产品部技术美术
大家好,欢迎来到我们今天的分享会。我叫陈宇青,很高兴和我的同事余果一起和大家交流我们去年做的一个项目。这个项目是关于如何通过程序化方法构建一座城市。先简单介绍一下我自己,我于2020年加入腾讯,最近5年一直负责开发程序化内容生成(PCG)相关的工具集。在深入主题之前,我想先播放一段关于这个项目的视频。
我们将主要讨论四个话题。首先是项目背景,我们之前做过什么,以及我们为什么要构建这样一个演示项目。第二部分是我们的工具集架构,我们想要实现的一些目标,以及我们做出的一些设计选择。第三部分是实现细节,包括布局、建筑和兴趣点区域。最后一部分是总结。
这是预告片的一个片段。我想展示一下我们之前做的一些自然环境方面的工作。如大家所见,过去几年我们一直在构建一款开放世界类型的手机游戏。我们的目标是拥有64平方公里的可玩区域。其中64%的世界将是自然环境。接近40%将是像小镇和大都市这样的以人类活动为中心的环境。

左边的图片是我们之前完成的一座中型城市。我们采用的是人工密集型工作流程完成的,包含约2万栋建筑。我们花了21个人月来构建它,每次迭代需要2个人月。我们想要构建一座像右边图片那样的大都市,其规模是当前城市的16倍。如果采用旧方法,预计需要336个人月,基本上这是不可能完成的任务。那么我们应该怎么做呢?

带着这些问题,我们寻找了一些行业解决方案来帮助我们。育碧之前发布了一系列关于程序化生成的演讲,还有几款基于Houdini的解决方案在自然环境方面非常出色。

我们从中学到了很多,并且已经建立了一个构建自然环境的流程。正如您所看到的这些图片,它们是我们正在构建的世界的不同地点。但以人类活动为中心的环境仍然是个问题。

我们在寻找一些程序化城市解决方案,我们回顾了蜘蛛侠系列和《黑客帝国觉醒》技术演示。它们给了我们很多启发。

但关键在于,我们想要创建一座以中国古代为基础的城市,特别是秦朝(大约2600年前)。
这里有一些关于这座城市的参考,如您所见,它们的布局更加不规则。由于现代城市通常建立在大面积的平坦区域上,秦朝的城市通常围绕山脉建造,并且在垂直方向上有多个层次的结构。
所以我们意识到我们必须自己构建一个解决方案。这就是我们想要构建古代城市项目的原因。

现在让我们回顾一下在这个项目中我们需要实现的一些目标。
第一个目标是构建一个以艺术家为导向的工作流程。我们的艺术家将遵循四个不同质量阶段来制作高质量的场景,我们需要在PCG工作流程中尊重这一点。并且我们希望我们的艺术家在虚幻引擎内创建程序化内容,而无需打开其他应用程序。

第二个目标是遵循中国古代城市的布局设计。我们需要提供一些工具来帮助他们原型化城市的布局,就像左边图片展示的那样。同时,工具生成的内容也应该符合这些要求。我们对程序化元素的值和位置有一些限制。例如,我们不能有一个太窄的隧道或建筑物和墙壁之间太小的间隙。以符合游戏玩法设计。
第三个目标是提高生产效率。因为我们有手动完成这项工作的惨痛经历。

接下来谈谈我们对此的回答。我们构建了一个包含三个步骤的工具集。
第一步是为手动放置设计的。我们允许艺术家放置自定义的立方体和曲线,以代表主题区域和道路,从而快速原型化城市的关卡设计。
第二步基本上是一个交互式的PCG过程。我们将在艺术家在第一步放置的区域内程序化地生成更多的子盒子,以代表建筑物和多个PCG目标。艺术家可以调整盒子的位置、大小。并将它们发送去处理,来回调整PCG结果。
第三步,在每个庭院内生成更高质量的资源和装饰性内容,这部分的结果应符合交付质量。

另外一点是,我们通过两种自定义编辑模式扩展了虚幻引擎,即古代城市编辑模式和兴趣点(POI)编辑模式,这将允许艺术家直接在虚幻引擎内创建与PCG相关的所有内容。
在虚幻引擎和后端Houdini之间通过PCG服务进行数据传输。正如您所看到的,左边的图片是我们在虚幻引擎中的一个城市关卡,右边的是在Houdini中的传输代理数据,我们将把处理好的数据送回虚幻引擎以完成一个计算循环。

为了实现第二个目标,即尊重中国古代城市的布局要求。我们回顾了中国不同朝代的城市特征,我们发现每个朝代都有其独特的风格,像秦朝的闾里制和宋朝的街巷制。我们还调查了不同区域的布局规则,像居住庭院、花园、宫殿和传统寺庙,我们将在工具开发过程中尊重这种独特性。

对于我们第三个目标,效率提升部分,我们希望我们的关卡艺术家专注于POI区域,这些区域可能包含大量的游戏玩法设计。
因为城市80%的部分将是PCG部分(图片中的蓝色区域),而另外20%是POI区域,我们为这部分设计了特定的工具。

为了实现第三个目标,即效率部分。我们开发了分布式处理方法来加速我们的布局进度。多个区域可以同时处理,艺术家可以以高频率获得反馈。
对于一个单独的地块,我们可以通过参数控制生成多种结果,让艺术家挑选其中更好的一个。
此外,我们的PCG结果可以由艺术家手动修改,以决定该区域的最终外观。

我们整个框架由两部分组成。图片左侧的虚幻引擎界面和右侧的PCG后端,PCG服务将在它们之间进行数据传输。引擎界面旨在处理来自艺术家的数据输入,如绘制区域和立方体,接收来自PCG后端的数据。后端本身负责程序化相关的计算。

引擎界面将允许艺术家绘制区域和道路以原型化关卡设计。道路如果与输入区域重叠,将把它们分成子区域。就像这张图片中的红色和黄色框,这些子区域将是后续处理的基础。

PCG后端将从引擎接收区域数据,并根据我们之前提到的规则,如闾里制,递归且分层地运行计算。以匹配秦朝的风格。并且详细内容,如建筑物、内部道路、NPC和装饰性内容也将在该步骤中生成。

对于POI区域,艺术家可以使用我们的POI工具集快速创建多种元素,如绳索、标志、杂物、城墙或城市外的稻田。
接下来由我同事余果来解释PCG后端部分。

首先,它利用USD进行标准化。这不仅允许与行业中的其他数字内容创作工具无缝集成,还赋予了我们前所未有的表达能力。
其次,它是一个基于Omniverse构建的云服务。这使我们能够更轻松地与团队成员合作,并在需要时扩展计算资源。
第三,它采用Houdini进行布局算法。Houdini仍然是程序化内容生成最强大的工具,并且它与Flow在云端配合得非常好。
最后,它利用分布式并行计算,使我们能够快速高效地生成大规模内容。
此外,它与UE5中的新PCG图集成了良好的配合,这一点我差点忘了提及。希望这能回答"为什么还要使用另一个PCG框架?"这个潜在问题。


另外,它已经被无数电影作品测试和证明。

USD,凭借其能力,已在业内广泛采用。除了在业内的广泛采用,我们还非常重视USD的高性能和高扩展性。

由于USD被设计为快速且高效,它可以轻松处理大规模内容。USD具有将修改后的内容保存在单独文件中的能力,这就像一个补丁,这种补丁般的行为进一步降低了通信成本,并与Flow框架完美结合。

众所周知,USD诞生于皮克斯,为电影行业服务,许多功能都是围绕他们的需求开发的。另一方面,我们是游戏开发者,USD在某些方面尚未覆盖,例如在虚幻引擎中,我们有地形、植被、蓝图等。
幸运的是,USD极其灵活。我们可以传递任意数量的属性,可以定义自己的语义,并且可以表达资产、组件、Actor及其属性间的复杂关系。这对于设置虚幻场景至关重要。

凭借这些特性,我们现在可以用USD表示一个完整的虚幻场景。通过这种方式,通过USD,我们可以在Houdini中完全控制虚幻场景。

在这个例子中,我们在一个属性中放入了一大块文本数据,这样可以确保生成的虚幻Actor在虚幻中可重新编辑,这个属性有时可能高达数十MB。
这当然不是USD原本的设计用法,但它可以毫无问题地处理这种用法。而且,用其他格式很难实现这个功能。

让我们来谈谈在云端运行Houdini的好处。实际上,这是我们构建Flow框架的最初动机。

最后,分布式计算。这是我们为古代城市项目构建的,并且极大地提升了性能。现在有了我们现有的工具,这已经变得很容易了。
布局算法本质上是可并行化的,因为每个区域可以独立计算。这使它们成为分布式计算的理想候选者。随着Houdini实例已经在云端运行,USD文件已经存储在云端,这只是调度任务和收集结果的问题。
在这张图片中,一个用户提交了一个任务,许多工作进程同时处理它。但由于我在用户名上打了马赛克,可能看起来不太清楚。
无论如何,凭借这个框架,大型城市可以在几分钟内生成,陈宇青稍后会列出具体数字,现在我觉得是我把时间交还给陈宇青的时候了,多谢。

好的,多谢我的同事,欢迎回到我的频道。这部分是关于我们如何实现不同区域的布局设计的。
我们的城市布局可以分为两种类型,定居点型建筑,如平民区和富人区,还有像政府大楼和皇帝宫殿这样的大型建筑。

我想再详细解释一下我们的布局规则闾里制。
秦朝在当时是一个军事化的国家,所以政府用非常严格的法律来统治人民,居住区的布局也是这种统治的反映。所以有一句来自我们古籍《周礼》的谚语,它说五户为一比,五比为一闾,所以这个规则被称为闾里制。

闾里制的布局更像是一个棋盘,从这些图片中可以看出,尤其是右上角和左下角的图片,它就像一个网格空间。为了获得更好的视觉效果,我们在原始的闾里制基础上添加了尺寸变化。以打破这种高度重复的韵律。

以平民区为例,我们的技术美工在Houdini中开发了算法,以递归的方式划分和生成布局。
我们将有一个输入区域块,这是艺术家在虚幻引擎中创建的。这个块将被划分为几个闾里单位,一些内部道路数据也会生成。每个闾里单位将在第三步被再次划分为几个小庭院,在第四步根据之前的结果生成建筑物和墙壁,第五步生成更多的装饰性内容,如生物群落区域和NPC。
最后我们将这些数据读回虚幻引擎。
第六步还有一个第三人称视角查看。

富人区的开发遵循相同的逻辑,但具有更多的空间和更整洁的布局。
你可以看到第五步的图片。

对于政府大楼,重点在于它将占据更大的空间,并且在建筑规模上具有更高的对比度。
它总是会有一个主庭院和一个大建筑在里面。

所以我们的技术美工将输入区域块划分为至少一个带有英雄建筑的主庭院。
在我们为这部分开发的算法中,我们总是通过动态规划算法找到输入区域的最大内接触矩形,无论艺术家输入的形状如何,工具将始终确保有足够区域来放置我们的英雄建筑。其他子区域遵循之前的相同逻辑。
你可以在第五步看到最终结果。
为了使政府区域的布局多样化,我们开发了一种称为共线编辑模式的特定编辑方法。
由于我们的布局总是由Houdini生成,艺术家在处理之前无法看到结果。
这个功能将在Houdini的第一次处理时创建操作器。并允许艺术家根据视觉结果进行修改,而无需依赖Houdini。我们的艺术家可以避免输入参数并反复尝试。
从视频中可以看到,我们通过拖动布局边界轻松调整了一个政府区域的布局。

这种共线编辑模式是一种基于几何算法的操作,灵感来源于室内设计理念。当艺术家拖动布局边缘时,会触发拆分或吸附行为,以帮助艺术家重新定义现有布局。

我们用这个功能来构建秦朝的皇宫。
第一步我们编辑一个由Houdini生成的现有布局,然后将结果发送到后续的第二步、第三步和第四步。第五步是最终结果。

如果你还记得,我们仍然需要在庭院内生成详细内容,主要有四个主要类别需要生成。建筑物、内部道路、NPC和一些装饰,如内部花园。

庭院的建筑设施也可以有多种类型,如主建筑、副建筑、后院建筑和墙壁。它们各自有不同的要求,我将在后面建筑编辑器部分详细讲解。

对于像内部花园这样的装饰性内容。我们设计了一种特殊的方法,结合虚幻PCG框架与Houdini计算。
例如,一个花园将根据不同的区域进行变化,如富人区或平民区,有些部分需要艺术家预先定义,比如这个区域可以使用什么样的树。但花园的轮廓和生物群落位置可以随机变化。
所以我们有一个称为本地PCG的过程。艺术家可以在虚幻引擎中原型化花园预设的外观。就像左边视频显示的那样。艺术家正在使用基于虚幻PCG框架的工具编辑这个预设。

我们将这个预设及其名称、权重和一些重要参数(如是否启用树木生成)一起传递。让Houdini后端来决定分布过程。

当我们把数据读回虚幻时,有一个根据Houdini的输出实例化我们预设的过程。正如图片所示,一个政府区域内的花园被生成。
通过这种方式,我们的艺术家可以直观地原型化PCG元素,并且这部分的关键外观得到保证。同时,我们避免了大量点云数据的输入和输出。

对于道路和NPC,我们也使用了这种方法。

为了更高效地组织模块并重复使用它们。我们创建了两个新概念。
1. 建筑模块,它由一个单一模块资产和一个单一语法规则组成。就像图片的中间列。这个建筑模块可以导入和导出以供重复使用。我们不需要每次都从头创建规则
2. 建筑模板,它由几个有序的建筑模块组成,它可以附加到一个建筑块上,用于形成更大的建筑。
我们还开发了一个称为布局融合的功能,它包含两个操作,合并和切割。
这将帮助艺术家处理类似布尔操作的任务。
有些建筑可能需要部分调整大小。这里有一个锚点系统。
这是一个三维锚点系统。我们用这些锚点来控制哪部分需要固定,哪部分可以调整大小。
我们还为艺术家提供了程序化生成功能。他们可以快速通过几次点击弹出不同的建筑。

在我们的城市中,有许多具有独特特征的兴趣点区域。它非常依赖艺术家的手动放置,也很耗时。简单说几句。

所以我们设计了一套POI工具来增强场景的多样性并提高该区域的游戏玩法设计。
这张图片是我们创建的一个POI区域。通过结合使用我们的POI工具。

关于这些工具的框架设计,我们设计了一个虚幻C++基类来封装基本工具行为,如初始化或退出过程,和一个交付类来处理鼠标交互逻辑,如点击和拖动。
线基类继承自鼠标交互类,用于处理曲线形状的创建和编辑。我们有一系列工具继承自该类,如路径对齐分布工具、河流生成工具或城墙生成工具。
每个工具将生成一个新类,称为生物群落代理,就像右边图片显示的那样。这是我们生成PCG内容的区域。

对于生物群落代理,我们使用蓝图系统来扩展它,并在幕后使用虚幻PCG系统。由于我们的工具基于虚幻PCG框架,我们的技术美工可以轻松将其扩展为不同的POI工具。让我们快速看一下这些工具。
曲线散射工具我们用这个工具在建筑前放置一些马车。这是最常用的工具之一。
标志工具。我们通过识别建筑的结构框在建筑表面创建标志。
我们用NPC工具创建行人。
我们用城墙工具创建城墙,并通过拖动墙段而不是样条点来调整它,这对艺术家来说非常方便。它可以适应地形变化,并可以在城墙模块之间插入建筑。

我们在城市外创建稻田。该工具支持不同的模式,如曲线形状和直线。还可以在稻田中生成农民和一些设施。

正如我们之前提到的,用手工方法构建这样的城市需要336个人月才能完成,每次迭代需要32个人月。通过使用我们的古代城市工具集,我们将成本降低到9个人月完成,0.5个人月迭代。对于未来,我们认为虚幻PCG框架可以在游戏开发中扮演重要角色。
最后。我想感谢我的古代城市团队,过去一年我们一直在努力工作,终于完成了这个项目。很高兴成为这个团队的一员。
游戏葡萄招聘内容编辑,
