学习进度
0/9 已勾只保存在这台浏览器;勾满 9 项即视为本题完成。
先把题目说成人话
低端手机上的树林掉帧时,最糟的办法是让美术把每棵树、每张贴图都再手做一份“低配版”:工作翻倍,后续修改也会分叉。更好的目标是让同一份资产按设备能力自动换档,同时保留玩家必须认出的轮廓和反馈。这叫质量档(Quality Tier);它不是免费画质,而是用统一规则减少重复制作。
这是虚构教学故事,不是个人项目经历。
场景:先让问题变得看得见
项目给低档手机的目标是每秒稳定显示 30 张画面。测试时,处理脚本的一端还有余量,画像素的一端已经超时,已加载的纹理也快碰到项目上限。玩家最在意角色脸、技能轮廓和界面清晰度;远景阴影、地面细碎花纹和烟雾消散后的长尾可以优先让步。
整体目标不是“所有东西一起糊”,而是把有限时间和内存从注意力外围移回画面中心,并且不要求美术另做一套资产。
(右脑)画面: 把低端手机想成一辆载重和动力都较小的车。驾驶者必须看清仪表、前车轮廓和危险信号,所以这些位置始终保留;远处路边的小石纹、很长的影子和已经散开的尾烟,则可以随速度自动减少。换档杆不重新造一辆车,也不要求美术再雕一套零件,而是让同一批资产按设备能力选择较粗的远景、较短的阴影、较少的透明层和合适的内部画面尺寸。每一档都要写清拿掉了什么、保住了什么,并在真机上证明节省没有偷偷转成模糊界面或隐藏人工返工。
(左脑)对表: 先固定同一台低端 Android、同一构建和路线:预热后用同一个连续五分钟窗口统计 P95 与纹理驻留峰值。30 FPS 对应约 33.3 ms;项目把 Player Frame Time P95≤33.3 ms 设为整帧门禁,并用 CPU/GPU P95 解释瓶颈来源。基线 CPU P95 为 18.0 ms、GPU P95 为 39.0 ms、Player Frame Time P95 为 40.4 ms,纹理驻留峰值为 1.16 GiB,接近 1.20 GiB 上限。再把换档杆实现为项目自定义的可编程配置资产(ScriptableObject QualityProfile),由它统一选择 Render Scale、以米计的阴影距离、LOD、Texture Streaming 与透明覆盖预算;界面使用独立清晰度路径。每个开关先单变量捕获,组合版本再用同一窗口和同一“峰值”口径复测。
小明:先形成一个完整猜测
小明提出把所有纹理减半、所有效果关闭。它确实能降低成本,也不需要重新制作资产;但 UI 和角色脸一起变糊,技能危险范围也不容易辨认。这个方案把“无需新增资产”误解成“无需定义视觉优先级”。
小红:把猜测放回现实检查
小红先确认 GPU 受限与内存压力分别来自哪里,再做互不混淆的 A/B:只降低 3D Render Scale,UI 保持原生分辨率;只缩短阴影距离并限制非关键角色投影;只调整远景 mip/Texture Streaming 预算;只减少低价值透明尾迹。每个版本都记录 GPU P95、驻留内存和同一镜头的画面差异。
单项结果没有直接相加。Render Scale 会改变后续像素效果的基线,纹理 mip 也会影响缓存;方案组合后,瓶颈可能转移。她因此要求最后再跑一次完整设备矩阵,而不是用表格里的“各省多少”推算总收益。
我:用检查结果修正模型
我把方案收进一个项目自定义的 ScriptableObject 配置资产 QualityProfile,而不是把它冒充 Unity 内置类型:低档可设置 3D 分辨率范围、阴影距离与投影者类别、最大 LOD、Texture Streaming 预算、粒子覆盖预算和已有 Shader 功能档;UI、角色轮廓和关键技能不跟着全局一起降。设备分档只选择配置,资产仍是同一份。
Importer 规则与 CI 检查负责指出超尺寸纹理、缺失 LOD、超预算粒子和不支持的 Shader 功能;例外必须写明原因。合并版本不叠加单项收益:在与基线相同的冷机预热和连续五分钟窗口中,CPU P95 为 18.3 ms、GPU P95 为 31.4 ms、Player Frame Time P95 为 32.1 ms,纹理驻留峰值为 0.92 GiB;连续运行 20 分钟后再取同长度窗口,CPU P95 为 18.8 ms、GPU P95 为 32.6 ms、Player Frame Time P95 为 33.1 ms,纹理驻留峰值为 0.94 GiB。整帧与分项时间分别低于 33.3 ms,驻留峰值低于 1.20 GiB,才算通过项目定义的这组门禁;若项目还限制掉帧率或最长帧,则要另行验收,P95 不能代替它。最后还要由美术在同一设备检查角色脸、UI 与技能轮廓,数据达标不能代替画面验收。
这套方案没有新增逐资产低配制作,却绝不是零成本:质量档开发、自动规则、例外处理、设备 QA 和长期维护都要记工时。证明“没有隐藏美术工作量”的证据,是原资产修改数量、人工例外数量、验收耗时和回归记录,而不是一句“全自动”。
(右脑)画面修正: 小明把纹理减半、效果全关,成本虽然下降,却同时毁掉 UI、角色脸和技能可读性,先纠正了“低成本就等于全局低画质”。小红把 Render Scale、阴影投影者、远景 mip 和透明长尾逐项捕获,再以组合版本复测:冷机 GPU P95 31.4 ms、整帧 P95 32.1 ms、驻留峰值 0.92 GiB;运行 20 分钟后分别为 32.6 ms、33.1 ms 和 0.94 GiB,仍通过 33.3 ms 整帧/分项时间门禁与 1.20 GiB 驻留门禁。原资产改动数、人工例外和验收工时又把“零美术工作”修正为“减少逐资产重复制作,但保留真实工程与 QA 成本”。
(左脑)严格对表: 先按设备固定 30 FPS、Player Frame Time P95≤33.3 ms、CPU/GPU 分项门禁与 1.20 GiB 驻留门禁,测整帧/CPU/GPU/内存并标注视觉优先级;为 Render Scale、阴影投影者、LOD、Texture Streaming 和粒子覆盖建立独立可回滚档位;单测后仅以组合版本在设备矩阵、冷机和热稳态重测。验收条件是同口径的 Player Frame Time P95、CPU/GPU P95 与驻留峰值全部过门禁,UI/角色/关键技能通过真机画审,同时记录原资产改动数、人工例外、QA 与维护工时,以证明节省的是重复制作而非隐藏成本。
老师解惑
- 先判断 CPU、GPU、带宽还是内存受限;同一组低配开关不会解决所有瓶颈。
- 动态分辨率、阴影、LOD、mip、透明层和 Shader 功能档作用在不同成本上,应按视觉优先级组合。
- 单项优化收益通常不能线性相加,组合版本必须重新测。
- “不增加美术工作量”更准确的目标是减少重复手工资产劳动,并把例外与验收成本透明化。
工具分工
- Unity Profiler 与平台 GPU 工具:确认 CPU/GPU、像素和带宽瓶颈。
- Memory Profiler/Texture Streaming 统计:检查 mip、驻留容量和峰值。
- 项目自定义 QualityProfile、Importer 与 CI Validator:由 ScriptableObject 配置集中分档,并自动拦截超预算资产;QualityProfile 不是 Unity 内置类型。
- 低端真机画面对照:让美术、策划共同确认角色、UI 和技能可读性没有被误伤。
记忆钩子
不另做一套低配资产,也要付工程和验收成本;把预算留给玩家真正看的地方。
这是教学场景,不是目标项目的真实捕获或个人经历。
下一步:验证这条因果
按 GPU、显存与带宽证据逐级降级,并保住辨识度。
教学边界:它只验证这一条画面因果,不替代完整答案、项目经历或目标设备数据。