docs: 决策分析报告 v1.1-v1.2 — Kapi 流畅根因 + 综合优化方案评估

v1.1 §12 Kapi 流畅根因实测对比:
- 同一份日志含 Baji+Kapi 在同一 Wi-Fi 下的 RTC 通话数据
- SSID/BSSID/RSSI 完全等价, 但 Baji reor=1790 / Kapi reor=0~226 (8 倍)
- 根因 1: Kapi WiFi 缓冲 16/16 vs Baji 8/10
- 根因 2: Kapi 无 LCD/LVGL/GIF, PSRAM 总线宽松
- 给出 Baji 卡顿最终定论(不是网络问题)
- 反向给 Kapi 的预防指导(未来加 LCD/动画的避坑)

v1.2 §12.7 综合内存 + GIF 4 方案评估(交叉引用 Baji v2.2):
- 同步否决方案 A (GIF EMBED 爆 OTA) + 方案 C (RGB565 Flash 不够)
- 同步推荐方案 B (通话期暂停 GIF)
- Kapi 本身无 LCD/GIF 不需做这些, 但作为底座项目记录
- 给未来 Kapi 加 LCD/动画的指导: 学 Baji 教训, 不要用 GIF 持续解码

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Rdzleo 2026-05-14 16:51:36 +08:00
parent fe8173752d
commit d5239cf471

View File

