凌晨一点半导出一张 4K 俯视图,天际线从薄雾里透出来,那种满足感能顶一整天的疲惫;可切回实机、拖动视角,帧率读数停在 21,鼠标划过屏幕带着明显拖影。这个循环我在《都市天际线2》里重复了太多次:画质拉满爽十分钟,被帧率劝退,回滚设置,过几天心痒又调一遍。真正让我停下来的是某次把模组(Mod)全部关掉、只留原版跑同一座城,发现画面"发灰"和"卡"其实是两件独立的事,一件出在渲染,一件出在模拟,混在一起调永远调不明白。这篇东西讲的就是把它们拆开的全过程:先诊断原版画面的短板在哪,再算清处理器和显卡各自的分账,然后按层叠装画质模组,把自定义资产的贴图与 LOD 规范落到细处,最后用一套可切换的配置档位在"出片"和"正常玩"之间来回切。适合已经玩过一阵、想把城市拍成作品、又不想每次更新就重装一遍的人;纯新手也能看懂,因为每个结论我都尽量写清楚是怎么试出来的。
1. 原版画面发灰的根因:三条渲染链路的短板定位
很多人第一次装画质模组的心态是"越多越好",结果叠了十几个之后画面变成浓油赤酱,反而比原版更难看。问题不在模组,在于没搞清楚原版的短板分属哪条链路。我的经验是把它拆成三条:光照与色调、阴影与环境光遮蔽、雾与大气。三条链路的短板表现完全不同,改错地方就是白费性能。
1.1 光照与色调:灰不等于暗,是动态范围被压扁了
原版最常被吐槽的"灰蒙蒙",本质是动态范围被压缩,不是亮度不够。白天正午的画面里,高光部分(水面反光、玻璃幕墙)和暗部(楼间阴影、树冠底部)挤在一个很窄的区间里,你看着不刺眼,但也没有层次,整张图像蒙了一层灰纱。这时候去调亮度或者对比度滑块,只会让画面更脏。
我的做法是先修正曝光基准,再动色调映射。具体操作是找一座有高塔、有水面、有密集街区的城,把时间固定在上午十点,天气选晴朗,相机拉到能同时看到这三类物体的机位,然后只调曝光,让水面的高光刚好不溢出——这一步定下来,后面所有调色才有参照。接着再换 LUT(色彩查找表,可以理解为一张"滤镜配方",把输入颜色映射成输出颜色)。LUT 的作用是改色调而不是改明暗,所以它必须在曝光校准之后用,顺序倒了就是灾难:曝光没定就套 LUT,你会误以为 LUT 太亮,然后把 LUT 调暗,结果换回正常曝光时整张图发黑。
提示:一张 LUT 在不同时间段的效果差异极大。判断一张 LUT 好不好,不要只看正午,务必在清晨和黄昏各看一次,如果黄昏时高光区域出现明显的橙红色断层,这张 LUT 就不适合你的城市。
还有一个容易被忽略的细节:原版的材质粗糙度整体偏高,金属和玻璃的高光很"钝"。这类短板靠调色是补不回来的,得靠替换材质或者叠加表面细节模组。我一般的判断标准是——如果调整曝光和 LUT 之后画面层次出来了,但建筑看起来还是"塑料感",那就说明问题已经转移到材质链路,不要再在色调上死磕。
1.2 阴影与环境光遮蔽:让建筑"落地"的关键一层
建筑看起来"浮"在地面上,绝大多数情况是阴影链路的问题。原版的级联阴影贴图(把视锥分成远近几段分别生成阴影贴图的技术)在中等画质下分辨率偏低,远处建筑的阴影边缘会出现明显的锯齿和闪烁,靠近视锥边缘的阴影甚至会直接消失。你从高空俯视时会觉得整座城像贴纸。
提高阴影贴图分辨率是最直接的手段,但它对显存的消耗是平方级的:分辨率从 2048 提到 4096,一张阴影贴图的显存占用翻四倍,而且阴影渲染是每帧都要跑的,帧率掉得非常实在。我的取舍是"分辨率够用就行,阴影距离优先"。阴影距离决定了多远的建筑还能投下阴影,这个参数对观感的提升远大于分辨率——从默认拉到能覆盖主要城区,画面立刻就有了纵深,代价是阴影渲染的三角形数量增加,显卡负载上升,但在中端卡上通常还能接受。
环境光遮蔽(AO)是另一回事。它负责在物体接触面、墙角、窗框内侧制造细微的暗部,是"真实感"的主要来源之一。原版自带的 AO 很弱,很多模组会加强它,但 AO 的算法成本很高,覆盖半径调大之后,密集街区的地面会糊成一片黑,帧率也会明显下滑。我个人的经验区间是:把 AO 强度控制在"能看出墙角变暗,但地面上看不出明显黑斑"的程度,一旦地面开始出现脏污感就说明过头了。
1.3 建立自己的基准线:固定机位对照法
调画质最怕的是"感觉好像变好了"。人的视觉适应能力太强,连续调两个小时之后,你会觉得任何一个版本都是对的。我用的是一个很笨但极其有效的办法:固定机位对照。
找三个有代表性的机位——一个高空俯视全城、一个街道视角贴着人行道、一个对着水面和天际线。每个机位记下相机的位置和角度参数(相机模式里能看到具体数值,抄在便签里)。然后每个方案都在这三个机位、同一个时间、同一种天气下截一张图,导出为无损格式。三张图并排看,改动的收益和代价一目了然,比任何主观感受都靠谱。
这套流程还有一个副产品:你会发现自己城市的"构图短板"。有些城在俯视角度很美,一进街道视角就露馅,因为贴图和几何细节全是大面片。这种发现会反过来指导你在资产层面做投入,比盲目下载一堆高面数建筑划算得多。
2. 装模组之前的帧率账本:处理器负载与显卡负载要分开算
我见过太多人把卡顿归咎于"画质模组太吃配置",其实他的处理器早就顶不住了,装不装画质模组都是同一个帧数。这两类负载的表现完全不同:处理器瓶颈的典型症状是加速时间(模拟速度)调快之后帧率骤降、画面本身没有变化但拖动视角一顿一顿;显卡瓶颈的典型症状是降低分辨率帧率立刻回升、画面越复杂(人多、树多、雾浓)掉得越狠。分清楚这两件事,钱和精力才能花在刀刃上。
2.1 人口规模对模拟耗时是超线性增长
城市模拟的计算量不是随人口线性增长的。人口翻倍,寻路、就业匹配、服务覆盖判定这些计算的耗时大约会增长到原来的 1.6 到 2.2 倍(这是我在几座不同规模城市上反复测出来的经验区间,不是官方数据)。原因很直观:人越多,路径越多,可达性判定的组合数增长得比人数快。
给一个实测对照,同一套硬件、同一套画质设置,只改人口:
| 人口规模 | 一倍速帧率 | 三倍速帧率 | 主要瓶颈 |
|---|---|---|---|
| 3 万 | 62 | 55 | 显卡 |
| 8 万 | 48 | 35 | 两者接近 |
| 15 万 | 40 | 24 | 处理器 |
| 25 万 | 33 | 15 | 处理器 |
表里的数值只是我这台机器的读数,绝对值对你没有意义,但趋势是通用的:高倍速下帧率断崖式下跌,说明处理器已经在算模拟了,这时候你去降画质完全没有用。反过来说,如果你的城在 20 万人口、一倍速下只有 30 帧,那你再加画质模组就是在已经很窄的余量里抢空间,收益极其有限。
所以我的第一个建议是:如果你热爱大城,先把处理器的预算给足;如果你热爱出片,把城市规模控制在 10 万以内,画质模组的性价比会高得多。
2.2 像素量翻四倍意味着什么:显存与填充率的粗算
从 1080p 换到 4K,像素数从大约 207 万涨到 829 万,正好四倍。凡是"按像素计算"的开销——后处理、抗锯齿、透明物体混合、雾效——都会接近四倍增长。而阴影贴图、几何体的顶点处理这些不随分辨率变化的开销不变。这就解释了一个常见现象:在 1080p 下画面很流畅,换 4K 直接卡成幻灯片,因为你踩中的全是按像素算的那部分。
显存方面我给一个粗算方法:基础占用(几何、渲染目标、模拟数据)加上贴图总量,再乘一个 1.2 左右的余量系数。一张 2048×2048 的带 mipmap 的贴图,如果压缩格式每像素 1 字节,约占 5.6MB;一套建筑资产通常有底色、法线、粗糙度三张,就是 17MB 左右。你要是装了 300 套高精度资产,光贴图就是 5GB 往上。再加上 4K 分辨率下各类渲染目标(阴影图、AO 缓冲、后处理中间缓冲)的开销,12GB 显存属于"够用但不宽裕"。
注意:显存不足的表现不是帧率下降,而是贴图突然变成纯色块、远处建筑糊成一团,或者视角一转就卡一下。看到这种现象先去降贴图质量,不要怀疑显卡坏了。
2.3 两个五分钟就能做完的瓶颈判断
第一个测试:把游戏分辨率降到 1280×720,其他设置不动,跑一遍固定机位。如果帧率从 25 涨到 60,说明你是显卡瓶颈;如果只从 25 涨到 32,说明处理器卡住了,显卡在等人。
第二个测试:保持分辨率,把模拟速度从一倍速调到三倍速。如果帧率掉了一大截,说明模拟负载吃紧;如果几乎不变,说明模拟还有余量。
两个测试加起来不到五分钟,但结论决定了你接下来该买内存、换显卡,还是干脆把城市规模收一收。我个人的经验是,绝大多数"装了模组就卡"的抱怨,实际原因是内存不够导致频繁读取硬盘,表现为视角转动时卡顿、切换时间流逝时黑屏几秒。城市规模大、资产多的存档,32GB 内存是起步,资产装到几百套的话 64GB 才是舒服的区间。这一点在装模组之前就该想清楚,因为模组装上去容易,卸下来的时候存档往往已经依赖它们了。
3. 画质模组的分层装配:顺序错了越调越糟
画质模组不是平铺的,是有层级的。前一层决定画面的骨架,后一层只做修饰。顺序搞反,你会不断用后一层去掩盖前一层的错误,最后叠出一个又慢又难看的东西。我固定用三层结构:先把色彩与光照定下来,再处理阴影与遮蔽,最后才是抗锯齿和细节增强。每加完一层都要跑一次基准截图,不通过就不进下一层。
3.1 第一层:色彩与光照管线,决定八成观感
这一层的目标是让画面"通透"。它包含曝光校准、色温、色调映射曲线、LUT,以及可选的全局光照增强。这一层的帧率成本通常很低,因为大部分是屏幕后处理,跟场景复杂度无关,但在 4K 下依然不可忽视。
我推荐的处理顺序是:色温先定(决定画面是冷调还是暖调),再校准曝光,最后套 LUT。色温这一步很多人跳过,结果在冷调 LUT 上反复加暖,越加越脏。判断色温是否合适,看白色的墙面——如果墙面偏蓝而树是正常的绿,说明整体色温偏冷,把色温往暖推一点,墙面转白,树的颜色会跟着变黄一点,这时再用 LUT 把绿色的饱和度压回来。
全局光照增强类的模组收益很大,但代价也大。它会改变间接光的计算方式,让阴影里的建筑有反弹光、窗户有溢光。这类效果的观感提升是质变级别的,尤其夜景。但它对显卡的消耗很实在,而且和阴影层级的设置容易打架——两者一起开,阴影区域可能出现奇怪的亮斑。我的做法是一次只开一个,用基准截图对比,选那个在你的城市结构下更自然的。
提示:调完第一层之后,把游戏内置的昼夜循环完整跑一遍。有些设置在正午看着完美,到了黄昏会因为高光溢出变成一片死白,这种问题在静态截图里发现不了。
3.2 第二层:阴影、环境光遮蔽、雾与体积云,按开销排序
这一层的每一项都很吃性能,所以要排优先级。我的经验排序(从性价比高到低)是:阴影距离 > 环境光遮蔽 > 雾效 > 体积云。
阴影距离排在第一位,因为它直接决定画面的纵深感,成本主要是几何量,中端卡咬咬牙能扛。环境光遮蔽排第二,成本高但观感提升明显,可以适当降半径来换帧率。雾效排第三,它其实很便宜,但它会掩盖远景细节,雾一浓,远处的贴图精度就不重要了——从这个角度说,雾是免费的"性能作弊器",远景掉帧严重的城市应该主动加一点薄雾。体积云排最后,因为它最贵,而且玩家在城市里大多时间是在看地面,抬头看云的频率很低。如果帧率吃紧,体积云第一个砍。
这里有个容易踩的坑:雾效和体积云叠加时,画面的对比度会被双重削弱,看起来像隔着一层毛玻璃。解决办法是加雾的同时把对比度微微上调,或者把雾的高度范围调低,让雾只贴地面,不盖住天空。
3.3 第三层:抗锯齿与超采样升频的取舍
抗锯齿是画面"锐不锐"的分水岭。时间性抗锯齿(TAA,用前一帧的信息来平滑边缘)性价比高,但在快速移动视角时会产生拖影,密集的栏杆、铁轨、树线这类高频细节会糊掉,出片时特别明显。超采样升频(用低分辨率渲染再放大)能大幅省性能,代价是细节损失和轻微的延迟感,适合正常游玩,不太适合截图。
我的实际配置是两套:日常游玩用升频方案,画面能动就行;出片时切到时间性抗锯齿,并且把视角移动速度放慢,让抗锯齿有时间收敛。如果非要两者兼得,可以用"高分辨率渲染 + 时间性抗锯齿 + 极轻微的锐化",代价是显存和帧率,只有在拍照模式下才开。
这里必须提醒一句:锐化不要调高。很多人在抗锯齿之后觉得画面糊,就加锐化,加多了会出现明显的白边,尤其是建筑轮廓和树冠边缘,截图放大后一眼就能看出来。锐化的量控制在"不放大看不出"的程度,宁可稍软也不要白边。
4. 自定义资产入城:贴图通道、法线与 LOD 的实操规范
资产是这个游戏画质的天花板。官方建筑再精致,看多了也腻;一套做得好的自定义建筑能让整条街的气质变掉。但自制或者下载的资产,十个里有八个在贴图和 LOD 上不合格,装进城里就是帧率杀手。这里我把最容易出问题的几项写成规范,你按这个检查,基本不会翻车。
4.1 贴图尺寸与通道打包:三个高频错误
第一个错误是贴图尺寸贪大。很多人觉得 4096 才够清晰,实际上在俯视视角下,一栋建筑在屏幕上的像素高度可能不到 200 像素,4096 的贴图纯属浪费,而且会迅速吃光显存。我的规范是:主角级建筑(地标、临街主立面)用 2048,普通建筑 1024,远景填充建筑 512。一套资产里不同部件可以混用不同尺寸,没必要统一。
第二个错误是法线贴图存成了带色彩空间压缩的格式。法线贴图记录的是方向向量,必须做线性空间处理,如果按普通色彩图的方式压缩,光照计算就会出错,表现是表面出现奇怪的紫色斑块或者明暗颠倒。这个问题在编辑器里看不出来,进游戏一打光就露馅。
第三个错误是通道打包浪费。底色、粗糙度、金属度、环境光遮蔽这些数据其实可以塞进同一张图的红绿蓝和透明度通道里,一张图干四张图的活。打包之后显存直接省四分之三,而且因为采样次数减少,渲染也更快。代价是后期修改麻烦一点,需要专门的工具来编辑单个通道导出。
| 常见问题 | 表现 | 修正方向 |
|---|---|---|
| 贴图过大 | 显存暴涨、视角转动掉帧 | 按画面占比定尺寸,远景降档 |
| 法线压缩错误 | 表面紫色斑块、明暗颠倒 | 法线图按线性数据导出,关掉色彩压缩 |
| 未打包通道 | 显存占用高、采样多 | 底色/粗糙度/金属度/AO 合并到一张 |
| 缺 mipmap | 远处闪烁、摩尔纹 | 导出时开启 mipmap 生成 |
4.2 LOD 阶梯与三角形预算:远景掉帧的真凶
LOD(细节层次)是同一栋建筑在不同距离下用不同精度的模型。这件事做不好,城市规模一大,远景的三角形数量会爆炸。我给的经验预算是:主模型(LOD0)控制在 1 万到 1.5 万个三角形,第一级简化(LOD1)3000 左右,第二级(LOD2)800 左右,最远级(LOD3)200 以内,最远级甚至可以用一个简单的方块加贴图代替。
切换距离的设定比精度更重要。LOD0 到 LOD1 的切换距离如果设得太远,你会发现一屏之内全是高模,帧率直接腰斩;设得太近,走近建筑时能明显看到模型"跳变",很出戏。我的经验是让切换发生在"建筑在屏幕上高度约 150 像素"的位置,这个尺度下人眼对细节变化的敏感度最低。
还有一个隐蔽的坑:LOD 的包围盒。如果简化模型的包围盒和主模型不一致(比如简化时把屋顶削平了),切换的瞬间建筑会"缩一下",非常明显。做完 LOD 之后一定要在游戏里绕建筑走一圈,从各个角度看切换是否平滑。
4.3 资产包体与加载时间:被低估的体验成本
单个资产的贴图总量控制在 30MB 以内,这是我给自己定的红线。超过这个数,装几十套之后加载时间会从十几秒涨到几分钟,而且内存压力陡增。加载慢不是致命问题,但它会改变你的游玩习惯——你会因为懒得等而不愿意重启游戏,于是模组冲突排查变得极其痛苦。
资产多了之后还要做分组管理。我一般按"城区风格"分组,一组启用一组禁用,而不是全部常开。这样既控制内存,也方便在不同存档之间切换风格。切换之前记得把用到的资产记下来,因为如果某个存档依赖了被禁用的资产,进游戏会发现建筑变成了空白方块,而且这种缺失往往不会报错,得自己一栋一栋找,非常折磨。
5. 冲突排查的完整链路:从黑屏、闪退到日志定位
模组装多了必然会冲突,这是常态,不是你的错。真正拉开差距的是排查效率:有人一次闪退重装了整个游戏,有人十分钟定位到具体哪一个。我把这套流程走熟之后,绝大多数问题都能在半小时内解决。
5.1 依赖树与加载顺序的基本规则
模组之间有依赖关系,功能模组依赖基础框架,资产包依赖某些渲染或分类框架。加载顺序的基本原则是:基础框架最先,功能模组其次,纯资产包最后(纯资产其实对顺序不敏感,但放在后面便于管理)。顺序错了的典型症状是"模组装了但功能没生效",或者界面上的按钮点了没反应。
更麻烦的是版本错配。功能模组更新了,但依赖的框架还是旧版,游戏可能不报错,而是表现为某些功能随机失效。这种问题极难通过现象判断,只能靠一份清单:我给自己维护了一张表,记录每个模组的版本号和它依赖的框架版本,游戏本体更新后先对照这张表检查一遍,比进游戏一个个试快得多。
5.2 二分法定位:把几十个模组缩到一个
遇到启动黑屏、进图闪退、加载到一半卡死,我的第一反应不是看日志,而是直接做二分。理由很实在:日志读起来慢,而且很多冲突根本不写日志。
具体操作是禁用一半模组,启动,看问题是否复现。复现了就说明问题在这一半里,再对半切;没复现说明在另一半。七八轮之后就能定位到具体的一两个。这个方法听着笨,但它是所有排查手段里最快的,尤其是模组数量在 30 个以上的时候。
二分过程中有个技巧:功能模组和资产包要分开二分。资产包基本不会导致闪退,只会导致贴图缺失或者加载变慢,把资产包混进来二分是浪费时间。先只对功能模组做二分,定位到问题模组之后再单独检查资产。
注意:二分时不要忘了关掉"自动加载上次存档"。有些闪退发生在读档阶段,如果游戏自动读档,你会在禁用模组之后依然闪退,误判成"不是模组的问题"。
5.3 版本更新后的回归测试清单
游戏本体更新之后,受损的往往是那些深入修改底层逻辑的功能模组,画质类和资产类通常没事。所以更新后我会按这个顺序检查,而不是一股脑全开:
- 先只开基础框架和画质模组,进游戏看画面是否正常、有没有渲染异常。
- 再开交通与道路编辑类模组,因为这类模组最容易因为路径算法变动而失效,检查方式是画一段复杂路口,看路口是否正常生成。
- 接着开建筑放置与区域划分类,检查能不能正常放置、有没有出现无法删除的幽灵建筑。
- 最后开资产包,重点看加载时间有没有异常增加、建筑有没有变白块。
- 全部开完之后,用一个旧存档做压力测试:快速切换时间流速、快速拖动视角、进入建造模式再退出,这三个动作最容易触发崩溃。
这套清单我走了十几遍,最大的收获是"知道什么时候该等"。更新初期,很多模组作者还在适配,这时候急着全开就是在给自己找麻烦。我的习惯是更新后先玩一周原版,等主要功能模组稳定了再逐步加回来,损失的那点便利远小于反复崩溃的时间成本。
6. 电影级出图:同一座城拍出三种气质的参数组合
最后说说出片。同一座城市,换一组时间和光线参数,气质能差出十万八千里。这里面没有玄学,全是可复现的组合。
6.1 时间、天气与太阳角度的三角关系
太阳角度低的时候(清晨和傍晚),光线接近水平,建筑投下长长的阴影,画面有纵深、有层次,这是最容易出片的时段。清晨六点半到八点之间,空气里带一点薄雾,逆光拍天际线会有轮廓光;傍晚五点到六点半,侧光把建筑的立面切成明暗两半,适合拍街道。
正午反而是最难拍的,因为光线顶头,阴影短,建筑立面全是平的。如果非要在正午拍,我会等云——薄云天气下光线被柔化,阴影变软,画面反而干净。
天气选择上,晴朗适合拍结构,薄雾适合拍氛围,雨后的湿度会让地面反光,夜景特别好用。我常用的三套组合是:
| 气质 | 时间 | 天气 | 关键设置 |
|---|---|---|---|
| 清晨纪实 | 7:00 | 薄雾 | 低太阳角度、逆光、对比度偏低 |
| 黄昏叙事 | 17:30 | 晴朗 | 侧光、暖色调、阴影距离拉满 |
| 夜晚霓虹 | 21:00 | 雨后 | 高光溢出、AO 加强、饱和度略降 |
6.2 景深、焦距与后期叠加的顺序
景深是让画面"有镜头感"的关键。等效焦距我一般用 50 到 85mm,这个区间透视不会太夸张,接近人眼观察的压缩感。光圈值(模拟值)控制在 f/2.8 到 f/5.6 之间,太浅会糊掉主体,太深又没有虚实对比。判断标准很简单:主体建筑清晰,前后景各有一层柔化,就够了。
后期的顺序很重要,我的固定流程是:先降饱和度、再提对比、最后加暗角。先降饱和是因为游戏本身的色彩偏艳,尤其是绿地,降下来之后画面会显得克制;加对比要在降饱和之后,否则颜色会脏;暗角放最后,它只负责把视线引向中心,不要用它来"救"构图。
6.3 把稳定配置固化成可切换的档位
调好一套参数之后,务必把它存成配置档。这个游戏里画质相关的设置项目很多,靠记忆复原是不现实的。我一般存三档:游玩档(帧率优先,抗锯齿用升频,阴影距离中等)、截图档(画质优先,时间性抗锯齿,全开)、极简档(排查问题或者拍延时用,关掉所有后处理)。
切换档位的时候有个细节要注意:某些画质设置改动之后需要重新加载场景才完全生效,尤其是光照和阴影相关的。所以切到截图档之后,我会先切一次时间流速触发刷新,再开始取景,避免拍到"半生效"的画面——这种问题在截图里不明显,在录视频时就是灾难。
最后分享一个我个人屡试不爽的小技巧:出片之前,把相机拉到最终机位,然后关掉界面、静静看三十秒。人对画面的第一印象往往是错的,看久了才会发现构图里有多余的元素、地平线歪了、或者前景有一棵挡视线的树。这个习惯帮我省下了大量"导出之后才发现问题"的时间。