自动化工厂流水线(Automation / Factory)游戏策划专题高级tech7 / 21 已发布

海量实体渲染与合并优化

Draw Call 合并 · 实例化 · LOD 降级 · 批处理调度

· 15 分钟阅读
海量实体渲染与合并优化:看得见的代价,看不见的细节 Mass Entity Rendering & Batching — 自动化工厂流水线(Automation / Factory)游戏策划专题

海量实体渲染与合并优化:看得见的代价,看不见的细节 Mass Entity Rendering & Batching

为什么渲染预算会是第一块基石——玩家看见的工厂,和你看不见的代价

先说个真事。我早年做的一款流水线原型里,一条绿色电路产线铺到第60个组装机时,笔记本风扇开始像直升机起飞。我以为是模拟卡了,切了Debug视图一看——好家伙,单个区块里塞了4000多个实体,其中七成是传送带上的铁板、铜线圈和齿轮。它们每一个都在被当成独立网格提交给显卡。我从没想过,真正杀死帧率的不是工厂的“大脑”,而是工厂的“皮肤”——那些你一眼扫过去根本数不清的小零件。

为什么要把渲染优化放在模拟架构(第07篇的tick话题)之前讲?因为对玩家来说,“手感”的第一层不是帧率数字,是画面的密度与清晰度。流水线游戏的美术基底不是模型精度,而是“如何在屏住呼吸的预算里,把一个上万实体的场景变成一眼能读懂的地图”。渲染合并策略决定了玩家看到的是“一片爬着甲虫的绿毯”还是“一条条流动的铁河”。

这篇我们不讲引擎API怎么调,讲的是:当你的工厂从手工作坊长成城市时,玩家视线里到底发生了什么,而你作为策划又该怎么把这笔账算明白。

第一层:LOD与负载距离——玩家看得见的“远近”是美术在撒谎

我管LOD(细节层次)叫“善意的远近谎言”。远处的传送带不需要转动的齿轮,远处的组装机不需要会摆的机械臂。策略很简单:距离越远,替换成越简化的模型,甚至画成贴图。但流水线游戏有个特殊的地方——玩家经常要拉远看全局,就像在俯瞰一张活的电路板,而拉近时又死死盯着几个组装机之间的配比。

这意味着LOD的切换不能只按线性距离,还得考虑“玩家当前在干嘛”。你见过《Factorio》里那个调试模式吗?按下F4打开“show-entity-positions”视图,所有实体变成一个个小方块——那不是为玩家准备的,是开发者在看“哪个LOD档位该背锅”。普通玩家感知到的“远处工厂糊成一团”,其实就是LOD切换距离没调好。

LOD 档位典型距离(米)网格三角形预算玩家感知效果
LOD00–15完整模型(>2000 tris)能看清履带、齿轮、烟囱活塞
LOD115–40简化模型(500–800 tris)能认出建筑类型,但细节融成色块
LOD240–80卡牌化模型(100–200 tris)轮廓清晰,材质基本是纯色
LOD3>80贴片/冒名顶替者(Impostor)类似“3D游戏的2D纸板立牌”

关键的参数不在“每个LOD长什么样”,而在切换曲线的形状。如果切换距离太急,玩家拉镜头时画面会像老式电视跳台;如果太缓,显卡被浪费。我推荐把档位做成“先松后紧”:近景到中景的切换用平滑的跨fade(交叉渐变),中景到远景直接硬切——反正玩家在拉远时没空盯着看。别小看这个细节,你拉远了看不清的东西,反而是玩家判断“我该往哪扩产”的依据。

案例:《Factorio》其实很少让玩家感到“远处糊了”,因为它有个绝招——把传送带上的物品画成“流”。当传送带载着几千个铁板时,它们不是一个个立方体,而是一条连续运动的贴图纹理。这叫什么?这是“视线就是预算”的极致运用:玩家看不见单个铁板时,就别画单个铁板。你要学会数自己工厂里“玩家真正注视的实体”大概有多少,而不是数总实体数。

第二层:实例化与合批——一帧之内最狠的“数学暴力”

