9.5 KiB
9.5 KiB
前言
相关变化
2.1 场景渲染设置(张子涵,写入 .scn/.postprocess 文件)
49 个场景被统一修改了渲染参数,这些参数写死在场景文件中,不随画质档位变化。
| 渲染功能 | 变更内容 | 影响面 | 变化幅度 |
|---|---|---|---|
| 泛光 (Bloom) | Quality: High → Low | 全部 49 场景 | 品质降一档 |
| 抗锯齿 (TAA) | Quality: High → Low,关闭 Bicubic 采样 | 全部 49 场景 | 品质降一档 + 采样退化 |
| 环境遮蔽 (SSAO) | 关闭滤波、关闭全分辨率 | 全部 49 场景 | 边缘噪点增加 |
| 景深 (DOF) | 模式 Bokeh → Gaussian,多个场景直接关闭 | 7-11 场景 | 虚化效果消失或退化 |
| 镜头光晕 | 直接关闭 | 22 场景 | 完全失去镜头感 |
| 自动曝光 | 关闭 | 主农场等场景 | 亮暗切换不再自适应 |
| 半透明阴影 | 关闭 | 主农场等场景 | 树叶/玻璃不投影 |
2.2 全局阴影(张子涵,写入 GlobalRenderComponentsConfig.xml)
| 参数 | 旧值 | 新值 | 变化幅度 |
|---|---|---|---|
| CSM 贴图分辨率 | 2048 | 1024 | 减半(像素量降 75%) |
| CSM 级联层数 | 4 级 | 1 级 | 从 4 级联减为单级联 |
| 软阴影等级 | Max | High | 降一档 |
| 场景 CastShadow | True | False | 大部分场景静态物体不再投射阴影 |
2.3 LOD 策略(张子涵,修改 .lod2 文件)
33 个 LOD 配置文件(覆盖 44 个场景模型)的切换阈值被大幅提升:
| 指标 | 变化 |
|---|---|
| LOD 切换阈值 | 普遍提升 6-7 倍 |
| 最远级别行为 | 从"显示最低精度网格"改为完全剔除(不渲染) |
| 影响模型类别 | 树木、灌木、杂草、石头、建筑、装饰物 |
| 影响最大场景 | NongChang_003(主农场,12+ 模型)、neighbor01/H(邻居,13 模型) |
2.4 顶点压缩(张子涵,修改 .mesh + neox.xml)
- 6,935 个骨骼网格文件全量开启顶点压缩
- neox.xml 全局启用
CompressedVertexDataEnable+EnableVAT
2.5 贴图压缩(程侃,修改贴图源文件)
| 指标 | 数值 |
|---|---|
| 涉及贴图数 | 1,888 个 |
| 总大小变化 | 4,852 MB → 433 MB(减少 91.1%) |
| 分辨率降低的文件 | 1,876 / 1,888(99.4%) |
| 缩小 2 倍 | 649 个(34.6%) |
| 缩小 4 倍 | 428 个(22.8%) |
| 缩小 16 倍以上 | 528 个(28.1%) |
| 被压到 32×32(≈纯色) | 387 个(20.5%) |
| 法线/ORM 贴图清零 | 数十个 NPC 和场景贴图从 12 MB → 3 KB |
注:此提交标注为"测试贴图压缩"。
2.6 脚本层画质分档(程侃,修改 SceneRenderHelper.py 等)
新建高/中/低三档画质系统:
| 功能 | HIGH | MEDIUM | LOW |
|---|---|---|---|
| 渲染管线 | Forward | Deferred | Deferred |
| 渲染分辨率 | 100% | 70%(像素量 49%) | 50%(像素量 25%) |
| SSR | 场景默认 | 强制关 | 强制关 |
| SSAO | 场景默认 | 强制开 | 强制关 |
| Bloom/DOF/TAA | 场景默认 | 场景默认 | 全部强制关 |
| LOD 偏移 | 0 | 0 | +1(降一级) |
| 阴影 | 开 | 开 | 关 |
2.7 材质合批(程侃,SVN r3306)
- fork 了约 7,200 个模型引用的 GIM 文件,消除 CustomMaterialFiles 造成的合批阻断
- 覆盖 38 个场景,目标是减少 DrawCall
三、两人优化叠加后的综合结果
两层优化不是"取其一"的关系,而是逐层累加。最终移动端画面是场景文件中的降级设置 + 脚本层的动态控制同时作用的结果。
3.1 叠加链路
原始画质(PC 编辑器,美术调校基准)
│
├─ 第 1 层:张子涵 场景文件降级(写死)
│ Bloom High→Low, TAA High→Low, SSAO 滤波关, DOF 关, 镜头光晕关
│ CSM 2048→1024, 4级→1级, 大部分场景 CastShadow=False
│ LOD 阈值提升 6-7x, 最远级剔除
│ 6935 mesh 顶点压缩
│
├─ 第 2 层:程侃 贴图源文件压缩
│ 1888 贴图分辨率降低, 91% 空间节省
│ 28% 贴图缩小 16 倍以上, NPC 法线图清零
│
├─ 第 3 层:程侃 脚本层动态降级
│ MEDIUM: 分辨率 70%, SSR 关, 管线切 Deferred
│ LOW: 分辨率 50%, Bloom/DOF/TAA/SSAO/阴影全关, LOD+1
│
└─ 第 4 层:打包管线 ASTC 压缩
ASTC 8×8 (2 bpp) + level=0 最低编码质量 + 无 Mipmap
3.2 各档位实际效果
| 环节 | PC 编辑器(HIGH + 原始资源) | 移动端 MEDIUM(策划体验包) | 移动端 LOW(仅 GM 可达) |
|---|---|---|---|
| 泛光 | High 品质 | Low 品质(场景写死) | 关闭 |
| 抗锯齿 | High TAA + YCoCg + Bicubic | Low TAA(场景写死) | 关闭 |
| 景深 | 开(Bokeh) | 关/Gaussian(场景写死) | 关闭 |
| SSAO | 有滤波、全分辨率 | 无滤波、半分辨率 + 强制开 | 关闭 |
| 阴影 | 4级联 2048 + 场景投影 | 1级联 1024 + 场景不投影 | 完全关闭 |
| SSR | 场景默认 | 强制关 | 强制关 |
| 渲染分辨率 | 100% | 70%(像素量 49%) | 50%(像素量 25%) |
| LOD | 正常阈值 | 阈值提升 6-7x | 阈值提升 6-7x + 再降一级 |
| 贴图 | 原始分辨率 | 降 2-64 倍(ASTC 8×8 再压一轮) | 同 MEDIUM |
| 顶点 | 原始 | 压缩 | 压缩 |
| 镜头光晕 | 开 | 关(场景写死) | 关 |
| 自动曝光 | 开 | 关(场景写死) | 关 |
3.3 叠加效果量化
以移动端 MEDIUM 档(策划体验包的默认档位)为例,相比 PC 编辑器的累计劣化:
| 维度 | 劣化程度 | 说明 |
|---|---|---|
| 有效像素量 | 降至 ~49% | 分辨率 0.7 × 0.7 |
| 贴图精度 | 降至 ~9% | 91% 源文件压缩 + ASTC 8×8 运行时再压 |
| 阴影面积 | 降至 ~6% | 分辨率减半×级联从 4 降到 1×场景不投影 |
| 后处理效果 | 大幅缩水 | Bloom/TAA 从 High 降到 Low,DOF/光晕/自动曝光关闭 |
| 模型精度 | 更早切换低模 | LOD 阈值提升 6-7x,远处植被直接剔除 |
四、移动端效果差的根因分析
核心问题不是某个 bug,而是多层降级无节制地叠加,且缺少分层控制机制。
4.1 架构缺陷:无设备适配,只有一刀切
代码库中不存在任何基于设备性能的自动画质选择逻辑:
- 无 GPU benchmarking / 设备评分
- 无按机型分级的白名单/黑名单
- 无运行时帧率自适应
game3d.get_platform()在画质逻辑中被注释掉
策划体验包(pub_design)硬编码为 MEDIUM,不区分旗舰机和低端机。骁龙 8 Gen 3 和骁龙 660 跑完全相同的画质配置。
4.2 场景文件降级无法按档位恢复
张子涵的场景降级(Bloom Low、TAA Low、SSAO 滤波关、DOF 关等)是直接写入 .scn 文件的。程侃的脚本层画质系统中,HIGH 档对这些功能设为"场景默认"(mActive=False),意味着即使在 HIGH 档,美术原始的 High 品质设置也已经不存在了。
场景文件被改前的美术基准已经永久丢失(除非从 SVN 回退)。
4.3 贴图压缩过于激进且不分层
- 28% 的贴图被缩小 16 倍以上,30% 被压到 32×32
- NPC 角色的法线贴图从 2048×2048 缩到 32×32,表面凹凸细节完全丢失
- 场景核心贴图(草地、树皮、岩石)从 4096 降到 64,近看全是糊的
- 贴图压缩对所有画质档位一视同仁,HIGH 档也用压缩后的贴图
4.4 打包管线进一步劣化
ASTC 8×8(2 bpp)+ 最低编码质量(level=0)+ 无 Mipmap 的打包配置,在已经降过分辨率的贴图上再做一轮有损压缩:
- 8×8 块大小会在法线贴图和渐变色上产生可见块状伪影
- level=0 意味着编码器不做质量搜索,实际质量比 8×8 理论上限更差
- 无 Mipmap 导致远处物体贴图闪烁、GPU 缓存效率低下
4.5 为什么旗舰机也差
旗舰手机(如 iPhone 16 Pro / 骁龙 8 Gen 3)的 GPU 性能足以支撑远高于当前配置的渲染质量,但:
- 不识别设备能力 — 没有高/中/低端设备的分级逻辑,旗舰机和千元机跑同一套配置
- 策划体验包默认 MEDIUM — 即便 GPU 完全有余力跑 HIGH + 原始分辨率贴图,脚本直接把它按在 MEDIUM
- 场景降级不可恢复 — 即使手动切到 HIGH,场景文件中 Bloom/TAA 已经是 Low,恢复不到美术基准
- 贴图已在源头被压 — 无论什么画质档位,GPU 拿到的都是降过分辨率 + ASTC 8×8 双重压缩后的贴图
简言之:优化措施假设了所有设备都是低端机,但实际上旗舰机有巨大的性能冗余没有被利用。
五、建议方向
- 建立设备分级机制:根据 GPU 型号/benchmark 分出至少旗舰/中端/低端三个设备层级,高端设备使用完整渲染配置
- 分离场景美术基准与移动端降级:场景文件保留美术原始设置,移动端降级通过脚本层覆盖实现,而非直接修改源文件
- 贴图分层管理:源文件保留原始分辨率,按设备层级在打包时选择不同的缩放比例,而非一刀切压缩
- 打包参数优化:对法线贴图使用更高质量的 ASTC 块大小(如 4×4 或 5×5),开启 Mipmap 生成
- LOD 策略精细化:按模型重要性分级设置 LOD 阈值,主角/NPC/建筑用保守阈值,远景散件用激进阈值
- 分辨率问题很大:建议上FSR2,NeoX有这个玩意的改进方案。