Desync auto-resync: host sends state on desync event (#6) #10
Closed
pbwraith
wants to merge 2 commits from
issue-6 into main
pull from: issue-6
merge into: pbwraith:main
pbwraith:main
pbwraith:issue-23
pbwraith:issue-8
pbwraith:issue-20
pbwraith:issue-19
pbwraith:issue-4
pbwraith:issue-16
pbwraith:issue-2
pbwraith:issue-1
pbwraith:issue-3
pbwraith:issue-7
pbwraith:issue-5
2 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
48598f45ca |
Desync auto-resync: host sends state on desync event (#6)
Some checks failed
Rust-lint / lint-linux (pull_request) Failing after 2s
Rust / build-linux (linux-x86_64, X64, ubuntu-24.04, x86_64-unknown-linux-gnu) (pull_request) Failing after 1s
Rust / build-android (29.0.14206865, ubuntu-24.04, 33) (pull_request) Failing after 1s
Rust / build-linux (linux-aarch64, ARM64, ubuntu-24.04-arm, aarch64-unknown-linux-gnu) (pull_request) Has been cancelled
Rust / build-windows (windows-aarch64, woa64, windows-11-arm, aarch64-pc-windows-msvc) (pull_request) Has been cancelled
Rust / build-windows (windows-x86_64, win64, windows-2025, x86_64-pc-windows-msvc) (pull_request) Has been cancelled
Rust / build-macos (macos-aarch64, ARM64, aarch64-apple-darwin) (pull_request) Has been cancelled
Rust / Collect release artifacts (pull_request) Has been cancelled
When GGRS fires DesyncDetected, the host (player_number==0) snapshots the current emulator state, sends it to all peers via the reliable channel as a 'resync_state' message, and pauses the frame loop until all peers acknowledge with 'resync_ready'. Non-host peers ignore the desync event and wait for the host's state. Changes: - Add ResyncState enum (Idle, HostWaiting, ClientLoading) to Netplay - In poll_clients DesyncDetected handler: host creates in-memory savestate, sends resync_state message, enters HostWaiting state - Add check_resync_messages: non-host receives resync_state and enters ClientLoading; host receives resync_ready acks and resets frame when all peers ack - Add process_resync_load: non-host decompresses and loads received state, calls reset_frame, sends resync_ready ack, resumes - Add resyncing state check in advance_frame: pauses frame loop during resync (like disconnected path), with 5s timeout -> disconnect - Add create_savestate_in_memory: serializes Device via postcard + compress without file I/O - Call process_resync_load from vi.rs update_screen before normal frame processing - Add tests: ResyncState default/transitions, message serialization, timeout logic, ack tracking Based on issue-5 branch (includes GGRS frame reset from #5). Closes #6 |
||
|
|
eb5cf56ee3 |
Fix GGRS frame counter reset after state load (#5)
Some checks failed
Rust / build-linux (linux-x86_64, X64, ubuntu-24.04, x86_64-unknown-linux-gnu) (pull_request) Failing after 5s
Rust / build-android (29.0.14206865, ubuntu-24.04, 33) (pull_request) Failing after 2s
Rust-lint / lint-linux (pull_request) Failing after 2s
Rust / build-linux (linux-aarch64, ARM64, ubuntu-24.04-arm, aarch64-unknown-linux-gnu) (pull_request) Has been cancelled
Rust / build-windows (windows-aarch64, woa64, windows-11-arm, aarch64-pc-windows-msvc) (pull_request) Has been cancelled
Rust / build-windows (windows-x86_64, win64, windows-2025, x86_64-pc-windows-msvc) (pull_request) Has been cancelled
Rust / build-macos (macos-aarch64, ARM64, aarch64-apple-darwin) (pull_request) Has been cancelled
Rust / Collect release artifacts (pull_request) Has been cancelled
After a netplay savestate load, the GGRS session's internal frame counter
must be reset to match the savestate's frame, or desync detection fires
immediately on resume.
Changes:
- Patch vendored ggrs 0.13.0 to expose set_current_frame(frame) on
P2PSession and SyncTestSession, with internal SyncLayer and InputQueue
reset methods to clear stale saved states, checksum history, and input
queues
- Add [patch.crates-io] ggrs = { path = 'vendor/ggrs' } in Cargo.toml
- Add netplay::reset_frame(session, frame) wrapper function
- Record current GGRS frame in Savestate.netplay_frame during
create_savestate when in netplay context
- Call reset_frame after load_savestate in netplay context
- Add tests: advance 120 frames, reset to 60, verify current_frame()==60
and clean resume with matching inputs; reset to 0; idempotent reset
Closes #5
|