说个数字:一台5890K的机器能轻松在一帧内渲染1000个独立的角色,但如果是1000个不同的网格?画面直接卡成PPT。问题出在“渲染状态切换”上——每次换材质、换网格、换着色器,显卡就得重新排队。流水线游戏最擅长的就是制造“长得一模一样的东西”——100台组装机、200个机械臂、5000个传送带。这就是把“独立提交”变成“批量提交”的最佳温床。

“实例化”这词听起来高深,其实一句话:“这些铁板长得一样吧?咱就别一个个告诉显卡了,就告诉它‘画5000个铁板,位置在以下列表里’。”把5000次请求合并成1次请求。合批(Batch)就是干这件事的。但这里有个大坑:如果你的工厂里每个组装机上都挂着不同的配方图标、不同的进度条、不同的损坏贴花——那你就亲手把合并机会撕碎了。

案例:《戴森球计划》有个细节特别聪明——它的星际物流塔和传送带几乎不显示单个物品运动,而是显示一条“光的粒子流”。你以为这是美术风格?这其实是合批的产物:粒子流可以用一个GPU粒子系统跑,几百个粒子共用一次绘制调用,而如果改成几千个实体模型,帧率会直接爆炸。玩家看到的是“流动的光带”,内心感受到的是“科幻大片”,这本质上是用视觉语言掩盖了渲染预算的真相。

还有个反例得提:《城市天际线》初代里,每辆车都是独立的LOD模型,几千辆车在高速上堵着的时候,帧率像被吸进黑洞。开发者后来解释了——他们没把车辆做合批,因为每辆车颜色、款式、状态都不一样。这是“细节丰富”与“性能”的经典对战。你想让玩家的城市“活”,就得在细节密度和渲染预算之间二选一,别贪。

实体类型建议合批策略合批粒度代价
传送带上的物品按物品类型+动画帧合并为纹理流一条传送带/一个批次无法单个高亮物品
组装机/熔炉同类型同朝向合并每8–12台一批转向动画难以独立
机器人实例化,每批次最多64个每64个一批飞行路径无法做独立曲线

第三层:批处理调度——合并之后,问题才刚刚开始

你合并了5000个铁板,显卡很开心。但你随即发现:这批货不是同一时间出现在屏幕上的——它们在不同区块,有遮挡,有的在屏幕外。如果你硬把所有铁板合并成一整个批次,那么只要一个铁板移动,整批就得重绘。这就像你把5000个人安排进同一个会议室,其中一个人打喷嚏,全部人都得站起来换个座位。

解决办法就一个字:拆。把世界切成区块(Chunk),每个区块内的同类型实体才合批;区块之间独立。当你镜头看向东方工厂时,西边矿区的铁板纹丝不动?那就不重绘它。这就是“可见性剔除”(Frullum Culling)与“区块批处理”的合奏。听起来不复杂,但真的做起来,区块大小就是门手艺活——区块太小,批处理数量上不去;区块太大,重绘面积爆炸。

我推荐用“分区粒度”等于“玩家视觉焦点半径”的思路来定区块尺寸。玩家在俯瞰整座工厂时,视线停留的区域大概是屏幕中心直径200–300个格子。按这个范围切分区块,既保证合批效率,又不会让单批过大导致重绘卡顿。

还有一个调度层面的大坑:动画剔除。厂房里每台组装机的机械臂都在晃动,但如果玩家拉远了,这些晃动根本看不清,却依然在消耗CPU骨骼计算。做法是:低于LOD2的实体不要播放动画,改用着色器上的UV流动来伪造“在动”的错觉。这一招我在原型里亲测有效——那些远处亮着灯的组装机,用一张法线贴图的颜色偏移就能模拟出“活塞在动”的观感,代价几乎为零。

案例:《缺氧》是个绝妙的例子。它每格都是一个独立实体,但它的渲染预算却控制得很好——因为它大量采用“平滑过渡的流体颜色”而不是独立粒子实体。你看它那些液体流动,不是真的几千个水分子在跑物理模拟,是一张大贴图上做的溶解效果。这个设计让它的“模拟感”与“渲染度”完美分离:模拟可以很重,渲染很轻。你作为策划应该记住:模拟里的实体数量和渲染里的实体数量,是两个世界的数字。

第四层:美术视觉主旨——玩家看的不是实体,是“图景”。

前面聊的全是技术,但作为美术,我得拉回来说一句:合并优化做得再好,玩家记住的也不是帧率,而是“我一眼能看懂我的工厂在干嘛”。这决定了渲染预算最后要花在哪。

