飞行雪绒 DOCS

鸣潮·爱弥斯纪念桌宠 · LTS1.0.6beta8

计划与归档 · P1

异步运算任务规划

异步高性能运算与异步请求的整体方案、阶段拆分与验收标准。

源文件 ASYNC_COMPUTE_PLAN.txt 更新 2026-07-02 7.2 KB 在 GitHub 查看
异步高性能运算与异步请求任务规划

目标
- 保持 Qt 主线程只负责 UI、状态提交、轻量事件调度。
- 将重运算统一迁移为“快照采集 -> 后台计算 -> 主线程应用”模型。
- 将下载 / HTTP / 子进程探测统一迁移为“任务槽 + 线程池/进程池”模型。
- 避免在 FRAME/TICK 订阅链路中直接执行重计算、阻塞 I/O 或重复系统调用。

总原则
- QWidget/QPixmap/QPainter/QtMultimedia 主调用必须留在主线程。
- 后台任务只处理纯数据,不直接操作 Qt 对象。
- 高频任务必须 single-flight,不允许队列堆积。
- 下载/搜索/探测类请求优先 io_pool。
- numpy/cv2/可释放 GIL 的高频计算优先 vector_pool。
- 纯 Python 重 CPU 运算优先进程池或受控线程池。

已完成
1. ComputeHub 基础设施
   - 已新增 io_pool / vector_pool / cpu_pool。
   - 已提供 submit_latest single-flight 语义。
2. 音频频响采样
   - AudioMeter 已改为后台缓存采样,主线程只读缓存。
3. 雪球碰撞
   - 已统一接入 ComputeHub vector single-flight。
4. 物理世界 PhysicsWorld
   - 已改为快照 -> 后台步进 -> 主线程应用。
5. 粒子系统
   - 已改为后台 update + 主线程绘制。
   - 已修复高并发粒子申请丢失问题。
   - 已增加帧边界批量收口,降低主线程事件风暴。
6. UI / 服务链路已收口项
   - SpeakerSearchDialog 搜索已接入 io_pool latest-only。
   - OllamaBootstrap 的预启动 / CLI 刷新 / ping 已接入 io_pool latest-only。
   - CloudMusic 本地音乐扫描 / 喜欢列表加载已接入 io_pool latest-only。
   - CloudMusic 播放准备 / 下载 / 监控 / seek 校对已接入 ComputeHub。
   - OllamaSession 的 pull / chat / ping 已接入 io_pool。
   - UpdateManager 已增加信息去重与进度节流。
   - UpdateDialog / CmdCenter / ToolDispatcher 的裸线程入口已收口到 io_pool。
   - GSVMove 预热入口与 YuanBao 登录监控已改为池化调度。
   - MicrophoneSTT 启动自举线程已接入 io_pool,识别工作线程保留。
   - AI 设置面板的元宝登录启停入口已接入 io_pool。
   - CMDWindow 的流式命令入口已接入 io_pool。
   - CloudMusicManager 初始化登录入口已接入 io_pool。
   - 拉海洛方块 runtime 的 BGM 搜索/自动播放已改为异步,并增加打开代次保护。
- CloudMusic 开始播放时的时长探测已改为后台缓存,不再在主线程同步探测音频时长。
   - CloudMusic 登录链的二维码登录/退出登录入口已接入 io_pool,`_safe_login_call` 已改为线程池超时等待。
   - TimingManager 已为 FRAME 事件补充 `tick_alpha` / `dt_ms` / `timestamp`。
   - PhysicsWorld 已改为 TICK 步进、FRAME 插值;物理挂件窗口已切到 `render_x/render_y`。
   - ParticleOverlay 已改为 TICK 更新、FRAME 插值绘制。
   - CloudMusic 的粒子生成/seek 校对已从 FRAME 迁到 TICK,音符粒子间隔已按旧 frame 语义换算为 tick。
   - ProgressPanel 已拆为 FRAME 跟随位置、TICK 请求进度。
   - practical 粒子脚本已增加统一的 frame->tick 速率换算,速度/重力/drag/寿命衰减已按旧 60fps 语义补偿。

待搬任务清单

P0:高收益、低风险,优先继续
1. lib/script/cloudmusic/_mixin_playback.py
   - 事件链路:
     - FRAME -> seek 校对线程
     - _play_current -> 播放准备线程
     - _download_and_play -> 下载线程
     - _do_play_file -> 播放监控线程
   - 目标:
     - seek 校对改为 ComputeHub single-flight。
     - 播放准备/下载前置请求收口到 io_pool。
     - 保留 Qt 主线程播放与必要取消令牌语义。
