人流与排队系统的真实感模拟 Crowd Flow & Queuing Simulation
别让顾客排队排到怀疑人生:拆解路径选择、拥堵与队列的底层模拟逻辑
为什么人流与排队是经营游戏的隐形骨架
我见过太多经营模拟游戏,经济循环设计得滴水不漏,资源链条严丝合缝,结果一进游戏,顾客全堵在大厅里,骂骂咧咧地退款走人。你辛辛苦苦搭的乐园,因为一条动线堵死,口碑直接从五星崩到一星。说句难听的,人流和排队系统是经营游戏的隐形骨架,骨架歪了,皮肉再好看也撑不起来。
你以为你在设计一个公园、一座监狱、一家医院,其实你是在设计一个流体网络。每个 NPC 都是水分子,他们沿着路径流动、汇入瓶颈、在服务台前排成队列。如果你的流体力学没学好,游戏里就会发生现实中最魔幻的场景——所有人挤在一扇门里,心电感应般集体卡顿。
这篇我们聊透它。从单个 NPC 怎么选路,到人群怎么互相拥堵,再到你作为策划怎么用参数和质量指标把控体验。中间我会用《监狱建筑师》(Prison Architect)和《双点医院》(Two Point Hospital)做案例拆解,这俩一个把人当囚犯管,一个把人当病人治,但底层的流动模拟逻辑出奇地一致——而且都踩过坑。
第1层:路径选择AI——从最短路到感知代价
每个 NPC 从 A 点走到 B 点,第一步是决定怎么走。最简单粗暴的是最短路算法(BFS/Dijkstra),网格地图上算出最短路径。但这会带来一个经典问题——所有 NPC 都走同一条最短路线,于是走廊被堵成早高峰地铁。
所以进阶做法是'感知代价'。每个格子不只是通行/不可通行的二元状态,而是带一个动态权重:太拥挤的格子代价高,刚被踩过的泥地代价高,照明良好的宽走廊代价低。NPC 选择的不再是物理最短,而是'感知最舒服'的路径。这就像现实里你下班回家,高德地图让你绕三公里走快速路,你心里骂娘但手还是点下了'开始导航'。
但这套逻辑有个天然矛盾:如果所有 NPC 都用同一套代价计算,他们还是会涌向同一条'最优'路径。解决方法是给每个 NPC 的路径决策加一点随机扰动——有人对拥堵的敏感度是 0.3,有人是 0.8,还有人干脆就喜欢走没人走的小路。这一小撮'反叛者'往往能救活你地图角落里那些冷清的区域。
| 方案 | 机制描述 | 体验效果 | 实现成本 |
|---|---|---|---|
| 纯最短路 | 无视拥堵,只算物理距离 | 玩家容易预判,但高峰必然堵死 | 极低 |
| 静态代价图 | 预计算区域人流量,手动调节权重 | 平衡较好,但动态变化无感 | 中 |
| 动态代价图 | 每帧更新拥堵系数,影响后续寻路 | 最真实,但可能震荡导致 NPC 反复横跳 | 高 |
| 扰动与个性参数 | 每个 NPC 有不同容忍度和偏好 | 人性化,群体分布自然散开 | 中 |
案例:《监狱建筑师》的罪犯动线。这游戏里的囚犯会在固定时间点集体涌动——从牢房到食堂,从食堂到工坊。早期版本用纯最短路,结果每个食堂门口都堵成一锅粥,囚犯因为吃不上饭开始暴动。设计者最后加了几个暗招:一是不同牢房的囚犯会被分配到不同的食堂(强制分流);二是每条路径有一个隐藏的'通风度'权重,宽的走廊在寻路时会被轻微加分;三是加入'避开看守'的微小倾向。效果立竿见影,至少暴动不再因为吃饭迟到而触发。
所谓'真实感',不是最精确的物理模拟,而是让玩家觉得'这地方人多的时候会乱,但我能通过设计改变它'。如果你的 NPC 全走最短路,玩家一眼就能看穿整个系统的'人工味',经营乐趣直接腰斩。
第2层:拥堵系数与碰撞——个体之间的隐形博弈
路径选好了,接下来是走的过程。两个 NPC 迎面碰上怎么办?要停下来让路还是侧身挤过去?这个微观层面的交互,决定了你的游戏是'人群流动'还是'人群蠕动'。
碰撞解决的常规思路是'排斥力场'——每个 NPC 对自己周围一小圈范围产生微弱斥力,越近越强,就像两块磁铁同性相斥。这套模型(Particle-based model)优点是好实现、好控制,缺点是容易抖动——两个 NPC 在窄通道里互相让路,可能来回切换 5 次方向,看着像在跳探戈。
更聪明的办法是'协商机制':当两个 NPC 预判到三秒后会冲突,他们会各自轻微偏移目标方向,让出一个安全的交错角度。这不需要复杂的路径重算,只是一点点速度方向上的微调。你在地铁里和陌生人擦肩而过时,会本能地侧一下肩,这就是协商。
但协商机制最怕一个东西——高密度。密度一旦超过阈值,协商就退化成原地摩擦,所有个体锁死在微小的抖动中,人群系统崩溃在沉默里。这时候必须引入'强制解堵':如果一个 NPC 在当前位置停留超过若干秒,就给他一个临时'推搡'状态,无视部分碰撞,强行向目标挤过去。玩家看起来就是'人潮硬挤了过去',这其实比你想象的更真实——现实中的人群踩踏,也是这么发生的。
案例:《双点医院》的排队与摩擦。这游戏里有一个隐藏属性叫'耐心值'。病人等太久会掉耐心,掉到零直接暴走离开。但《双点医院》的高明之处在于它把碰撞和排队做成了同一套系统的两面——病人看病不是一对一进诊室,而是一群人在门口排队,队伍越长,后来者越容易在附近‘罚站’。当你建了过多诊室但没有足够的候诊座椅时,病人就会站在走廊中间,成了人形路障,堵住后续所有人。玩家这时要做的不是调参数,而是重新规划空间。这游戏的碰撞模型特意保留了'人形路障'这一层——因为设计者觉得这是'空间规划错误的代价表达'。你说它真实吗?有点夸张,但玩家确实感受到了空间设计的因果链。
| 密度区间(人/平方米) | 群体行为 | 需要的手段 |
|---|---|---|
| 0-0.5 | 自由流,路径决策无感 | 不需要干预 |
| 0.5-1.5 | 轻微摩擦,需要协商避让 | 碰撞解算 + 微调导航 |
| 1.5-3 | 明显拥堵,队列形成 | 强制等待、泄洪机制 |
| 3+ | 死锁风险,群体瘫痪 | 推搡机制、AI 传送、硬性分散 |
第3层:容量-队列建模——服务点的吞吐魔术
游戏里最容易被玩家感知的排队,是服务端的队列。收银台、售票口、诊室门口,这些点是吞吐量瓶颈。你要设计的是:几个服务点、排一条队还是多条队、队列最大长度多少、窗口服务时间多长。
一个经典的设计陷阱是'每条队列绑一个窗口'。这是老式银行柜台的做法,问题在于:一旦某个窗口的服务员走神了(或者技能低),这条队就慢得让人抓狂,而旁边的队快如闪电。玩家看着自己排的队伍一动不动,会把这口锅扣在游戏头上——事实上,现实中当超市开了十个收银台而只有一个有人时,这种愤怒我称之为'M/M/c 排队模型的现实代价'。你好心多开的窗口,反而成了玩家情绪摩擦点。
所以现代经营游戏普遍采用'单队列+多窗口'模式——所有人排一条队,哪个窗口空了谁就上。这是机场安检的排队方式,也是《双点医院》诊断区的标准做法。它牺牲了一点点真实感(现实中你会挑一个看着快的队),但交换来的是玩家情绪的公平感——'我等得起,因为所有人都在等'。
但单队列也有麻烦:队伍太长时会透出边界,挡住过道。这时候需要设计'排队上限'——队伍满员后,新来者会'稍后再来'或'愤怒离开'。你的游戏需要让玩家看到这个上限被突破,否则他们会一脸懵:'人怎么越来越少了?'
参数化建议:服务时间建议落在 3-8 秒(游戏内时间),队列容量建议是服务窗口数的 5-8 倍。超过这个比例,玩家就需要通过增加窗口或提高服务效率来应对,这是经营的节奏压力点。低于 2 倍,排队形同虚设,经营系统失去'吞吐优化'的乐趣。
第4层:网络流近似——全局流向的艺术
前面的层是微观的,这一层是宏观的。如果把你的地图看成一个管道网络,每个 NPC 是水分子,那么整张图就是一张流网络。你作为策划,最需要关心的是:哪些边是瓶颈,哪些节点会过载,全局的吞吐量是否跟得上你的经济目标。
网络流近似的核心思路是:不要试图实时模拟每一个 NPC 的完整路径(那是物理引擎的活),而是用粗略的概率模型去估计群体的流动方向。比如一个区域有 100 个 NPC,会根据不同出口的吸引力概率,估算出各出口的分配比例。你不关心其中某个张三去哪,你关心的是整体流量分布。
这套模型对性能优化帮助极大——你可以把动态人流系统降级为静态统计指纹,用于 UI 显示或经济预测。但对玩家来说,'真实感'在于:他们希望看到自己调整了动线之后,拥堵真的缓解了。如果你的网络流模型太粗糙,把房间和走廊抽象成节点和边,那玩家把一条走廊拓宽后,可能会看到人流变化幅度很小——因为抽象模型里走廊的'容量'本来就不敏感。
我的建议是:宏观网络流做'引导',微观粒子模型做'表现'。两者结合,玩家能直观感受到'拓宽走廊带来流动改善',同时你的性能还能撑得住 500 个 NPC 同时活动。这就像做游戏 UI,数据层和表现层分离,各干各的,中间通过事件通信。
案例:《双点医院》的全局流量热力图(玩家视觉)。开修改器看每张地图的流量数据,你会发现走廊交汇处永远是红色(高拥堵)。这个热力图不是给玩家的,但其影响直接反映在病人耐心下降和退款上。玩家能感受到的是:走廊尽头那片没有座椅的区域,永远挤着一群病恹恹的人。设计者的意图很清楚——让人流压力变得'可读',即使系统本身不会告诉你数值,玩家通过观察空间和情绪反馈就能推论出问题所在。
这告诉我们一件事:网络流不需要完全精确,但必须有一层清晰可见的表现反馈,让玩家觉得自己在'玩游戏',不是在'调参'。
参数化设计工具:从手感数据到调试地图
说了这么多,给一套能直接上手的配置表。以下参数是经营游戏调人流时最常用的,建议从这些区间起步,微调幅度每次不要超过 15%。
| 参数名 | 建议区间 | 影响 | 调试建议 |
|---|---|---|---|
| NPC 基础移动速度 | 2-4 格/秒 | 太快显得急躁,太慢觉得卡顿 | 以玩家肉眼可追踪为上限 |
| 拥堵感知半径 | 1.5-3 格 | 越大避让越早,越小人越容易挤堆 | 地图密度高时调小,低时调大 |
| 排队最大容量 | 窗口数 x 5~8 | 决定缓冲空间和玩家调整窗口的时间窗口 | 观察玩家'放弃等待'的反馈频率 |
| 服务时间 | 3-8 秒 | 过长消磨耐心,过短无吞吐压力 | 用玩家完成率微调 |
| 随机路径扰动幅度 | 0.1-0.3 格偏移 | 轻微散开人群,过大会失去设计感 | 调试地图时看角落是否有人去 |
| 强制解堵时间阈值 | 1.5-3 秒 | 死锁后多久开始推挤 | 卡住过久会导致群体情绪暴跌 |
你可能还会需要一个'调试上帝视角'——把 NPC 的当前路径、目标、耐心值、拥堵感知叠加显示在屏幕上。这一步比大部分功能都重要。游戏机制设计的核心是'看见系统在做什么',而不是猜。
双路径对照:初级用户速览与进阶深入
初级用户速览(5分钟上手):记住三件事。第一,NPC 选路不是选最短,而是选'舒服';给走廊、照明、宽度设权重。第二,排队用'单队列多窗口'永远比'多队列多窗口'省心,玩家心里更舒坦。第三,密度超过阈值就强制推搡,别让 NPC 卡死在原地演默剧。依着这三条,你就能做出一个让人流基本不太堵的经营模拟基底。
进阶深潜(读读这篇的犄角旮旯):你需要理解流量和情绪之间的双循环。拥堵导致排队,排队导致耐心下降,耐心下降导致负面情绪反馈到 NPC 的决策里——不良情绪会让 NPC 的更愿意放弃队列去别的设施,这会引发次生拥堵。一个成功的经营沙盒,会把这套'情绪回路'作为地图压力的第二层玩法。你能做到玩家不需要看数值,仅通过人群的语音或肢体语言就能判断哪里出了问题的程度,你的系统就活了。
另一个进阶方向是'混沌防御'。动态代价图最怕的是多个瓶颈同时触发,导致整个地图陷入振荡——所有人都往同一个方向涌,然后又集体掉头。这在真实人流中也会发生,但更常见于多瓶颈相互耦合的场景。工程解法是给导航算法加入'迟滞'——决策一次后,一段时间内不重新计算路径。代价是群体反应变慢,收益是系统稳定。这不是一个容易的取舍,但它是一个值得做的取舍。
争议与常见坑
坑1:追求无拥堵。很多策划把'消除拥堵'当目标,这是错的。如果你的地图永远通畅,玩家就没有优化的压力,经营系统的'吞吐优化'乐趣直接蒸发。正确目标是'拥堵可管理'——玩家能通过设计手段(加宽通道、增加窗口、调整布局)把拥堵控制在一个可接受的范围内。完全消除是不健康的。
坑2:把模型做得太复杂。你做了流体力学级别的精度,NPC 会侧身让路、会依照流体压力绕障碍、会视觉躲避。结果是什么?性能掉一半,玩家感知不到区别,还徒增 Debug 难度。记住,玩家看到的是'人群的感觉',不是'流体的精确'。把多出来的性能预算拿去做 UI 反馈,性价比高得多。
坑3:忽视极端状态。一定要设计好事件式人流高峰的承载能力。比如你的游戏有节日活动,全地图 NPC 数突然翻倍,你的碰撞系统会不会崩?排队会不会溢出整个屏幕?这需要在开发早期就预留压力测试场景,别等玩家发现了再修。
坑4:玩家眼中的'排队'。玩家对队列的感知是非常敏感的。如果你把队列设计成地面上一个圆圈,NPC 站在圈里等待,玩家会觉得这就是传送门,很假。但如果你让他们站成一排,有头有尾,玩家就会自动脑补'这是在排队'。现实队列的'线性视觉'是游戏真实感的重要来源,哪怕排队逻辑是空间无关的。
FAQ
Q1:我该用网格寻路还是导航网格(NavMesh)?经营模拟游戏里绝大多数用的是网格。因为你的建筑和道路天然是网格化的,而网格寻路在动态代价更新时更直接——你改一个格子权重,所有路径自然跟着变。NavMesh 适合大地图自由地形,但动态修改障碍物时的重建代价会让你头疼。
Q2:NPC 数量太多导致性能下降怎么办?核心思路是分级更新。离玩家近的区域,用完整的碰撞和导航逻辑;离得远的区域,只做简单移动;更远的区域,干脆只是'定时传送概率分布'。这其实就是经典的 LOD 思想,只不过 LOD 用在渲染上,你用在 AI 更新频率上。玩家肉眼上看不太出来,但性能可以省下 60%。
Q3:我的游戏是双点医院那种场景,排队系统的核心体验是什么?核心是'可读性'。玩家需要一眼看出:哪里在排队,队伍有多长,哪个窗口效率低。你不需要让排队本身有多好玩,你要让'看排队'这件事有价值——通过观察,玩家能获得信息,做出决策。
Q4:不同 NPC 的耐心值差异该怎么设计?建议做正态分布,但两端的尾巴要肥一点——你要有一小撮特别容易暴走的急性子,也要有一群特别能等的佛系好人。急性子制造危机感,佛系制造容错空间。玩家会逐渐学会把接待中心里几个急性子哄好,这种小胜利非常有成就感。
Q5:人流模拟需要和造型挂钩吗?不用,但如果你做了,会非常加分。想象一下《双点医院》里护士穿着不同颜色的制服,玩家一眼就看出哪个效率高、哪个容易懈怠。然后他会做出'把高效率护士调到最拥堵的诊室'这种操作——这是系统联动带来的策略深度,人流系统只是载体。