#5 - fixed interpolation & rollback

This commit is contained in:
Martin Slachta
2026-08-05 15:20:56 +02:00
parent 2e95c941ba
commit 0e639abcd2
14 changed files with 243 additions and 40 deletions
+4 -1
View File
@@ -62,6 +62,9 @@ void ZoneServer::player_update_handler(SessionId session_id, mmo::PlayerMoveMess
if (it == m_session_zone.end()) return;
if (auto* session = m_player_session_registry->session(session_id)) {
if(session->last_received_frame >= message.frame_idx()) {
return;
}
session->last_received_frame = message.frame_idx();
}
@@ -141,7 +144,7 @@ void ZoneServer::run() {
}
}
m_replicator->replicate(zone->registry(), zone->interest());
m_replicator->replicate(frame_idx, zone->registry(), zone->interest());
}
m_network_receiver->update();
@@ -29,8 +29,8 @@ class StateReplicator {
// Per-client backing buffers reused every frame.
std::vector<tw::serial::BinaryBuffer> m_frames;
// Header(16) + spawn_hdr(4) + despawn_hdr(4) + 512 entities × 16 bytes
static constexpr std::size_t kHeaderCapacity = 24;
// Header(20) + spawn_hdr(4) + despawn_hdr(4) + 512 entities × 16 bytes
static constexpr std::size_t kHeaderCapacity = 28;
static constexpr std::size_t kInitialCapacity = kHeaderCapacity + 512 * 16;
public:
@@ -46,6 +46,7 @@ public:
* Replicates the current world state for one zone to its connected clients.
*/
void replicate(
uint32_t frame_idx,
const entt::registry& registry,
const im::InterestSystem<Backend>* interest_manager
) {
@@ -88,7 +89,8 @@ public:
m_frames[i].reserve(needed);
writers[i].reset();
writers[i].begin(session->last_received_frame, Message<mmo::WorldStateMessage>::value);
writers[i].begin(session->last_received_frame, frame_idx,
Message<mmo::WorldStateMessage>::value);
writers[i].write_spawns(state->spawn());
writers[i].write_despawns(state->despawn());