# 前言 4.20 - SVN 4490 - git b9679fd0f04c018036821558e565f9f214262872 ## 相关变化 ### 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 性能足以支撑远高于当前配置的渲染质量,但: 1. **不识别设备能力** — 没有高/中/低端设备的分级逻辑,旗舰机和千元机跑同一套配置 2. **策划体验包默认 MEDIUM** — 即便 GPU 完全有余力跑 HIGH + 原始分辨率贴图,脚本直接把它按在 MEDIUM 3. **场景降级不可恢复** — 即使手动切到 HIGH,场景文件中 Bloom/TAA 已经是 Low,恢复不到美术基准 4. **贴图已在源头被压** — 无论什么画质档位,GPU 拿到的都是降过分辨率 + ASTC 8×8 双重压缩后的贴图 简言之:**优化措施假设了所有设备都是低端机,但实际上旗舰机有巨大的性能冗余没有被利用。** --- ## 五、建议方向 1. **建立设备分级机制**:根据 GPU 型号/benchmark 分出至少旗舰/中端/低端三个设备层级,高端设备使用完整渲染配置 2. **分离场景美术基准与移动端降级**:场景文件保留美术原始设置,移动端降级通过脚本层覆盖实现,而非直接修改源文件 3. **贴图分层管理**:源文件保留原始分辨率,按设备层级在打包时选择不同的缩放比例,而非一刀切压缩 4. **打包参数优化**:对法线贴图使用更高质量的 ASTC 块大小(如 4×4 或 5×5),开启 Mipmap 生成 5. **LOD 策略精细化**:按模型重要性分级设置 LOD 阈值,主角/NPC/建筑用保守阈值,远景散件用激进阈值 6. **分辨率问题很大**:建议上FSR2,NeoX有这个玩意的改进方案。