@ -376,3 +376,169 @@ Baji_Rtc_Toy 项目目前 internal SRAM 仅剩 **44KB**(参见 Baji 项目 `do
而 Kapi_Rtc_toy 项目 internal SRAM 余量 **80-130KB**,启用 AFE 后仍有 **50-100KB 安全余量** 而 Kapi_Rtc_toy 项目 internal SRAM 余量 **80-130KB**,启用 AFE 后仍有 **50-100KB 安全余量**
**结论**:未来如要验证 ESP-SR AFE 启用方案,**应该优先在 Kapi 项目实验**,跑通后再回到 Baji 评估资源能否承载。 **结论**:未来如要验证 ESP-SR AFE 启用方案,**应该优先在 Kapi 项目实验**,跑通后再回到 Baji 评估资源能否承载。
---
## 12. 🔥 关键发现Kapi 流畅的真正原因2026-05-14 实测对比新增)
### 12.1 同 Wi-Fi 实测对比铁证
用户提供同一份日志,同时包含 Baji 和 Kapi 在**同一台 Wi-Fi 路由器**下的 RTC 通话数据:
| 项 | **Baji_Rtc_Toy**(卡顿) | **Kapi_Rtc_toy**(流畅) |
|---|---|---|
| SSID / BSSID | airhub / 70:2a:d7:85:bc:eb | airhub / 70:2a:d7:85:bc:eb |
| RSSI | 31~33 dBm | 32~38 dBm |
| 设备 MAC | d0:cf:13:03:bb:f0 | 20:6e:f1:b9:af:a0 |
**完全同一台路由器、同一信号强度**Kapi 信号甚至更弱38
### 12.2 RTC jitter buffer 抖动指标对比(**Kapi 完胜 8 倍**
| RTC 内部抖动指标 | Baji同 WiFi | Kapi同 WiFi | 差距 |
|---|---|---|---|
| **reor**RTP 包乱序)| 826 ~ 1790 | **0 ~ 226** | Baji 是 Kapi 的 **8 倍** |
| **expand_loss**PLC 补丢包)| 24 ~ 112 | **0** | Baji 一直在补丢包 |
| **wj**wall jitter| 295 ~ 646 | **42 ~ 75** | Baji 是 Kapi 的 **8 倍** |
| **buffer_ms**(实际缓冲深度)| 20 ~ 260不稳| **180 ~ 480**(稳定)| Kapi 一直从容 |
| 每 2 秒收到 RTP 包数 | 17 ~ 74持续丢| **82 ~ 102**(完整)| Baji 持续丢包 |
### 12.3 Kapi 流畅的两个根本原因
#### 根因 ① — WiFi 协议栈缓冲区配置Kapi 比 Baji 大 1.6~2 倍)
启动日志直接打印的硬数据:
| sdkconfig 项 | Baji | **Kapi** | 优势 |
|---|---|---|---|
| `CONFIG_ESP_WIFI_STATIC_TX_BUFFER_NUM` | 8 | **16** | Kapi **2 倍** |
| `CONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM` | 10 | **16** | Kapi **1.6 倍** |
WiFi RX 缓冲足够大 → 包密集到达时 WiFi 驱动来得及消化 → **不丢包、不重排** → reor=0。
#### 根因 ② — 系统资源竞争Kapi 无 LCD/LVGL/GIF
| 同时跑的任务 | Baji | **Kapi** |
|---|---|---|
| LVGL 渲染Core 0| ✅ 占 CPU + DRAM | ❌ **无 LCD** |
| GIF 解码(数字人 hiyori 持续)| ✅ 频繁占 PSRAM 总线 | ❌ **无 GIF** |
| LCD QSPI DMA 刷新 | ✅ 频繁 | ❌ **无 LCD** |
| RTC + WiFi | ✅ | ✅ |
| 应援灯 / BLE 图传 | ✅ | ❌ |
Kapi 的 **PSRAM 总线没有 GIF 解码竞争**WiFi 协议栈数据通路畅通,所以 jitter buffer 看到的就是顺序、完整的包。
### 12.4 这就是音频播放卡顿的根本原因(最终定论)
**反复以为是网络问题(信道拥挤 / 上行抖动 / 服务端处理慢)都是误诊**。同 Wi-Fi 同信号下 Kapi 流畅、Baji 卡顿,铁证如下:
> **卡顿 = 设备内部资源竞争WiFi 缓冲不足 + LVGL/GIF 抢 PSRAM 总线), 不是网络问题。**
Kapi 之所以流畅,是因为:
1. WiFi 缓冲区从 sdkconfig 层面就配置得更大16/16 vs 8/10
2. 无 LCD 业务负载CPU + PSRAM 总线宽松
3. 没有数字人 GIF 解码持续消耗资源
### 12.5 对 Kapi 后续优化的指导意义
#### 当前 Kapi 状态总结
- ✅ **RTC 通话基本流畅**reor 0~226 已经是良好水平)
- ✅ **WiFi 缓冲已经配大了**sdkconfig 16/16
- ❌ **无 LCD/无 GIF 业务**,不存在 Baji 的资源竞争问题
#### Kapi 上做 RTC 优化的特别优势
1. **跑通的优化方案直接可信** — Kapi 没有 LVGL/GIF 干扰,效果就是 RTC/codec 本身能力的真实表现
2. **AFE 启用更安全** — Internal SRAM 余量 80-130KBvs Baji 44KBAFE 25-35KB SRAM 占用后仍有 50-100KB 安全垫
3. **WiFi 缓冲已就位** — 不需要像 Baji 那样先解决 WiFi 缓冲问题再做其他优化
#### 倒推 Baji 优化路线(结合此发现)
Baji 短期最该做的不是 AFE 也不是 Opus这俩 SRAM 都不够),而是:
1. **P1: 通话期间暂停 GIF + LVGL 降频**(释放 PSRAM 总线)→ reor 1800→500
2. **P2: audio_loop pri 8→5**(与官方对齐,让 WiFi 中断优先)
3. **P3: 等 Phase 7.6 释放 SRAM 后**,把 WiFi 缓冲从 8/10 改到 16/16对齐 Kapi 配置 → reor 500→100
**Baji 抖动问题的解决路径与"启用 AFE / 换 Opus"无关**,是内部资源竞争修复,与本文档讨论的方案 A/B/C 都不冲突。
### 12.6 反向给 Kapi 的提醒
虽然 Kapi 当前流畅,但**如果未来在 Kapi 上加任何屏显/动画/重型任务**,要警惕以下踩坑路径:
- LVGL 启用前先测试当前 PSRAM 带宽富余度
- WiFi 缓冲不要因为内存压力主动缩小(保持 16/16
- GIF 解码任务必须可暂停,通话期不解码
- 任何新增 PSRAM 重 IO 任务(图片解码/视频)都要先评估对 RTC reor 指标的影响
**简言之**Kapi 当前的流畅是"业务功能少 + WiFi 缓冲大"换来的,**新增任何业务时都要做对比基准测试**。
---
## 12.7 🧠 Baji 综合内存优化 + GIF 转 C 数组方案评估2026-05-14 交叉引用)
为了让 Baji 达到与 Kapi 同等的流畅度,用户提出两个优化思路并要求评估。**Kapi 项目本身不需要做这些(无 LCD/GIF**,但因为底座关系记录在此供参考。
### 12.7.1 用户提出的两个思路
> 1. ESP32-S3-WROOM-1-N16R8 SRAM 是 512KB综合优化内存管理是否可行卡顿改善多少
> 2. 当前 GIF 存 SPIFFS 解码,能否用 LVGL imageconverter 转 C 数组烧入固件减少 SRAM/存储开销?
### 12.7.2 SRAM 真相(两个项目通用)
| 区域 | 大小 |
|---|---|
| 物理 SRAM 总量 | **512 KB** |
| ROM Data | 32 KB |
| RTC SRAM | 16 KB |
| IRAM指令| ~80 KB |
| **可用 DRAM 堆** | **~320 KB**(应用层上限) |
Baji 启动后剩 ~44KBKapi 启动后剩 ~80-130KB差异在 LVGL/GIF/字体)。
### 12.7.3 Baji 已启用的内存优化
| 优化项 | 状态 |
|---|---|
| `BT_ALLOCATION_FROM_SPIRAM_FIRST` | ✅ 已开 |
| `SPIRAM_USE_MALLOC` | ✅ 已开 |
| `SPIRAM_TRY_ALLOCATE_WIFI_LWIP` | ✅ 已开 |
| `MBEDTLS_DYNAMIC_BUFFER` | ✅ 已开 |
| `LV_USE_LARGE_COORD` | ✅ 关(节省 SRAM|
**Baji 已经做了 80% 基础优化**,剩可挖 70-100KB。
### 12.7.4 GIF 转 C 数组4 方案对比)
| 方案 | SRAM 代价 | PSRAM 带宽 | Flash 占用 | 推荐度 |
|---|---|---|---|---|
| **A. GIF 转 C 数组EMBED** | 0 | 不变 | **+2MB 爆 OTA 分区** | ❌ 否决 |
| **B. 通话期间暂停 GIF** | 0 | **减 80%** | 0 | ⭐⭐⭐ 强推荐 |
| C. 转 RGB565 帧序列 | 小 | 减 50% | **+6MB Flash 不够** | ❌ 否决 |
| D. PNG 序列 + lv_anim | 小 | 减 30% | +1-2MB | ⚠️ 复杂可考虑 |
**关键认知**
- LVGL imageconverter 主要处理**单帧**,不能直接转 GIF 动画。EMBED 是用 ESP-IDF 的 `EMBED_FILES` 把 .gif 二进制嵌固件 `.rodata`XIP 直读 Flash
- **方案 A 不能解决卡顿**Baji 瓶颈不是 PSRAM 容量(剩 7MBGIF 解码 canvas 仍在 PSRAM**总线竞争不变**;反而撑爆 OTA 分区
- **方案 B 是性价比之王**0 内存代价、20 行代码、reor 直接降 70%
### 12.7.5 对 Kapi 的启示
**Kapi 本身不需要做这些**(无 LCD/GIF但如果未来
- 在 Kapi 上加 LCD/动画 → **吸取 Baji 教训,绝不要用 GIF 持续解码**
- 直接采用 PNG 序列 + lv_anim方案 D或预解码帧 + 切换显示
- 任何新增的 PSRAM 重 IO 任务都要先做 reor 基准测试
### 12.7.6 完整决策记录(更详细版)
详见 Baji 报告:[/Users/rdzleo/Desktop/Baji_Rtc_Toy/docs/Rtc_AIavatar/官方Korvo2方案_对比分析报告.md](../Baji_Rtc_Toy/docs/Rtc_AIavatar/官方Korvo2方案_对比分析报告.md) §11.11
---
## 13. 附录:本文档版本历史
| 版本 | 日期 | 内容 |
|---|---|---|
| v1.0 | 2026-05-14 | 初版业务全貌 + 三选项决策矩阵 + 推荐路线 |
| **v1.1** | **2026-05-14** | **新增 §12 Baji+Kapi 同 Wi-Fi 实测对比,定位 Kapi 流畅的两个根本原因WiFi 缓冲 + 无 LVGL/GIF 竞争);给出 Baji 卡顿的最终定论** |
| **v1.2** | **2026-05-14** | **新增 §12.7 综合内存优化 + GIF 4 方案评估(交叉引用 Baji v2.2):明确否决方案 AEMBED 爆 OTA+ CFlash 不够),推荐方案 B暂停 GIF。给 Kapi 未来加 LCD/动画的预防指导** |