流水线游戏的视觉可读性,核心是三条:颜色分区、轮廓强调、动态引导。颜色分区决定玩家一瞄就知道“这块是铁产区,那块是科研区”;轮廓强调决定塔吊、长臂、烟囱这些标志性建筑的识别度;动态引导决定传送带的方向是否一眼可辨。

这三条每一个都在跟渲染预算抢钱。想让轮廓清晰,你得给单个实体更多的三角形;想让动态引导明显,你得让粒子或光照更亮眼。但别忘了预算就那些——这就是为什么我说“风格化渲染是流水线游戏天然的盟友”。低多边形、饱和色块、简洁轮廓,这些风格不只是好看,它们在帮你省下几何细节的钱,让预算花在刀刃上——动态流动感。

案例:《Timberborn》河狸工厂为什么看起来很清爽?因为它的材质几乎全是哑光纯色+强轮廓光照。你能清楚分辨每座建筑是干嘛的,而且低多边形建模意味着LOD切换几乎无感——它们长得都一样简,所以减面无感。这就是聪明的风格化策略。

而《Anno 1800》作为反面教材,它的建筑细节极其精致,导致拉远看时细节糊成一团。玩家航拍视角下,所有建筑都是“一堆屋顶”,难以快速识别功能。美术团队不得不用“微光高亮”覆盖关键建筑来补救——这是用后期特效补渲染的窟窿。风格统一不是审美洁癖,是预算分配策略。

所以当你在策划案里写“我们需要5000个可独立变形的实体”时,我要拿笔划掉,改成“我们需要让玩家在缩略图中三秒认出哪条线产出了铁板”。这就是渲染优化的最高目标:不是让画面更精致,而是让画面更“可读”。

参数化工具箱:一张可以抄的配置表

下面是几个可以直接抄进开发的建议参数区间,每一项都是我这几年翻车后总结的。注意这些不是真理,只是起点,让新来的开发有方向可调。

参数组参数项建议区间备注
LOD切换距离衰减曲线先缓后陡(近景缓切远剪)避免“跳变感”
LOD低于LOD2的动画播放关闭骨骼动画仅用UV流动省CPU省到爆
合批区块尺寸(格)200–300见方匹配视觉焦点半径
合批单个批次最大实体数500–1000超过后重绘成本反而上升
裁剪视锥外实体处理立即卸载不要保留“储备”
风格主色调数量≤6个色相颜色分区的可读性基础
风格关键建筑轮廓对比度比背景亮15%–25%高光描边可后补

记住一条总原则:你要审核的不是“单个实体多漂亮”,而是“一帧画面里最值得看清的20%内容占用了多少预算”。把预算往那20%上倾斜,剩下的全给低LOD、合批、粒子化。这跟导演调焦点是一个道理——景深虚化也是一种修剪,不是失败。

另外,给测试团队一个排查工具链:调出“每区块Draw Call数”的调试HUD,跑一段10分钟的通关流程,录屏,然后逐帧看哪一帧的Draw Call峰值超过500——那就是玩家体验卡顿的元凶。别信“这帧不卡”的主观报告,看数据,但数据也要能翻译成人话。

初识路线 vs 进阶深挖:两套应对“实体爆炸”的方案

如果你团队只有两三个人,预算紧,时间赶——走初识路线。先打开游戏,造一个500实体的小工厂,切Debug视图看Draw Call。然后按表格调LOD阈值和区块大小,只要把“远处动画关闭”和“传送带纹理流”两招学了,至少能扛到2000实体而不卡。简单说:别想着一步到位,先给玩家一个不卡的中型工厂。

如果你做的是长线运营的沙盒,或者你的玩家会铺到上万实体——请走进阶深挖路线。除了基础合批,你还需要:

  • 为不同区块建立独立的动态再合批系统(当工厂扩建时,桶会重组);
  • 实现自动生成交互式LOD预览——玩家放大前能看到“近似状态”而非完整模型;
  • 做一个“预设矩阵”表:不同距离、不同画质档位下,各实体类型的显示策略组合,把几百个参数塞进一个下拉菜单里;
  • 再有耐心一点,还能给“区块边缘”加一层细条纹过渡区,让不同区块之间的实体在最高LOD下也能无缝咬合。

