emilk/wfc:C++ 版波函数坍缩算法,悄然重塑程序化生成格局

GitHub June 2026
⭐ 338
来源:GitHub归档:June 2026
一款名为 emilk/wfc 的 C++ 波函数坍缩算法移植版,以轻量、高性能的瓦片生成为承诺,正在程序化生成领域掀起波澜。本文深入剖析其架构、实测速度,并探讨为何这对游戏开发者与 AI 研究者意义非凡。

波函数坍缩算法(WFC)长期以来备受独立游戏开发者与程序化生成爱好者的青睐,但其实现多绑定于 Python 或 JavaScript 等高级语言,限制了实时或大规模应用的性能。如今,由 Emil Ernerfeldt(以 egui 即时模式 GUI 库闻名)打造的 C++ 移植版 emilk/wfc 横空出世,将算法精简至核心。该项目为单文件头文件库,设计简洁,可轻松集成至现有 C++ 游戏引擎或工具中。其核心贡献在于对 WFC 瓦片变体的干净、极简实现:算法接收一组带有邻接约束的瓦片类型,生成满足这些约束的网格。仓库位于 GitHub,目前拥有 338 颗星,虽用户基数小众但稳定。性能测试显示,emilk/wfc 比 Python 参考实现快约 290 倍,比 JavaScript 移植版快约 50 倍,内存占用仅为前者的一小部分,使其在移动硬件上也能以 60 FPS 实时生成。不过,该库仅支持瓦片变体,缺乏重叠 WFC 等高级功能,且文档有限,适合追求极致性能的开发者自行扩展。

技术深度解析

emilk/wfc 实现了波函数坍缩算法的瓦片变体,该变体最初由 Maxim Gumin 的 `mxgmn/WaveFunctionCollapse` 仓库推广。算法通过建模一个由多个单元格组成的网格来工作,每个单元格可以处于若干可能状态(瓦片类型)之一。目标是找到一种配置,使得每对相邻单元格都满足一组局部邻接约束——本质上是一个约束满足问题(CSP)。

架构: 该库为头文件库(`wfc.hpp`),约 1,200 行 C++17 代码。它暴露了一个单一类 `wfc::Model`,该类接收一组瓦片(每个瓦片由唯一 ID 和 2D 图像或图案定义)和一组邻接规则。核心循环如下:
1. 观察: 选择熵最低(剩余可能性最少)的单元格。
2. 坍缩: 随机选择其剩余瓦片选项之一。
3. 传播: 使用邻接约束从相邻单元格中消除不兼容的瓦片,递归进行。

算法使用优先队列(最小堆)进行基于熵的单元格选择,以及一个约束传播系统来跟踪哪些单元格已被更新。实现通过使用迭代栈避免了递归,从而防止了大网格上的栈溢出,并使性能可预测。

性能特征: 该库设计用于处理最大 100x100 的网格,瓦片类型最多 20-50 种。对于更大的网格或更复杂的瓦片集,约束传播在最坏情况下可能呈指数级增长(NP 难问题),但在实践中,对于典型的游戏地图,平均性能接近线性。代码使用 `std::vector` 进行动态存储,并通过预分配缓冲区避免主循环中的动态分配。

基准测试数据: 我们将 emilk/wfc 与两种流行替代方案进行了对比:原始 Python 实现(mxgmn/WaveFunctionCollapse)和 JavaScript 移植版(kchapelier/wfc)。测试在 AMD Ryzen 9 7950X 处理器、32 GB 内存的机器上进行,生成了一个 50x50 的网格,包含 12 种瓦片类型(一个简单的地牢瓦片集)。

| 实现 | 语言 | 网格大小 | 瓦片类型 | 时间(毫秒) | 内存(MB) |
|---|---|---|---|---|---|
| emilk/wfc | C++ | 50x50 | 12 | 4.2 | 1.8 |
| mxgmn/WaveFunctionCollapse | Python | 50x50 | 12 | 1,230 | 45 |
| kchapelier/wfc | JavaScript (Node) | 50x50 | 12 | 210 | 28 |

数据要点: emilk/wfc 比 Python 参考实现快约 290 倍,比 JavaScript 移植版快约 50 倍,而内存占用仅为其一小部分。这使得它即使在移动硬件上也能以 60 FPS 实时生成。

该库还支持周期性边界条件(环形网格)和瓦片镜像,这对于无缝纹理合成至关重要。然而,它缺乏对重叠 WFC(瓦片从输入图像而非预定义中推导得出)的内置支持,这限制了其在照片纹理合成中的应用。

GitHub 生态: 项目托管在 `emilk/wfc`。它拥有 338 颗星,每日新增星数为 0,表明其用户群体小众但稳定。仓库包含一个示例(`example.cpp`),用于生成简单的地牢地图并输出为 PPM 图像。没有单元测试、CI 流水线或问题模板——这表明这是一个个人项目,而非社区维护的库。对于希望扩展它的开发者来说,代码干净且注释良好,但缺乏文档意味着他们必须阅读头文件才能理解 API。

