跨目标降级:散落的 DS 判断不能组成能力契约
自动关联目录:跨目标降级:散落的 DS 判断不能组成能力契约
核心判断:在 Actor、网格、粒子、GUI 和材质代码中分别判断“是不是 DS/移动端”,可以快速止损,却无法证明整个对象没有加载错误依赖。跨目标交付需要一份从制品解析到运行时物化都生效的能力契约。
一、业务冲突:同一份内容要运行,运行方式却不能相同
桌面客户端、移动客户端、轻量运行时和 DS 应共享玩法语义,但可用能力不同。DS 需要身份、脚本、碰撞、导航、权威状态和网络,不需要纹理、材质、粒子、音频、相机和 GUI;移动端仍要完整交互,却受 GPU 格式、内存、带宽和热稳定性约束。
最直接的实现是在每个功能里加平台判断。它能避免某段视觉代码在 DS 执行,但不能阻止上游已经下载视觉制品、创建空 Actor、注册无用 Component,或在进入分支前加载模块和默认资源。
二、实际实现:目标判断真实存在,但分布在生命周期中段
工程实践已经在网格构建、Part 属性应用、粒子聚合、GUI、光照和 Actor Bridge 中跳过 DS 呈现工作;流式策略还把移动端作为更积极回收的输入。UI 动态图集会按运行目标限制页数和图片尺寸,并按 ASTC/BC 等块格式对齐页尺寸、行距和上传字节,不能把任意像素矩形直接复制进压缩纹理。
这些实现说明跨目标问题不是抽象设想,而是已经侵入资产格式、物化、内存与表现。问题是判断分散:有的使用进程级 DS,有的使用 World NetMode,有的依赖脚本身份或“是否正在 Play”。生命周期早期和多 World 场景下,这些信号不总是等价。
三、值得保留:玩法真相和呈现依赖已经可以分开
- DS 跳过网格 UV、材质、粒子、天空和 GUI,而保留必要碰撞与权威对象。
- UI 图集按目标设置硬内存上限,大图明确回退原图,不为合批强制降质。
- 压缩纹理上传按 PixelFormat 的块宽、块高和块字节计算,覆盖非方形块与边缘补齐。
- 空间流式将设备内存与地图规模纳入回收策略,而不是只看画质 CVar。
四、结构性缺陷:分支只描述“不做什么”,没有描述“必须有什么”
散落的早返回容易产生半初始化对象:Actor 已创建,但视觉 Component 为空;DS 跳过网格后,碰撞是否来自独立制品并不由该分支保证;移动端禁用某材质后,玩法提示是否仍可读也没有替代契约。
跨平台也不是一个枚举。PixelFormat、触控、硬件解码、内存等级、热状态、网络质量和后台限制可以独立变化。用 Mobile=true 代表全部能力,会让资产、输入和性能策略绑在同一个粗粒度标签上。
五、目标设计:一次解析 Capability Profile,全链路消费
在会话/World 建立时生成不可变能力快照,来源包括构建目标、RHI/PixelFormat、设备档位、输入设备、NetMode 和运行时压力。资产解析器先据此选择制品,物化器再据此选择表示,表现系统只做局部动态降级。
struct CapabilityProfile {
bool render, audio, ui, localInput;
bool authoritativeSimulation, navigation, collision;
TextureFamily textureFamily;
Budget memory, gpu, gameThread, network;
uint64 revision;
};
ArtifactSet artifacts = manifest.Resolve(profile);
Representation rep = representationPolicy.Resolve(content, profile);
ValidateRequiredGameplayCapabilities(content, profile, artifacts, rep);| 领域 | 可降级 | 不可破坏的契约 |
|---|---|---|
| 资产/包 | 不下载视觉变体、选低规格纹理 | 摘要、版本、依赖闭包正确 |
| 渲染/动画 | LOD、降频、代理、隐藏 | 命中提示与关键动作可读 |
| 物理 | 简化形状、查询降频 | 权威碰撞和玩法结果一致 |
| 输入/UI | 布局和映射适配 | 同一语义 Action 与可操作性 |
| 音频 | Voice 数和质量下降 | 关键反馈有可替代提示 |
| 网络 | 频率和字段相关性下降 | 权威顺序、代次和恢复成立 |
| DS | 全部呈现能力关闭 | 脚本、碰撞、导航、复制可用 |
热降级只修改 Profile 的压力层 Revision,不改变稳定能力;模块收到变化后幂等重算,旧异步结果按 Revision 拒绝。
六、验证:测试的是目标组合,不是宏是否编译
每个目标都要验证制品集合、模块加载、UObject/Component 数、资源驻留、输入路径和玩法不变量。DS 需要断言零视觉依赖且权威碰撞可用;移动端需要覆盖实际压缩格式、块对齐、内存压力恢复和触控;桌面端要验证高质量变体不会误用移动制品。
最终决策规则:平台分支可以执行能力契约,但不能定义能力契约;越早在制品解析阶段裁剪,越少在 Actor 内部留下半初始化状态。