进阶路线最花时间的是“批处理组间共享”问题——两个区块交界处的那几台机器到底归哪个区块管?我的经验是别让实体跨区块归属,而是让区块公共边界多一层“影子实体”,它们只做视觉呈现,不参与模拟。代价是内存多几个兆,好处是彻底消灭边界撕裂感。

常见坑:你以为在优化,其实在给玩家添堵

坑1:LOD 切换太激进。玩家正盯着屏幕中间那颗铁矿机想看清楚配方,结果镜头轻微一转——它变成了一个色块。你会收到几百条反馈“这游戏画面会跳”。记住:玩家的眼球在“识别功能”而非“欣赏建模”,切LOD的时机要避开“识别瞬间”,所以切换动画要做成交叉淡入,而不是瞬切。

坑2:为了合批,把不同状态的建筑强行合并成同一个模型帧。结果呢?机器明明在“处理铁板”,贴图却显示“处理铜线”。玩家当场出戏。合批不能牺牲“状态可读性”——如果一台机器正在加工铜板,它的颜色或者粒子必须跟加工铁板时有区别,哪怕只是微弱的色偏。

坑3:性能测试只看“独立场景”不看“玩家常态”。你调好了“什么都不建的平原”,但你忘了玩家会在湖边、在矿区旁、在晚霞光的逆光里建厂。我见过一个项目,所有测试都在中午光线下跑70帧,一到夕阳逆光直接掉到35帧——因为阴影渲染算法在逆光时预算翻倍。渲染优化必须按“场景光照条件”拆开测,不是按“单位实体数”测。

坑4:拿“Draw Call数量”当唯一KPI。有人为了压低Draw Call,把几百个细节丰富的建筑硬合并成一个批次,结果每一个建筑都无法独立高亮、无法单独显示损坏状态。玩家没了“控制感”,工厂变成一张贴图。廉价合并换来的是玩家失去对世界的指尖触碰。要合并,但要在可交互实体之间留出“独立性边界”。

FAQ:那些在制作群里被问烂了的问题

Q1:玩家说“我显卡很好啊,为什么还是卡”?
因为瓶颈往往不在显卡,在CPU的Draw Call提交和模拟tick。显卡好只解决像素填充,解决不了“命令过多”造成的调度延迟。你可以用性能分析器看是“渲染线程”还是“游戏线程”满载,通常前者是Draw Call问题,后者是模拟问题。两个世界的药不通用。

Q2:LOD 切换能不能做成“由玩家控制”?
可以,但别让玩家手动选。给一个“画质优先/性能优先/自动”三方开关即可,自动模式按帧时间动态调整LOD距离。硬让玩家选LOD距离,等于把性能优化的活外包给玩家,只会激怒他们。

Q3:我的游戏是2D像素风格的,这篇文章还有用吗?
有用,但用得少。像素风天然合批友好——因为每个瓦片都是整块纹理由,实体合并反而容易破坏“逐像素动画的灵性”。你需要重点做的反而是“区块缓存”:把静止不动的区域烘焙成一张大纹理,动态区域再单独更新。这就是“脏矩形重绘”的现代版。

Q4:为什么我合批了但帧率还是不稳定,一会儿60一会儿30?
大概率是“批处理风暴”——某些区块实体增多了,触发了一次大规模再合批,在那一瞬间CPU卡掉。解决方法是把大型合批操作切成分帧处理,一次不重做超过1000个实体,或者预计算“工厂扩建后的批处理计划”。说白了:别等用户往你脸上扔健身房再开始塑形,得提前预判。

Q5:为了画质能牺牲多少可读性?
这是一个哲学问题。我的刻薄答案是:如果你把一台组装机画得再好看但玩家看不出它在造铁板还是铜线,那这台机器等于没画。可读性 > 画质,永远。画质是锦上添花,可读性是雪中送炭。

文章标签
自动化工厂策划Factorio-like流水线设计传送带吞吐物流网络寻路科研树节奏蓝图系统海量实体优化比例规划数学产能瓶颈削减理论优化即乐趣
更多专题全部专题
觉得有价值?点赞或收藏支持内容持续产出。
← 返回专题:自动化工厂流水线(Automation / Factory)游戏策划专题