Skip to content

fix(syncplay): 修复一起看进度漂移与重复校正 - #2701

Draft
liangyuR wants to merge 1 commit into
Predidit:mainfrom
liangyuR:codex/syncplay-correction
Draft

liangyuR wants to merge 1 commit into
Predidit:mainfrom
liangyuR:codex/syncplay-correction

Conversation

@liangyuR

Copy link
Copy Markdown
Contributor

描述

修复一起看时网络抖动导致的连续向前跳转,并减少恢复播放、异步 seek 期间的重复校正。

原实现把服务端补偿后的目标位置当成本地实际位置回传,补偿误差会不断反馈到房间进度。本次普通心跳改为报告实际播放器位置,保留本地操作确认和服务端强制同步确认的处理。

同步控制新增轻量协调器:等待操作返回后重新采样,再通过后续实际播放状态/位置确认执行结果;合并普通心跳,保留显式控制;超过 1 秒的同方向偏差持续 2 秒后才自动 seek。观察等待最多 5 秒,超时后重新收集偏差证据。实际播放状态与本地操作意图分开,退出/重连时废弃旧会话工作。

不包含调速、未来定时启动、#2658 或其他功能改动。

关联的 Issues

Fixes #1588

PR 类型

  • Bug 修复
  • 添加新功能
  • 重构实现
  • 文档或格式
  • 其它

AI 辅助开发

  • 没有使用 AI 辅助
  • AI 辅助开发了部分功能,但是我已检查并理解 AI 所写的代码
  • 基本上都由 AI 实现,但是我非常了解 AI 的代码与写完的产物

AI 辅助模型: OpenAI Codex(当前会话未提供可核验的完整模型变体名称,待作者补充)。

本改动主要由 AI 实现,并经过独立 Agent 代码审查。本 PR 保持 Draft:上述涉及作者本人理解程度的选项不由 Agent 代为勾选;技术描述与验证记录由 Codex 整理,正式送审前待作者亲自确认、补充。

提交前检查

  • 我已经填写了 PR 模板中的所有内容
  • 我已经阅读了 贡献指引 ,并遵守指引进行开发
  • 这个 PR 的功能已经经过我的测试,并且我完全理解我(或 AI)做出的改动

Agent 已阅读贡献指引并完成下述自动化验证;作者本人确认项暂留空。

附注

验证结果:

  • flutter test --no-pub:222 项通过,含 4 项协议回归和 5 项协调器测试。
  • flutter analyze --no-pub --no-fatal-infos --fatal-warnings:无错误、无警告,17 条既有 info 均不在本次改动文件内。
  • git diff --check 通过;独立代码审查未发现剩余阻塞问题。
  • 使用未修改的官方 Syncplay 1.7.7 服务端,源码 commit 49e2a1bf36e5be1fc397c5bea14bed350609a9ed。
  • 原始协议问题:30/270ms 交替单向延迟下,60 秒内双端各跳转 10 次、额外推进约 11.7 秒;修复回传后同类实验双端零跳转。
  • 后续恢复对照:相同网络抖动,并模拟操作 200ms 返回、实际观察值 800ms 更新。恢复后约 67 秒,加入协调器前自动 seek 2 次(其中 1 次重复),最终版本均为 0 次。
  • 暂停、恢复、暂停中 seek、播放中 seek 全部通过;人为制造 5 秒偏差后约 7 秒收敛到两端差 1.5 秒以内,控制实验无重叠 seek。

验证边界:真实服务端搭配模拟异步播放器时钟,直接执行生产协议客户端及协调器;尚未完成 GUI/原生播放器验收。Flutter 验证使用本机 3.47.6 / Dart 3.13.5 和缓存依赖,仓库声明的 Flutter 3.47.7 尚未进行干净环境验证。没有修改 SDK 要求或依赖声明。实验日志和脚本保存在本地 ignored build 目录,不包含在本 PR 中。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: 一起看同步偏移

1 participant