相机内存拆解: 阶段 × 业务 × 利用率
iPhone 12 Pro (iOS 14.8, 越狱) vs HUAWEI Mate 80 Pro (HarmonyOS 7) · 实测 2026-10-13/14 ·
配套:
启动速率主报告 ·
轻重载与申请效率专页
+1.06GB
iOS M3 首帧前完成构建 (721ms 内, wired 818+msd 215+app 27)
~14GB/s
iOS 大波速率 (793MB wired / 55ms, faults Δ13653)
721 vs 1144ms
M3 首帧 iOS vs OHOS (4 轮 1139~1446; 双方初波主体都在 M3 前完成)
+1287MB
OHOS M3 前 ION (70%, 两轮 69~70% — 与 iOS 68% 同比例)
5.0GB/s
OHOS 初波峰值 (两轮 50ms: 5.20/5.04, 与 iOS 差 2.7×; 740ms 口径曾低估 3.5×)
100%
双方退出释放率 (无跨启动预分配, 再证 lifecycle)
一、iOS: 阶段拆解 (idle 冷启动, fpwatch 50ms 修正轮)
fpwatch (compare/tooling/fpwatch.c): 每采样重扫进程表 (Camera pid +110ms 即被捕获, 无发现延迟), 系统页计数 + faults/zero-fill 活动计数器, 绝对 wall 时间对齐; syslog 毫秒锚点。锚点链: +189 FrontBoard 受理 → +214 M1 spawn → +216 msd 客户端注册 → +711 首帧交付 → +721 M3 "Preview started" (app 自报 0.446s, 与 C5 基线 446ms 完全一致) → +902 UI 动画完成。
| iOS 阶段 (idle 冷启动) | 时刻 | Δwired (IOKit) | Δmsd_fp | Δcam_fp | 业务 |
|---|
| ① T0→spawn | 0→214ms | 0 | +1MB | +19MB | FrontBoard 受理+孵化, 框架装载 |
| ② msd 管线建立 | 214→273ms | 0 | +198MB | 0 | HNISP 客户端注册+管线对象 |
| ③ 蓄势 | 273→490ms | 0 | +11MB | +2MB | 属性探测/建流配置 |
| ④ 大波 | 490→545ms | +793MB | +1MB | 0 | IOKit/ISP 缓冲池 wired (~14GB/s, faults Δ13653) |
| ⑤ 首波下发→M3 首帧 | 545→721ms | +25MB | +5MB | +5MB | 6 池初始缓冲下发固件→首帧交付+Preview started |
| ⑥ M3→二波前 | 721→1182ms | 0 | +120MB | 0 | UI 动画完成, 深管线启动 |
| ⑦ 二波 (AI/深管线) | 1182→1554ms | +185MB | +190MB | 0 | ANE/AI 模型+深管线池 (二波 7 池下发) |
| ⑧ 尾部收敛 | 1554→2105ms | −22MB | +11MB | 0 | 稳态: 2.1s 起全平 |
| post 退出 | +26s killall | −848MB (500ms内) | 588→51MB | 0 | 全量快放, free +1.2GB |
| 聚合窗口 | wired | msd_fp | Camera app | 合计 |
|---|
| M3 前 (T0→721ms) | +818MB | +215MB | +27MB | ≈ +1.06GB |
| M3 后 (721ms→2.1s) | +163MB | +319MB | 0 | ≈ +0.50GB |
| 全程 | +998MB | +554MB | +27MB | ≈ 1.56GB |
启动窗口 (T0→+2.5s) · wired(IOKit) / mediaserverd / Camera app · fpwatch 50ms 实测
释放窗口 (killall@+26s) · 全量快放
⚠ 勘误 (2026-10-14): 本页首版曾发布"首帧轻装 <5MB / 大头全在首帧后"的结论——那是分析错误: 上一轮 camwatch 在 T0 前 2s 启动, 其相对时间 t=0 被误当 T0, 全部"阶段窗"实际落在发射前, 采到的是发射前的平静段。fpwatch 修正轮 (绝对时间对齐) 推翻该结论。正确结论见上表: 大头 (~2/3, ≈1.06GB) 在首帧前急建。两工具在修正 2s 偏移后波形一致 (大波均在 T0+0~0.5s)。
池业务: 初始缓冲下发 (固件池)
| 下发波 | poolID | 初始下发/poolSize | 预填率 |
|---|
| +584ms (主通道, 首帧前) | 0 / 2 / 1 / 8 | 16/24, 10/18, 3/13, 13/14 | 67% / 56% / 23% / 93% |
| +662ms (次通道) | 170 / 173 | 16/27, 10/15 | 59% / 67% |
| +1150~1279ms (二通道, 首帧后) | 136/138/137/144/34/36/42 | 16/28, 10/22, 3/13, 13/14, 16/23, 10/17, 13/14 | 57%~23% |
结构发现: 前装直付 (front-loaded & instant)。启动窗口 (T0→M3 721ms) 内完成 ≈1.06GB 构建: 顺序是 app 框架 (+19MB) → msd 管线对象 (+198MB) → IOKit/ISP 池 wired 大波 +793MB → 首波 6 池下发固件 → 首帧。"启动 <1s"与"1.6GB 内存构建"自洽的原因不是需求少, 而是申请瞬时: idle 供给分层下 (free 2.8GB ≫ 793MB), 大波 55ms 内完成 (~14GB/s, faults Δ13653 印证页触碰), 内核态 wiring 比用户态 mmap+mlock 直付 (5~6GB/s) 还快。M3 后仅剩 AI/深管线 ≈0.5GB (二波)。
进程拓扑: Camera app 本体 27MB (UI 壳), 相机管线全住 mediaserverd (48→582MB, 无跨启动预热)。
利用率: 峰值≈稳态 (2.1s 后全平, 无过冲); 退出 killall 后 500ms 内 wire −848MB / msd 588→51MB (全量快放); 池预填率 23~93% (initial send/poolSize, 其余按需补)。
与 C5/L7 互证: 重载 p3 同样的前装需求 M3 仅 +75ms——文件页捐赠路径 (L0 分层) 快; L7 "分批不提速"结论不变——瞬时性来自供给分层, 与分批无关。
二、OHOS: 阶段拆解 (新机 16GB 变体, 对齐 iOS 协议)
新连设备 = 同型号不同机器 (序列 018566257M003177, MemTotal 15.1GB vs 旧机 11.2GB)。主轮 staged4: ohfpwatch 50ms 采样 + hitrace 六 tag (zcamera hdf zimage graphic binder sched, 256MB buffer) 同窗抓 DMA 分配 trace 点 + 1.5s dmabuf 快照 + hilog 锚点; 辅轮 staged5: hiprofiler memory-plugin 250ms 逐 ino DMA 事件; T0 = aa start 请求 (boottime 经 /proc/uptime 对齐)。锚点: +661ms OpenCamera → +1144ms M3 isFirstFrame=1 → +4435ms LoadFirstFrameHebc (重构)。方差 (4 轮): M3 1139/1280/1446/1144ms; Hebc 4.4~7.8s (触发时机浮动); 峰值速率 5.20/5.04GB/s; M3 前占比 69/70% — 结构跨轮稳定。本节曲线/锚点/业务全部出自 staged4 同轮。
| OHOS 阶段 (staged4, 50ms + hitrace) | 时刻 | ΔION | trace 证据 (池事件/allocator) | 说明 |
|---|
| ① 孵化 | 0→0.66s | ≈0 (199→113 回落) | 0 池事件 | app spawn (T1=0.57s), daemon 待命 |
| ② 初波 | 0.78→1.5s | +1615MB | 101 池首配 0.79~1.0s; DmaHeapAlloc 208 事件/109MB | 峰值 5.04GB/s (284MB/55ms); 管线直配 + scouting 池 |
| ③ M3 | +1.144s | — | 池事件仍在进行 | 初波中段; M3 前 ION +1287MB (70%) |
| ④ 补深 | 1.5→2.5s | +375MB | 650 池补深事件/57 池 (至 7.5s) | AI 模型权重加载 + 池加深 (见下表) |
| ⑤ 平台 | 2.5→4.4s | ≈0 (1988) | 0 | 全平, 无任何申请 |
| ⑥ Hebc 重构 | +4.44s | +364/−390 | 51 池首配 4.46~4.93s | 拆 scouting → 建正式拍摄栈; ION 瞬时 2352→1963 |
| ⑦ 稳态 | >5.5s | 0 | WarpBuf 池低频换手 | dmabuf 1536MB, daemon RSS 312 |
| post 退出 | +24s kill | 回 87MB 基线 | — | 增量 100% 释放 |
| 进程 (MB, staged4) | 基线 | 峰值 | 稳态 | 对照 iOS |
|---|
| CameraDaemon | 184 | 337 (+153) | 312 | mediaserverd 48→582 (含管线对象) |
| 相机 app (ArkTS) | — (首采 +861ms 即 270) | 270 | 266 | Camera app 仅 27MB (10×差) |
| hiaiserver (NPU) | 18 | 25 | 23 | AI 权重在 msd wired 内 |
| camera_service | 21 | 30 | 30 | — |
| allocator_host | 3 | 3 | 3 (dmabuf 在别处计) | — |
阶段 × 业务 × 申请量 (hitrace 池事件毫秒首配 + 1.5s dmabuf 快照逐标签差分, 同轮 join; dmabuf 为相机系口径, ION 含全系统+内核池):
| 阶段 | 语义分组 | 业务明细 (ΔMB) | 量 | 证据来源 |
|---|
| ② 初波 0.78~1.5s | 硬件管线直配 | NULL +129 · DynamicMap1 +90 · SMARTISP_MODEL_FRAME +60 · movingPhoto +41 · HDC_PREVIEWSurface +34 · MSC/MULTI 各 +26 · ISP 权重 RDP/PSF ~48 · SceneRecognition +10 · THUMBNAIL +11 | ≈533MB | SNAP 差分 (直配路径不打池 trace) |
| ② 初波 | 初波池层·scouting | NS.8 +62 · Ppraw +31 · SmartIspBufPack +27 (侦察版, 后被拆) | ≈120MB | trace 首配 0.79~1.0s |
| ② 初波 | 初波池层·常驻 | PostImageStream +24 · VIDHANCE_EISAUTO.8/.9 +26 · XStyleOutput +10 · MSC_SOURCE.3 +7 · WarpBuf_TNR +5 | ≈77MB | trace 首配 0.79~1.0s (共 101 池) |
| ④ 补深 1.5~2.5s | AI 模型/权重 | AiComposition 38+20 · PP:AIComposition 24 · SMARTISP_AIAF 10 · AiAes 9+5 · SMART_PALETTE 8 · opflow 6 · CIE人脸 4 · bodyReid 4 · PonitTracker 4 · AWB_MASKNET 4 | ≈138MB | SNAP 差分 (权重经 ShareMemoryPool 直配) |
| ④ 补深 | 池加深/数据缓冲 | NS.8 scouting +161 · movingPhoto +95 · DynamicMap2 +89 · VIDHANCE +20 · NS scouting 家族 +50 | ≈413MB | SNAP 差分 + trace 650 补深事件 |
| ⑤ 平台 2.5~4.4s | — | 无任何业务申请 (−2MB) | 0 | 全平 |
| ⑥ Hebc 重构 4.44~4.93s | 新建·正式拍摄栈 | NS.8 正式 +106 · ipp_sve_mem +55 · Ppraw 正式 +33 · VidHanceFilterFake +32 · SmartIsp AI 包 +33 · ARSR +20 · NS.1/.21/.26/.22 +54 | ≈340MB | trace 首配 4.46~4.93s (51 池) |
| ⑥ Hebc 重构 | 拆除·scouting | NS.8 −223 · Ppraw −31 · SmartIsp −33 · NS 家族 −78 | ≈−365MB | SNAP 差分 (换装净 −25MB) |
| ⑦ 稳态 | 存留构成 | movingPhoto 136 · NULL 134 · NS.8 106 · DynamicMap1+2 178 · 1758 62 · SMARTISP_MODEL_FRAME 60 · ipp_sve 55 · VIDHANCE 40 · AiComposition 38 · HDC 34 | 1536MB | SNAP 单快照 |
hiprofiler 轮 (staged5, 熄屏冷启变体) — memory-plugin report_dma_mem_info 250ms 逐 ino 差分 (= 分配/释放事件), 配置语法经二进制逆向破解 (plugin_name "memory-plugin" + config_data { 扁平字段 }, cmd 自序列化)。与 hitrace 互补: 覆盖 hitrace 抓不到的直配层 (movingPhoto/ShareMemoryPool/AI 权重全有 ino 级事件)。
| staged5 发现 (熄屏冷启, 与 staged4 亮屏轮对照) | 值 | 解读 |
|---|
| 稳态规模 | 2347MB vs 1536MB (+53%) | 同为 aa start 协议, 但本轮从熄屏冷启 (IsScreenOn=0, aa start 唤屏) — 相机稳态足迹与启动场景/模式强相关 (三轮: 1552/1536/2347) |
| 主波 | +0.90s 首配 (movingPhoto/SMARTISP_MODEL_FRAME/MSC/PostImageStream) → +1.43s 主波 → +3.07s 峰值 2810MB | 比亮屏轮更长的构建窗 (0.9~3.1s vs 0.78~1.5s) |
| 瞬时过冲 | 2810 → 2347 (−463MB @+3.1~3.4s 修剪) | NS.8 瞬时建 670MB → 修剪到 106MB — scouting→正式 换装在这轮以「过冲-修剪」形态出现 |
| 迟到业务 | ipp_sve_mem +54.5 @+2.66s · VidHanceFilterFake +31.7 / ARSR +19.8 @+2.90s | 与 staged4 的 Hebc 层同族, 但没有集中重构锚点 (本轮 Hebc 在窗外) |
| +13.7~15.8s | +400MB 驻留波动 (2347→2814) | LivePhoto/EIS 活动 (hilog: LivePhotoAdapter/EIS 事件密集) |
| +16.1s | 全量销毁 (2812→20MB) | 屏幕 15s 超时熄灭 → 相机暂停销毁 — 非脚本所为; 尾部数据因此只取 T0→+6.5s |
| 覆盖对比 | hiprofiler DMA: 相机系 2347MB 全可见 (逐 ino); hitrace DmaHeapAlloc: 仅 210MB | hiprofiler 是字节级全覆盖的 DMA 事件源, 代价是 250ms 粒度 (插件读 /proc/process_dmabuf_info 的耗时) |
业务泳道: 初波=管线+scouting/常驻池 · 补深=AI 权重+池加深 · Hebc=换装 (新建/拆除对冲)
启动窗口 (T0→+5.5s) · ION used / MemAvailable · 50ms 采样 · 新机 16GB · hitrace 同窗轮
全窗 (0→46s) · 迟到波 (+7.8s Hebc) 与释放 (kill@+24s)
结构概念 (明细见上表): 三层建池 + 一次重构——①直配层 (ShareMemoryPool/代持/内核路径, 不打池 trace) 承担初波主力; ②池层 池多量小且分两批 (初波 101 池 → Hebc 51 池), scouting 池是"先侦察后正式"的换装结构 (NS.8 侦察 62→223 拆除 → 正式 106); ③AI 权重层 全部落在补深相位 (M3 后)。
口径: 表中 MB 为 dmabuf 相机系 (daemon+allocator+hiai 进程) 快照差分; ION 曲线为全系统——初波 ION +1615 vs dmabuf 相机系 +768, 差额为非相机进程 (render/graphic) + 内核内部 ION 池 (~430MB) 。
allocator 侧 trace 覆盖: DmaHeapAlloc 210MB / rtMallocIon 94MB, 仅 HDF dmabuf-heap 显式路径——大头不走该 trace 点 (诚实记录)。
诚实清单: SNAP 稳态累加 bug 踩两次 (analyzer v1/v2 均修单快照); 业务归因曾跨轮缝合 (现全 staged4 同轮); 740ms 口径曾把波速报 1.49GB/s (50ms 实测 5.0~5.2); M3 四轮 1139~1446ms; Hebc 触发 4.4~7.8s 浮动; hitrace 自耗 ~4.5% CPU; app RSS 0→270 在发现间隙内; pgfault 恒 0; 直配层无法毫秒归因 (仅 1.5s 快照差分下界, staged5 hiprofiler 后缩至 250ms); staged5 教训: ps -ef 显示 [wei.hmos.camera] 括号名致 settle 漏检 (轮前相机已在跑 2347MB 稳态, 首轮作废); staged5 为熄屏冷启场景 (稳态 2347 vs 亮屏 1536, 场景强相关) 且尾部 +16.1s 被屏幕超时销毁污染 (只取 T0→+6.5s)。
三、OHOS (旧机 12GB): 业务分布 (dmabuf 四相审计)
/sys/kernel/debug/dma_buf/bufinfo 全表快照 ×4 相位 (pre/steady+12s/late+45s/post)。相机归属 = CameraDaemon 全部 + hiaiserver 全部 + allocator_host 增量 (排除系统常驻数字 tag)。
| OHOS 业务组 (steady) | 池数 | buffers | MB | 占比 |
|---|
| ① 图像源流水线 NORMAL_SOURCE | 100 | — | 307.1 | 24% |
| ② 动态映射缓冲 (对齐/畸变) | 2 | 2 | 178.0 | 14% |
| ④ SmartISP 共享内存/工作区 | 136 | — | 169.6 | 13% |
| ⑨ 未标记 (daemon 内部) | 117 | — | 108.8 | 8% |
| ⑩ 其他小池 | 222 | — | 102.3 | 8% |
| ③ AI 模型权重 (NPU .om) | 20 | — | 94.9 | 7% |
| ⑥ 拍照后处理/XStyle | 69 | — | 86.5 | 7% |
| ⑧ RAW/MSC 处理 | 13 | — | 85.4 | 6% |
| ⑤ 显示/预览通路 | 22 | — | 52.8 | 4% |
| ⑦ VIDHANCE 防抖 | 20 | — | 45.9 | 3% |
| OHOS 相位 | CameraDaemon | allocator_host (代持) | hiaiserver (NPU) | 说明 |
|---|
| pre (相机关) | 0 | 137.8MB (系统常驻) | 0 | floor |
| steady (+12s) | 972.8MB | 223.9MB (+86 相机) | 172.4MB | 急建完成, 合计 ~1231MB |
| late (+45s) | 972.8MB (平) | 223.9MB (平) | 181.8MB (+9.4) | 仅 NPU 模型延迟加载 |
| post (退出+8s) | 0 | 140.3MB (≈pre) | 0 | 100% 释放 |
相位事实: pre 全零 → steady 全量 (启动窗口内急建 100%) → late 几乎零增长 (仅 hiaiserver NPU 模型 +9.4MB 延迟加载) → post 全释放。NORMAL_SOURCE 池深 8~20 buffers。dmabuf 视角 1231MB vs ION 物理 1846MB——~615MB 在内核内部 ION 池, dmabuf 层不可归因。
四、跨平台对齐 (iOS 12Pro vs OHOS 新机, 同协议 idle 实测)
| 维度 | iPhone 12 Pro (iOS 14.8) | Mate 80 Pro (HarmonyOS 7) |
|---|
| M3 首帧 | 721ms (app 自报 446ms, C5 一致) | 1144ms (4 轮 1139~1446, isFirstFrame=1) |
| M3 首帧前构建量 | ≈1.06GB (wired 818+msd 215+app 27; 大波提前 176ms 完成) | ION +1506MB (85%) (大波提前 ~140ms 完成) |
| M3 后构建量 | ≈0.50GB (AI/深管线, 至 2.1s) | 补深 0.38GB + Hebc 重构 (瞬时+0.36/净−0.03GB) |
| 大波速率 | ~14GB/s (793MB/55ms, faults Δ13653) | 初波峰值 5.04~5.20GB/s (两轮 50ms, 2.7×差) |
| 大波供给 | free 直付 (free 2.8GB≫需求, 压缩Δ=0) | ION cache 驱逐 −1411MB (过路资金) + MA −1.15GB |
| 首帧等大波? | 是 (波完成→176ms→M3) | 初波主体在 M3 前完成 (70%); 首帧不等补深/重构层 |
| 进程拓扑 | Camera app 27MB (壳) + mediaserverd 48→582MB | app 266MB (ArkTS runtime 在进程内, 10×) + daemon RSS 312 + ION 1963 |
| AI/模型内存 | ANE 模型 wired +185MB 于二波 (M3 后 1.18~1.55s) | AiCompositionModel 38MB (直配层) + SmartIsp AI 包/ARSR (Hebc 重构层) |
| 图像源池 | ISP 池 13 个 (预填 23~93%, 按需补) | NORMAL_SOURCE 家族 283MB (Hebc 层) + DynamicMap 178 (直配层) |
| 峰值 vs 稳态 | wired 回落 2% (无过冲) | daemon RSS 324→308 (无过冲) |
| 退出释放率 | 100% (500ms 内 wire −848MB) | 100% 增量 (ION 回 112MB 地板, 残留 87≈轮前基线 85) |
| 跨启动预热 | 无 (msd 48MB 地板起步) | 无 (ION 176MB 地板起步) |
与 L7 (分批 vs 一次性) 互证: iOS 大头 (793MB 大波) 在首帧前完成且瞬时 (~14GB/s)——瞬时性来自供给分层直付 (L0 headroom/文件页捐赠, 压缩Δ=0), 与"分批"无关 (L7 已证 JIT 回收下分批零收益)。重载 p3 下同样前装需求 M3 仅 +75ms (捐赠路径快)。两平台真正差异: ① idle 建池速率 ~14GB/s vs 重载 OHOS ~170MB/s; ② 重载下 OHOS 首帧路径的分配排队 (59~62MB/s 有效追赶), iOS 分层直付。
对 C5 表述的修正: "p3 wired +1058MB → 首帧 +14%" 的因果已重写——那 +1GB 在首帧后, +75ms 罚金来自孵化/初始小缓冲的轻度挤压, 不是大分配挤占。
四、方法论与诚实清单
| 项 | iOS | OHOS |
|---|
| 采样 | fpwatch 50ms (页计数+faults 计数+双进程 fp; 首版 camwatch 有 2s 时间偏移分析错误, 已勘误) | ohfpwatch 50ms (913 拍) + 1.5s dmabuf 快照 + hitrace DMA 分配 trace 点 (tag 映射实测: zcamera/hdf→池层, zimage/graphic/binder→allocator 层) + hiprofiler memory-plugin 250ms 逐 ino DMA 事件 (staged5, 覆盖直配层); 旧机另有四相快照 |
| 锚点 | syslog 毫秒 (HNISP/ANE/CMSession) | hilog 毫秒 + hitrace 池事件毫秒 (boottime↔wall 经 /proc/uptime 对齐) |
| 业务标签 | syslog 池消息 (poolID/count/size) | dmabuf usage tag + 池事件 join (池id↔tag) + SNAP 单快照口径 |
| 细粒度阶段 | 已测 (fpwatch 50ms) | 已测 (50ms×913 拍 + hitrace 毫秒池事件) |
| wired 语义 | IOKit wired 代理 (mlock 类比已校准) | — |
| 失败记录 | 熄屏锁拒启(code=7)已重跑; camwatch 2s 偏移已勘误 | 新机缺 tr (v1 RSS 全灭); aa start pid 竞态 (v2 劫持, v3 尾锚修复) |
| 已知盲区 | iOS 无 per-buffer 审计 (池消息只有初始下发) | dmabuf↔ION 差 615MB 内核池不可归因; 池内 touch 率不可测 |
数据归档: ios/staged/staged2-103948 (fpwatch) · ohos/staged/staged4-114133 (50ms+hitrace) · staged5-151641 (hiprofiler 250ms) · ohos/C5/tp2 (旧机) · 分析器 analyze_ohos_staged.py / analyze_staged_buf.py · 生成器 build_mem_site.py