移动/游戏
Godot 程序化生成内容时:用种子化 RNG…
在 Godot 中生成地牢、地形、战利品或关卡等程序化内容时,用种子化随机、后台线程与合适算法保证可复现、不卡帧且分布自然。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
Godot 程序化生成内容时:用种子化 特定
解决思路
- 每个关卡/分块使用独立的 RandomNumberGenerator,并持久化 seed 与 state,以便生成可分享、可复现的世界;不要用全局 randi()。
- 用 WorkerThreadPool.add_task 在后台线程计算分块数据,再用 call_deferred("_finalize_chunk") 回到主线程做 SceneTree/节点操作;绝不在主线程生成分块,也绝不在工作线程实例化节点。
- FastNoiseLite 不要每帧采样:一次性把噪声生成到 Image 或 Array 中,之后从内存读取。
- 对象放置不要用纯随机(白噪声),改用 Poisson Disk Sampling 或 Jittered Grids 避免聚集和重叠。
- 所有程序化循环(如 WFC、Cellular Automata)都要设置 max_iterations 安全中断,防止约束无解时进入死循环。
- 按布局需求选算法:蜿蜒隧道/河流/简单路径用 Drunkard's Walk;结构化房间+走廊用 BSP;有机洞穴/平滑地形用 Cellular Automata(4/5);高度图/生物群系/无限地形用 FastNoiseLite→Image;树木/岩石/生成点用 Poisson Disk;瓦片邻接/城市街区用 Wave Function Collapse(简单用 lite 版,复杂规则用完整版);先做房间图再做几何用 AStar 图布局;3D 体素/平滑地形网格用 Marching Cubes;无限分块 3D 地形用 ArrayMesh+LOD 分块;植物/分叉结构用 L-System;2D 等值线/metaball 用 Marching Squares。
- 简单布局不要用复杂 WFC,改用 Drunkard's Walk 或 BSP 这类轻量结构化方案。
- 大规模 TileMap 更新不要逐个 set_cell():准备 TileMapPattern 后用 set_pattern() 或 set_cells_terrain_connect() 批量写入。
- 程序化几何落地到主线程后,重新烘焙 NavigationRegion 的 navmesh,否则 AI 会撞墙。
- 生成世界后必须能序列化保存:保存 seed 和玩家修改,不要试图保存整个原始分块状态。
- 3D 地形用 ArrayMesh:在工作线程计算顶点、法线、索引,再用 add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, arrays) 提交;只对当前分块调用 create_trimesh_collision() 以保持物理更新快速。
- 地牢先建逻辑图再生成几何:用 AStar2D 的顶点表示房间、边表示走廊/门,可在生成任何网格前验证所有房间是否可达。
- 按需加载 references/algorithm-recipes.md 获取 Drunkard walk、噪声生物群系、BSP、战利品表、WFC 循环等深入配方;只打开与所选算法对应的脚本,不要加载整个 scripts/ 文件夹。
适用边界 · 注意事项
- 简单路径或矩形房间布局不要用复杂 WFC,属于过度设计。
- 不要每帧查询 FastNoiseLite 或在 _process 中采样噪声。
- 不要用全局 randi() 作为可复现种子,也不要在工作线程中直接操作 SceneTree 或 add_child()。