# mimi-desktop-pet 1.1.0 发布说明 发布日期:2026-10-31 上一版本:1.0.0 本条版本号在 CHANGELOG 中曾短暂写作 `1.0.1`,正式发布统一为 **1.1.0**。 - npm: - GitHub Release: - 提交:`884f8d7`(tag `v1.1.0`) ## 一句话概括 1.0.0 把造型做齐了,但**换装之后大部分交互是失效的**——摸肚子、击掌、喂食、 拖文件、坐下、玩具、DSH 思考动画、以及自由拖拽,全都没有反应。1.1.0 修的是 这条链路上的七个独立缺陷。 ## 用户可见的变化 ### 1. 换装后"点了没反应" 造型素材每套只有 15 个动作,动作库有 87 个。1.0.0 的策略是**缺就拒绝**, 而且拒绝时不报错、不提示,调用方拿到 `False` 就丢掉。实测:10 套造型下, 17 个用户入口里有 9 个完全没有动作。 现在改成**语义近似链**:造型缺某个动作时,退到这套衣服自己的另一个动作。 | 用户操作 | 造型缺素材时退到 | |---|---| | 摸肚子 | 戳脸 / 害羞 | | 击掌、双击 | 鼓掌 / 庆祝 | | 喂食、收下文件 | 点头 | | 玩球、接星星 | 庆祝 / 鼓掌 | | DSH 思考动画 | 抬头 | | DSH 工具动画 | 鼓掌 / 点头 | | 伸懒腰、打哈欠 | 打哈欠 | | 坐下 | 坐姿循环 | 既不会突然换回默认衣服,也保证每个交互都有反馈。近似表在 `pet/mimi_app/src/mimi_pet/outfit_actions.py`,未来某套造型补了真素材, 同一条链会自动选中真素材,不需要改代码。 ### 2. Retina 屏上"点上去完全没反应" 这条最隐蔽。命中检测拿**逻辑坐标**(256×384)去采样造型渲染出的**物理像素** 位图(2 倍屏是 512×768),等于只查到位图左上角 1/4。实测 dpr=2 时点身体 (逻辑 128,240)取到 `alpha=0`,`mousePressEvent` 根本没进入点击分支。 默认外观不受影响,因为走的是另一条渲染路径(自己画 256×384、dpr=1)—— 所以只有**穿着造型**时点不动。 真机屏幕 4096×2304 正是 2 倍。现在按 `devicePixelRatio()` 换算坐标。 ### 3. 拖拽的四个独立问题 | 问题 | 表现 | 修复 | |---|---|---| | 左右不分 | 往右拖也像往左拖 | 按素材实际朝向做水平镜像 | | 没有动画 | 5 套造型每档只有 1 张静图 | 离线烘焙成 6 帧摆动 | | 不离开地面 | 拖着像站着滑走 | 补 22px 抬升 + 按速度摆荡 | | 卡在第 0 帧 | 三档造型每移动一次就重播 | 只有真正换档才换片源 | 其中倾角符号写成了 `-vx`,导致腿朝反方向甩。判据是用户给的一句话: **"腿朝哪里,哪里反方向就是正确的拖拽方向"**。默认素材左拖时脚相对中轴 +7.6%,以此为基准校准了全部 10 套造型。 ### 4. 跳跃落地抽搐 `_render_full_frame` / `_render_drag_pose` / `_render_rig` 用 `QImage(display_w, display_h)` 新建画布时忘了 `setDevicePixelRatio`。 2 倍屏上待机是 512×768@2、落地帧却变成 256×384@1,放大插值后就是明显抖动。 现在统一走 `_new_canvas()` / `_finish_canvas()`,全程锁定物理分辨率。 ### 5. 落地"停一会儿才蹲" 造型的 `land_recover` 前 5 帧几乎不动(实测垂直位移 0,1,0,0,0),而默认素材 第 2 帧就位移 91px。所以落地瞬间加程式化下蹲(压到 0.84 再回弹), 并把落地总时长限制在 0.9 秒内(原来 3.5–5.1 秒,期间拒绝一切交互)。 ### 6. 头顶聊天栏不显示 三个层次的问题叠在一起: 1. `show_box()` / `position_at_top()` / `position_near()` 被掏空成 `pass` (注释写"消息栏已停用"),但 `should_show_panel()` 仍会返回 `True`。 2. 构造函数末尾留着 `WA_DontShowOnScreen` + `move(-10000,-10000)`, 于是窗口"有位置但不绘制"——用户看到的就是**能看到预留位置却什么都不显示**。 3. macOS 上面板被改到屏幕顶部,而用户期望在 Mimi 头顶。 三处都已修复。顺带移除了已无意义的"工作模式"徽章(现在只有桌宠模式)。 ### 7. 其他 - **主动行为只演第一步**:导演状态机被 `busy_until` 卡死,47 套主动行为每套 只演第一步就停;换装后 33 套完全看不到。现在能按节奏播完整套。 - **睡觉/起床/起身变回默认衣服**:这三处走的是只查动作库的旁路,睡着之后 整段睡眠都是默认外观。 - **换完造型画面不变**:角色坐着/睡着时造型切换只排队,旧代码丢掉排队状态。 - **调试日志写进启动目录**:macOS 没有 `TEMP` 环境变量,日志被写到当前工作目录, 往源码树里追加文件。改用 `tempfile.gettempdir()`。 ## 验证 - 单元测试 **210 项通过**(新增 30 项回归测试) - 验收脚本 **24/24** - UI 冒烟 **26/27**(唯一失败是无头环境没有 macOS 状态栏,属既有环境限制) - 造型 × 交互矩阵:**242/242 组合都有反馈**(修复前 220 个无反馈) - 拖拽方向:11 套(含默认)腿朝向与默认素材一致 - 渲染分辨率:dpr=1 全程 256×384@1、dpr=2 全程 512×768@2 新增测试覆盖的关键契约(`pet/mimi_app/tests/`): | 文件 | 覆盖 | |---|---| | `test_outfit_actions.py` | 造型×交互矩阵、拖拽方向与动画、渲染分辨率、坐睡起身不换衣服 | | `test_menu.py` | 面板可见性、贴头顶定位、模式徽章已移除 | 这些洞之前完全没被覆盖——170 项测试全绿时 bug 一直在。 ## 素材处理 视频生成服务不可用,5 套缺动画的拖拽档位改用离线烘焙: - 新增 `scripts/pipeline/bake_drag_motion.py`:绕头顶吊点做刚体摆动, 按档位放大幅度(t00 轻晃 2.2° → t10 甩到 7.8°),生成 6 帧/档 - `rain_coat` 11 档、`pajama`/`summer_dress`/`sporty` 各 3 档,共 120 帧 - 帧数从 24 降到 6 是出厂折中:6 帧的帧间差 6.7 反而比 8 帧的 8.1 更平滑, 同时把包体积压进 npm 的 200 MB 上限 另新增 `scripts/pipeline/fix_mattes_residue.py`,处理两类生成残留: 轮廓绿边(去绿 + 透明区填边缘色)、投影阴影灰块(连通域识别)。 ## 包体积 | 项 | 1.0.0 | 1.1.0 | |---|---:|---:| | tarball | 188 MB | **198.9 MB** | | 解压后 | 211.4 MB | 211.6 MB | | 文件数 | 17434 | 17534 | npm 单包上限 200 MB,1.1.0 已接近上限(仅剩 1.1 MB 余量,约等于**半套造型**)。 下一次加素材就会发布失败,因此下一步计划拆包,见 [PLAN-ASSET-SPLIT.md](PLAN-ASSET-SPLIT.md)。 打包时排除了 `*.bak-*` 与 `*.tmp`(之前 1.3 MB 的 `presets.json.bak` 被打进包)。 ## 已知遗留 - **走路线性 ping-pong**:部分造型的 `walk_left`/`walk_right` 是 122 帧 "正放 + 倒放",播起来前进一段再倒退一段。要修需重跑生成管线。 - **动作尾部静止帧**:`land_recover` 等动作末尾仍有近静止片段(已在运行时 用 0.9 秒上限缓解,素材层未裁)。 - **`star_night/celebrate` 运动量偏低**:实测帧间差 4.36,默认 `celebrate` 是 11.70,观感偏静态。 - **npm 缓存权限**:本机 `~/.npm/_cacache` 有 root 拥有的文件,直接 `npm publish` 会报 EPERM。需 `sudo chown -R 501:20 ~/.npm` 一次性修复。