了解 Megapop 如何利用实体组件系统 (ECS)的性能和可扩展性,构建其密集、有机增长的水下城市建造游戏。
挑战:
模拟数万种相互作用的海洋生物、定制的AI任务调度器以及动态珊瑚——所有这些都不会造成CPU瓶颈。
平台:
PC (Steam)
地点:
挪威奥斯陆
团队规模:
14名全职员工,3名自由职业者
《海底世界》这样的游戏是如何在不让玩家PC过热的情况下,模拟出一个密集、充满生机的海洋生态系统的呢?
Megapop的新款“珊瑚礁建造者”游戏让玩家的任务是恢复濒临死亡的海洋环境。玩家不再像在网格上放置混凝土建筑,而是扮演大自然本身,有机地培育珊瑚,并管理脆弱的生态系统,以吸引超过 55 种现实世界中的海洋生物,从小丑鱼和螃蟹到海豚用户和海獭。
要实现《Life Below 》充满活力的美学和游戏玩法,需要完全致力于数据导向型设计。通过将鱼类、野生动物和 NPC 工作人员组成的网络视为纯数据——连续内存中的数字而不是复杂的游戏对象——该团队解决了围绕鱼类行为、渲染规模、空间音频和生态系统模拟的复杂挑战,从而在PC上提供了高性能体验。

结果:
- 早期压力测试中模拟了多达 25 万条同类型鱼的鱼群。
- 在游戏后期,即使有数千个活跃生物,RTX 3060 也能保持 60 帧。
- 在低端机器上也能以 30 帧/秒的速度稳定运行 1300 多个互动动物。
- 专业测试人员的满意度高达 97.2%。
- 在长达 14 小时的后期游戏存档中,能够处理超过 15,000 个实体和 450 多个系统,并且运行流畅。
- 荣获2025年“Unity为人类”奖助金荣誉提名

致力于数据导向型方法
Megapop 在前期制作阶段就决定完全使用 ECS 构建Life Below 。“ECS 使我们能够将游戏构建成许多协同工作的小型系统,而不是依赖于庞大的类层次结构,”工作室创始人兼首席执行官 Jørgen Tharaldsen 说。“这样一来,通过组合更小部分的行为,就更容易构建复杂的模拟。”
对于 Megapop 团队来说,从面向对象的开发范式过渡到面向数据的开发范式是一次重大转变。为了弥合知识差距, 《Life Below》的技术负责人兼该项目中ECS的最初倡导者ITR借鉴了各种资源,从Unity的官方ECS文档和ECS示例,到来自Unity Discord社区和YouTube的实际建议。ITR 表示:“ Turbo Makes Games主办的Hot Path Show也为 DOTS 和 ECS 提供了一些更利基市场的资讯。”
程序员 Simen Wiig 在《Life Below 》发布前大约 18 个月加入 Megapop 时,学习 ECS 就被纳入了他的入职培训中。“最重要的是要理解数据导向的思维方式,而不是通常的面向对象的思维方式,”他说。“一旦我理解了这一点,我就非常喜欢组件和实体如何帮助我更好地组织代码。”
ITR 指出了对 ECS 入职流程影响最大的原则:“要坚持以数据为导向的方法,而不是试图混合太多不同的架构。保持系统规模小、功能集中,可以让项目在添加新功能时更容易扩展。

地下世界 | Megapop | Kasedo Games
为NPC创建任务调度器
在《海底世界》中,玩家不会直接向他们的 NPC 工人(一群维护珊瑚礁的水精灵)下达命令。相反,玩家设定目标(例如,在此处放置珊瑚,收获这些资源),自定义任务调度程序会自动为每个任务分配最佳工人。
调度器在Burst 编译的系统中运行,分三个阶段工作:首先,它使用 ECS 收集有关工作线程可用性、资源位置和待处理任务的广泛信息;然后,算法选择高优先级任务,同时保持任务类型分布的平衡;最后,它使用 ECS 检索详细信息,以找到最佳工作线程并规划每个步骤。ITR解释说:“我们使用分层函数编程来确保可以轻松添加新任务,同时确保游戏不会进入损坏状态。”
游戏后期高峰期,大约有 100 名工人同时工作。该系统是单线程的——不是因为技术限制,而是因为每个任务分配都取决于前一个任务的结果。ITR 表示:“这类似于操作系统中的任务调度程序,只不过我们在调度任务之前,而不是之后,就大致知道任务需要多长时间。”