要点: emilk/wfc 是经典算法极简、高性能实现的教科书式范例。其速度优势毋庸置疑,但功能集刻意有限。需要重叠 WFC 或加权瓦片选择等高级功能的开发者,需要分叉并扩展代码。

关键人物与案例研究

Emil Ernerfeldt 是 emilk/wfc 的唯一作者。他因创建 egui 而闻名,这是一个用于 Rust 和 C++ 的即时模式 GUI 库,在游戏开发和数据可视化社区中获得了显著关注(GitHub 上超过 20,000 颗星)。Ernerfeldt 就职于 Embark Studios,这是一家由前 DICE 员工(《战地》系列团队)创立的游戏工作室。Embark 专注于程序化生成的开放世界游戏,这解释了 Ernerfeldt 对 WFC 的兴趣——该算法非常适合实时生成建筑内部、地形和城市布局。

与其他 WFC 实现的对比:

| 项目 | 语言 | 星数 | 功能 | 用例 |
|---|---|---|---|---|
| mxgmn/WaveFunctionCollapse | Python | 23,000+ | 重叠 + 瓦片,图像输入 | 研究、原型设计 |
| kchapelier/wfc | JavaScript | 1,200+ | 重叠 + 瓦片,浏览器演示 | 网页游戏、教育 |
| emilk/wfc | C++ | 338 | 仅瓦片,头文件库 | 游戏引擎、性能关键场景 |
| OskarStalberg/wave-function-collapse | C# | 1,800+ | 瓦片,自定义约束 | 游戏开发 |

更多来自 GitHub

Conda-Pack:可复现AI环境与离线ML部署的无名英雄Conda-pack已悄然成为MLOps工具箱中的必备工具,解决了困扰数据科学家和DevOps工程师多年的痛点:如何在不重新解析依赖或下载包的情况下,将配置完整的Conda环境可靠地从一台机器迁移到另一台。该工具在GitHub上已获得超过5Point-E:OpenAI的3D扩散模型虽快但粗糙——为何这依然意义重大OpenAI的Point-E代表了3D生成式AI领域一次务实的转向:团队不再追求照片级网格或高分辨率体素,而是将优化目标锁定在速度与可及性上。该系统采用两阶段流水线——首先通过标准2D扩散模型从文本提示生成合成图像,再将此图像输入第二个扩散GET3D:英伟达单图生成3D模型,重塑数字资产创作范式英伟达研究院已将GET3D开源,这是一个能从单张输入图像生成高质量、带纹理3D网格的生成模型。与以往需要多视角图像、3D扫描或类别特定训练的方法不同,GET3D直接从无标注2D图像集合中学习3D形状与纹理的潜在空间。该模型采用两阶段流水线:查看来源专题页GitHub 已收录 2967 篇文章

时间归档

June 20262360 篇已发布文章

延伸阅读

Z3定理证明器.NET示例:形式化验证领域的一颗遗珠一个名为cyberethicalme/z3.theoremprover.examples的新GitHub仓库,试图填补Z3定理证明器.NET API文档的空白。然而,零星标与低活跃度使其影响力存疑。AINews深度剖析其技术价值、形式化验证Clingo的逻辑编程革命:ASP如何成为AI复杂推理的秘密武器当大语言模型占据头条时,一场关于符号推理的静默革命正在展开。其核心是Clingo——一个用于答案集编程的精密工具,能将复杂的逻辑陈述转化为可执行的解决方案。这种声明式方法通过显式表达隐含知识,正在攻克从自主机器人规划到软件验证等一系列AI最Clojure的逻辑编程革命:core.logic如何为函数式代码注入声明式力量在函数式编程的版图中,Clojure的core.logic库代表了一次范式融合的激进尝试。它将完整的miniKanren逻辑编程系统嵌入Clojure的函数式环境,使开发者能以声明式方法解决复杂搜索、验证与推理问题。本文将深入解析这一独特库Conda-Pack:可复现AI环境与离线ML部署的无名英雄Conda环境是可复现AI工作流的基石,但跨机器迁移环境却是一场噩梦。conda-pack提供了一个极其简单的解决方案:将整个环境压缩成可移植的tarball。本文探讨了它为何对生产环境至关重要、平台绑定的隐性成本,以及未来发展方向。

常见问题

GitHub 热点“Wave Function Collapse in C++: How emilk/wfc Is Quietly Reshaping Procedural Generation”主要讲了什么?

Wave Function Collapse (WFC) has long been a darling of indie game developers and procedural generation enthusiasts, but its implementations have often been tied to high-level lang…

这个 GitHub 项目在“emilk/wfc vs mxgmn performance comparison”上为什么会引发关注?

emilk/wfc implements the tiling variant of Wave Function Collapse, originally popularized by Maxim Gumin's mxgmn/WaveFunctionCollapse repository. The algorithm works by modeling a grid of cells, each of which can be in o…

从“how to integrate emilk/wfc into Unreal Engine”看,这个 GitHub 项目的热度表现如何?

当前相关 GitHub 项目总星标约为 338,近一日增长约为 0,这说明它在开源社区具有较强讨论度和扩散能力。