Skip to content

Perf/expression and state sync - #1

Open
awdrrawd wants to merge 2 commits into
Nice8923:mainfrom
awdrrawd:perf/expression-and-state-sync
Open

Perf/expression and state sync#1
awdrrawd wants to merge 2 commits into
Nice8923:mainfrom
awdrrawd:perf/expression-and-state-sync

Conversation

@awdrrawd

Copy link
Copy Markdown

No description provided.

awdrrawd and others added 2 commits August 13, 2026 08:20
速率限制的根因不是条数(BC 限速 14 条/1.2 秒),是每条的体积和持续时间。

表情(state-fx.js)
- 广播从「每部位一发 ChatRoomCharacterExpressionUpdate」改成一发
  ChatRoomCharacterUpdate。BC 那支每一发都夹带完整 ServerAppearanceBundle
  (ChatRoom.js:3615),改 Eyes + Eyes2 就是同一份外观包送两遍。
  LCE 踩过同一颗雷:4 发/秒就灌爆 socket 断线重连。
- 失神时的表情封锁从「改了弹回」改成直接吞掉。弹回会打拉锯战:BC 本体设 Eyes
  时自己递归到 Eyes2(Character.js:1964),一次外部改动触发两次弹回;对方装了
  动画引擎更是每 250ms 抢一轮 —— 别人看到表情抽动,且整个失神期都在发包。
- 新增 notifyExprMods:写完 Property 后走一趟原生 CharacterSetFacialExpression。
  没装引擎时 BC 本体早退(零成本),装了 LCE/WCE 则被登记成 MANUAL 覆写,
  引擎从此不再抢回去。做法同 LCE 自己的 notifyMods。
- 广播加 1 秒节流(前沿立即送 + 窗口末尾补送,最终表情保证送达)。

状态同步(storage.js / state.js / excretion.js)
- publishState 只在状态转换时调用,不再每 5 秒重播倒数。剩余秒数由收端用绝对
  时间戳 expiresAt 本地推算(timer.js 本来就是这样算的,重播纯浪费)。
  一轮 15 分钟的失神光心跳就是 360 个封包。
- ServerAccountUpdate.QueueData 的 Force=true 全部去掉,让 BC 自己的 2 秒窗口
  合并连续变化(Server.js:126)。
- 新增带 seq 的远程状态缓存:BC 的 CharacterOnlineRefresh(Character.js:1223)
  会把 OnlineSharedSettings 整包覆盖成服务器那份,而服务器扇出比 Hidden 慢 ——
  砍掉心跳后这个回滚会浮出来(凝胶捡走了又冒出来、倒数跳回去)。
  自检见 scripts/test-remote-state.mjs。

轮询与动画
- 删掉每秒扫全房找排出动画的定时器,改由 drawGelUnder 绘制时判断(零轮询),
  并用对方的 startedAt 对齐进度 —— 晚进房的人接上正在播的那一段而不是重播。
- 排出动画从 4 段跳改成连续插值。纯本地绘制,封包数不变(0)。

顺带:loader 模板里 `window.PEX = window.PEX ?? {}` 让重复加载守卫恒为真,
插件永远不会启动,删掉。

一轮封包 ~410 → ~12;完整外观包 ~17 份 → ~7 份,最坏锁在 1 份/秒。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
ES_BUDGET 从 config.js 导出但 storage.js 忘了 import。它出现在 saveSettings 里
Player.ExtensionSettings 写入之前,所以每次保存都在那一行抛 ReferenceError →
被外层 try 吞掉只留一句"保存失败" → 设置根本没写进账号也没写进本地备份。
一直没被发现是因为 flushSaveOnPageHide 另有一份不带这个检查的保存逻辑:
关页/刷新时才真的存得下去,改完设置不关页就丢。

其余:
- 离房清掉他人状态/动画缓存(换房不该看到上一间的残留;两个 Map 原本会随着
  一晚上换房无限长大)
- 补 eslint.config.js —— repo 里一直没有,npm run lint 从来就是坏的。
  上面那个 ReferenceError 就是补完 lint 第一次跑出来的。
  BC 运行期全局列成 readonly,catch 参数与模板字串里的全角空格放行。
- 补 .gitignore(dist/ node_modules/)
- loader.user.js / loader.ebc.user.js 同样删掉 `window.PEX = window.PEX ?? {}`:
  载入器只负责判断,window.PEX 由本体宣告

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@awdrrawd

Copy link
Copy Markdown
Author

個人測試大多沒有問題,但會一直發生連線速率問題
最大問題是表情發送,其他部分也一併作調整
調整後已經沒有斷線問題

補充一點,已經順便修復了
載入器只做判斷
if (window.PEX) {
註冊應該在載入之後,建議放在main或其他地方
window.PEX ?? {}
如果放在在判斷之前,永遠有值,永遠判定重複加載而阻擋

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.

1 participant