这份附录解决什么问题
团队里最贵的争论往往不是「怎么做」,而是「你说的和我说的不是一个东西」。同一个「崩溃率」,有人按会话算,有人按设备算,有人把 ANR 也算进去,于是两个人都没错,结论却完全相反。
这份附录把卷一用到的术语和指标固定成一套口径。**正文与本附录冲突时,以本附录为准。**指标部分给出定义、计算公式、分母和常见误用,可以直接抄进团队的指标字典。
一、结构类术语
| 术语 | 定义 | 不要混用 |
|---|---|---|
| 客户端 | 运行在玩家移动设备上的应用,包含壳、引擎、玩法与资源 | 不要用「前端」指代 |
| 壳(Shell) | Android Activity / iOS UIViewController 构成的承载层,负责生命周期、权限、原生 SDK 接入 | 不要用「壳」指引擎 |
| 引擎 | 提供渲染、音频、动画、资源加载能力的运行时 | 不是架构的同义词 |
| Host | 客户端对引擎与平台能力的抽象接口,是实验工程里可替换的依赖 | 不要写成「引擎层」 |
| 表现层 | 渲染、动画、特效、音效,只消费状态,不产生玩法结果 | 不属于「玩法」 |
| 玩法层 | 规则、结算、确定性回放,不依赖渲染与引擎 | 不要与「表现层」合并 |
| 系统层 | 账号、活动、存档、配置、埋点等横切能力 | 不要与「平台层」混称 |
| 平台层 | Host、桥接、原生 SDK、文件与网络适配 | 不要塞玩法逻辑 |
| 配置 / 配置表 / 配置版本 | 策划产出的玩法数据、其结构化集合、以及一次发布的版本标识 | 不要写成「数据表」 |
| 恢复令牌 | 客户端在进入后台或关键节点写入的状态快照标识,用于判断能否恢复 | 不是存档 |
| 水位 | 触发降级或告警的内存阈值,分告警水位与强降水线 | 不要与「帧预算」混用 |
| 区域化 | 语言、时区、货币、内容分级的组合配置 | 不等于「翻译」 |
三条容易含混的用法:
- 「层」有方向。 表现层可以依赖玩法层,玩法层不能依赖表现层。说「这两层互相调用」时,先确认你说的是不是同一个「层」。
- 「热更」不是「配置更新」。 热更指替换可执行资源或脚本;配置更新指换一份配置版本。二者的政策边界完全不同。
- 「弱联网」是产品形态,不是网络质量。 弱联网指客户端能在离线或弱网下完成核心玩法;网络质量差是运行环境,两者不能互相替代。
二、包体与资源指标
| 指标 | 定义 | 单位 | 口径要点 |
|---|---|---|---|
| 包体 | 应用商店可安装的安装包大小 | MB | Android 与 iOS 分开统计,不取平均 |
| 首包 | 首次启动必需、随安装包或首启下发的最小资源集 | MB | 含启动必需配置与首屏资源 |
| 总资源 | 全量玩法与活动资源总和 | MB | 不含用户生成内容 |
| 首包占比 | 首包 ÷ 总资源 | % | 用于判断首启下载压力 |
| 资源重复率 | 同一资源内容在多包中出现的字节占比 | % | 按内容哈希统计,不按文件名 |
案例设定:《潮汐消消》首包 120MB、总资源 480MB,首包占比 25%;《潮汐方舟》首包 350MB、总资源 1.8GB,首包占比约 19%。方舟占比更低,但绝对首包是消消的近三倍,两者面对的转化风险不同。
常见误用:
- 把「下载后占用的磁盘空间」当成包体。解压后的资源通常远大于包体。
- 用首包占比单独判断优劣。占比低不代表体验好,绝对体积才是首启流失的主因。
- 统计总资源时把多语言资源全部计入,却不说明其中多少是按需下发。
三、启动与恢复指标
| 指标 | 定义 | 起点 | 终点 |
|---|---|---|---|
| 冷启动 | 进程不存在时的启动耗时 | 用户点击图标 | 首屏可交互 |
| 热启动 | 进程存活、应用在后台时的恢复耗时 | 用户切回应用 | 首屏可交互 |
| 首帧时间 | 从进程启动到第一帧画面呈现 | 进程创建 | 首帧上屏 |
| 恢复成功率 | 从后台或杀进程后成功回到合理状态的次数占比 | — | — |
冷启动按 P50 与 P95 分别统计,不要只看平均值。案例设定中,消消冷启动 1.8s / 3.2s(P50 / P95),方舟 3.5s / 6.8s;热启动 P50 分别为 0.6s 与 1.1s;低端机首帧 P95 为 2.6s 与 5.4s。
常见误用:
- 把「冷启动」测成「第二次启动」,因为测试前进程已被系统缓存预热。
- 只统计成功启动的会话。启动失败与闪退必须进入分母,否则指标会越优化越好看。
- 用首帧时间代替可交互时间。首帧上了屏,玩家仍可能点不动。
四、内存指标
| 指标 | 定义 | 口径要点 |
|---|---|---|
| 稳态内存 | 进入主界面并稳定 60 秒后的常驻内存 | 取中位数,不用峰值 |
| 峰值内存 | 单次会话中的最高常驻内存 | 记录发生场景 |
| 内存水位 | 触发告警或降级的阈值 | 告警水位与强降水线分开 |
| 内存回退 | 降级后内存是否能回到水位以下 | 多数泄漏问题在这里暴露 |
案例设定:消消低端机稳态内存 420MB、告警水位 520MB;方舟 1,150MB、告警水位 1,450MB。两个水位都不是「设备上限」,而是「产品可接受的上限」——低于系统杀进程线,给系统和其它应用留出余量。
常见误用:
- 用进程峰值代替稳态。峰值受单次大场景影响,不能反映长期趋势。
- 把「内存占用低」当作唯一目标。过度回收会导致反复加载,帧率和耗电反而变差。
- 不同机型混算平均。低端机与高端机的内存曲线不是同一条,必须分档统计。
五、流畅度指标
| 指标 | 定义 | 计算方式 |
|---|---|---|
| 帧预算 | 每帧可用的时间上限 | 30fps 为 33.3ms,60fps 为 16.7ms |
| 长帧 | 超过 100ms 的单帧 | 计数,不取平均 |
| Jank 率 | 长帧数 ÷ 总帧数 | 按会话统计 |
| 掉帧率 | 超出目标帧间隔的帧占比 | 需声明目标帧率 |
| 帧率档位 | 客户端当前选择的目标帧率 | 30 / 60,含升降档规则 |
案例设定:消消 Jank 率 2.1%,方舟 1.4%。这个数字看起来方舟更好,但要注意分母不同:方舟 60fps 下总帧数约为消消 30fps 的两倍,同样的长帧数量会算出更低的 Jank 率。跨产品比较 Jank 率之前,先确认目标帧率一致。
常见误用:
- 用平均帧率描述体验。平均 55fps 可能由大量 60fps 和少量 20fps 拼成,体感比稳定 45fps 更差。
- 只统计前台活跃帧。切后台、加载、结算的过程同样会产生长帧。
- 把「帧率上限被系统限制」算作客户端性能问题。先排除设备省电模式与系统调度。
六、稳定性指标
| 指标 | 定义 | 分母 | 口径要点 |
|---|---|---|---|
| 崩溃率(会话) | 发生崩溃的会话数 ÷ 总会话数 | 会话 | 最常用,需声明是否含启动崩溃 |
| 崩溃率(设备) | 发生崩溃的设备数 ÷ 活跃设备数 | 设备 | 对长尾机型更敏感 |
| ANR 率 | 发生 ANR 的会话数 ÷ 总会话数 | 会话 | Android 专有;iOS 对应卡死/看门狗 |
| 启动崩溃率 | 启动阶段崩溃数 ÷ 启动次数 | 启动 | 单独统计,不能混入总会话 |
案例设定:消消崩溃率 0.18%、ANR 率 0.05%;方舟 0.12%、0.03%。方舟的崩溃率更低,不代表稳定性更好——方舟单场 8–12 分钟,一次崩溃的沉没成本远高于消消的 90 秒一局,同样的崩溃率对应的玩家损失更高。
常见误用:
- 不声明分母。会话、设备、启动次数三种口径的数值能差出几倍。
- 把 ANR 并入崩溃率。两者的归因路径完全不同:崩溃看堆栈,ANR 看主线程阻塞。
- 只看总体崩溃率,不看版本、机型、渠道、区域四个切片的分布。0.1% 的整体崩溃率可能藏着一个机型 5% 的分支。
七、网络与时区相关术语
| 术语 | 定义 | 口径要点 |
|---|---|---|
| 服务器时间权威 | 所有与奖励、结算、活动开启相关的时间以服务端为准 | 客户端时间只用于展示 |
| 时钟偏移 | 客户端本地时间与服务端时间的差值 | 需在登录时校准并持续修正 |
| 离线队列 | 弱网或离线时暂存、恢复后补发的操作序列 | 必须定义过期与冲突规则 |
| 时区口径 | 活动按 UTC、服务器时区还是玩家本地时区计算 | 同一产品内必须唯一 |
常见误用:
- 用客户端时间判断活动是否开启。改系统时间就能绕过。
- 跨时区活动按本地零点切换。玩家在不同时区会看到不同的开始时间,客诉与作弊都随之而来。
- 把时钟偏移当成「设备时间不准」。偏移是常态,架构必须假设它会存在。
八、可观测性术语
| 术语 | 定义 | 口径要点 |
|---|---|---|
| 事件 | 客户端上报的一条结构化记录 | 必须有 schema 与版本 |
| 采样 | 按比例或规则只上报部分事件 | 采样率必须随事件一起上报 |
| 脱敏 | 移除或替换事件中的敏感字段 | 在客户端完成,不能依赖后端 |
| 切片 | 按版本、机型、渠道、区域等维度拆分指标 | 至少四维,缺一不可 |
| 定位闭环 | 从告警到定位、修复、回归验证的完整链路 | 缺任一环都不算闭环 |
常见误用:
- 采样后不记录采样率,导致后端无法还原真实量级。
- 在客户端上报原始用户标识。脱敏必须在采集端完成。
- 只做告警不做回归。没有回归验证的修复,等于把同一个问题留给下个版本。
九、一句话口径表
如果只能记住九句话:
- 包体按平台分开算,首包看绝对值,不看占比。
- 冷启动看 P95,不看平均值。
- 稳态内存取中位数,峰值要带场景。
- 帧预算由目标帧率决定,跨产品比较前先对齐帧率。
- 崩溃率必须声明分母,启动崩溃单独统计。
- ANR 与崩溃分开看,归因路径不同。
- 所有奖励与结算时间以服务端为准。
- 采样率必须随事件上报。
- 任何一个指标,不切片就没有决策价值。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。