地下世界 | Megapop | Kasedo Games
模拟复杂类人猿行为
许多游戏使用简单的 GPU 或Burst解决方案来实现集群行为。对于《地下世界》来说,Megapop 需要物种能够狩猎、逃跑和动态互动——包括与玩家进行近距离、面对镜头的遭遇。
“对于简单的boid模拟,使用Burst或GPU计算很容易就能运行,”Jørgen说。“但我们想要更复杂的行为,让不同物种互动,甚至让你通过近距离的摄像机视角与野生动物互动。”
利用作业系统,该团队将 boid 逻辑中可并行化的部分(基本位置更新和分离计算)与复杂的分支交互(如捕食者追逐)分离出来。并非所有物种对性能的要求都相同:像螃蟹这样的底栖生物模拟起来相对便宜,而像狮子鱼这样的捕食者则需要评估每一帧中的多种条件来捕猎、追逐和攻击其他物种。
营造生机勃勃的珊瑚礁
可视化数千个实体需要高度优化的渲染管线。Megapop 使用顶点动画纹理 (VAT) 来实现复杂的动物运动,例如游泳循环,并使用程序动画来实现较小的鱼群运动。环境也会对生态系统的健康状况做出反应:珊瑚会根据直接从 ECS 传递的参数动态地表现出藻类生长、压力和损伤状态。
实体图形和 GPU 实例化
该团队从开发之初就使用了 GPU 实例化,最初是通过自定义图形API调用,之后迁移到 Unity 的官方Entities Graphics 包。此次切换并非出于性能提升的考虑——两种方法都基于相同的底层技术——但实体图形使系统更容易使用,并显著改善了 ECS 集成。Megapop 的技术美术师兼程序员 Adam Hove 表示:“它更容易操作,并且与 ECS 配合使用效果更好。”
实体图形支持自定义 ECS 组件,这些组件会自动将数据作为每个实体的值上传到 GPU,每帧一次——但仅当这些值实际发生变化时才会这样做。这意味着数百个稳定实体不会不必要地重新上传缓冲区数据。GPU实例化本身可以确保屏幕上有数百个珊瑚和散落的装饰物不会导致绘制调用次数倍增:ITR解释说:“借助GPU实例化技术,您可以在一次绘制调用中渲染数千个珊瑚。”“所以,无论屏幕上显示五个同类型的珊瑚,还是五千个同类型的珊瑚,渲染速度都一样快。”

地下世界 | Megapop | Kasedo Games
通过Shader Graph实现动态珊瑚
每个珊瑚实体都含有维持健康、藻类生长和压力状态所需的内源性化学物质。利用实体图形的MaterialProperty属性,这些属性会自动上传到 GPU 并驱动Shader Graph参数,从而产生漂白、应激着色和藻类扩散等可见变化,而无需任何手动材质管理。Shader Graph也让不编写 HLSL 的艺术家也能参与其中,让他们可以直接迭代视觉结果并实时看到更改的效果。
调试面向数据的代码
调试面向数据的代码库与调试标准的Unity项目是不同的学科,Megapop 在Unity 6 方面的经验反映了该工具的成熟程度。ITR 表示:“6.0 版本新增了搜索窗口、性能分析标记和渲染图,这些功能对优化都非常有用。”
团队在发布前升级到了Unity 6.3 ,并注意到,在最新的受支持的 LTS 版本中,实体层次结构窗口和原生调试器等工具的稳定性大大提高。
实体层次结构对于在运行时检查实体状态至关重要,而 JetBrains Rider 的 ECS 特定功能(包括在单步执行代码时查看特定实体的组件信息的功能)使原生调试器更加有用。ECS 日志记录功能帮助识别哪个系统意外地更改了组件,并在优化过程中标记了不必要的写入。
利用Burst提升性能
玩家提交的 14 小时存档(作为错误报告)包含 15,000 个实体和 450 多个活跃系统——并且仍然以 60 fps 的帧率流畅运行。在典型的游戏后期场景中,完整的生态系统模拟每帧大约需要 0.5 毫秒的 CPU 时间,这很重要,因为游戏支持时间加速,每帧渲染会多次运行固定更新。
Burst是达到这些数值的关键:禁用突发功能会导致每帧模拟时间增加三倍以上。ITR解释说:“我们发现,对于很多系统来说, Burst就足以进行优化。Jobs 更适合代码中可以并行化的特定部分,这些部分会迭代处理大量实体。”
在单物种压力测试中:在 ITR 八年前的个人电脑上,以 60 帧/秒的速度运行 3,500 只螃蟹;而在高端工作笔记本电脑上,以 50 帧/秒的速度运行 7,000 只螃蟹或 5,500 条小丑鱼,并且全程都有活跃的生物互动。与团队之前的项目相比,DOTS 原生的垃圾回收器和分配器也显著减少了每帧的垃圾分配。
从经验中学习
《海底世界》将真实的海洋生物学与复杂的系统工程相结合,在城市建造类游戏中开辟了一片独特的天地。Megapop 的最新版本展示了 ECS for Unity在处理模拟密集型游戏时的可扩展性,并揭示了远超纯粹性能的结构优势。团队指出,例如,能够将程序集干净利落地拆分为数据和逻辑,意味着《Life Below》的编译速度比其他类似规模的项目快得多。
对于考虑使用 ECS for Unity制作游戏的开发者来说,团队的经验是一致的:学习曲线确实很陡峭,但投入是值得的。Adam 是 Megapop 下一个项目的技术负责人,他已经计划利用 ECS。他说:“一旦搭建完成,就很容易在此基础上进行扩展和完善。”
使用Unity构建更美好的未来
开发可扩展的、模拟性较强的游戏。ECS for Unity为您提供性能和架构工具,让您能够将复杂、生动的世界变为现实。