2. lib/script/chat/ollama_session.py
   - 事件链路:
     - 模型自动 pull
     - stream_chat 后台线程
     - pull 完成后再次 ping
   - 目标:
     - 改接 io_pool。
     - ping 统一复用 single-flight 槽位。
3. lib/script/update_manager.py
   - 事件链路:
     - GitHub release 检查
     - ZIP 下载
     - 解压
     - 覆盖复制
     - Git 子进程调用
   - 目标:
     - 下载/解压/复制分层接入 io_pool。
     - 大量 progress 回调加节流,减少 UI 频繁刷新。

P1:网络/子进程类热点
4. lib/script/yuanbao_free_api/service.py
   - 事件链路:
     - 本地服务探活 urlopen
     - 端口占用 netstat/taskkill
     - ZIP 解包与目录扫描
     - 登录监控线程
   - 目标:
     - 统一接入 io_pool。
     - 端口探测和解包流程去手工线程化。
5. lib/script/gsvmove/service.py
   - 事件链路:
     - 预热线程
     - 目录扫描
     - 子进程启动/探测
   - 目标:
     - 统一任务槽。
     - 将目录扫描与探测从主事件链彻底隔离。
6. lib/script/microphone_stt/service.py
   - 事件链路:
     - model bootstrap
     - worker 启停
   - 目标:
     - bootstrap / 模型发现 / 初始化改为 io/cpu 分离。

P2:图像/资源处理类
7. lib/script/SEanima/frame_cache.py
   - 事件链路:
     - 预取线程
     - PIL 打开帧图
   - 目标:
     - 改为 vector/io_pool 任务。
     - 减少 burst 预取时的线程散射。
8. lib/core/qt_gif_loader.py / lib/script/obj-雪豹/manager.py
   - 事件链路:
     - GIF / 图像同步打开
   - 目标:
     - 解析与尺寸探测后台化。
9. lib/script/cloudmusic/_mixin_login.py
   - 事件链路:
     - 二维码图像解码
     - OpenCV 检测
     - 登录探测线程
   - 目标:
   - cv2/numpy 部分统一 vector_pool。

P2.5:时序模型收敛(tick 更新 / frame 表现)
10. 剩余 FRAME 驱动的状态更新链
   - 目标文件:
     - lib/script/cloudmusic/manager.py
     - lib/script/obj-摩托/manager.py
     - lib/script/ui/auto_chat_button.py
     - lib/script/ui/chat_mode_button.py
     - lib/script/ui/clickthrough_button.py
     - lib/script/ui/close_button.py
     - lib/script/ui/command_dialog.py
     - lib/script/ui/command_hint_box.py
     - lib/script/ui/launch_wuwa_button.py
     - lib/script/ui/mic_stt_indicator.py
     - lib/script/ui/more_functions_button.py
     - lib/script/ui/playlist_panel.py
     - lib/script/ui/progress_panel.py
     - lib/script/ui/restore_button.py
     - lib/script/ui/scale_button.py
     - lib/script/ui/speaker_search_dialog.py
   - 目标:
     - 业务状态更新迁移到 TICK。
     - FRAME 仅保留插值、跟手动画、纯绘制刷新。
     - 高频 UI 闪烁/位移动画优先做 alpha 或 position 插值,不在 FRAME 中改业务状态。

P3:辅助链路和零散裸线程
11. lib/core/cmd_center.py
12. lib/script/tool_dispatcher/dispatcher.py
13. lib/script/ui/ai_settings_panel.py 中元宝启停线程
14. lib/script/ui/update_dialog.py 与 update_manager 的接口对齐

执行顺序
1. 继续收口 CloudMusic 播放链。
2. 收口 OllamaSession 的 pull / chat / ping 调度。
3. 收口 UpdateManager 的下载/解压/复制链。
4. 收口 YuanBao-Free-API 与 GSVMove。
5. 收口图像预取/解码链。

验收标准
- 主线程中不再出现高频重复 COM/系统调用。
- 同一入口重复触发时不再堆积裸线程。
- 高频任务旧结果自动丢弃或合并。
- 网络/下载链路能被统一取消、复用、观测。
- 先通过静态编译,再做运行态帧耗时观察。