Skip to content

Commit 0db3be5

Browse files
committed
Partially implemented the new reconciliation mechanism and optimized the PeerNetController bind functions.
1 parent 6227fa6 commit 0db3be5

6 files changed

Lines changed: 177 additions & 85 deletions

File tree

core/peer_networked_controller.cpp

Lines changed: 67 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -259,12 +259,6 @@ void PeerNetworkedController::setup_synchronizer(NS::SceneSynchronizerBase &p_sy
259259

260260
event_handler_peer_status_updated =
261261
scene_synchronizer->event_peer_status_updated.bind(std::bind(&PeerNetworkedController::on_peer_status_updated, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
262-
263-
event_handler_state_validated =
264-
scene_synchronizer->event_state_validated.bind(std::bind(&PeerNetworkedController::on_state_validated, this, std::placeholders::_1, std::placeholders::_2));
265-
266-
event_handler_rewind_frame_begin =
267-
scene_synchronizer->event_rewind_frame_begin.bind(std::bind(&PeerNetworkedController::on_rewind_frame_begin, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
268262
}
269263

270264
void PeerNetworkedController::remove_synchronizer() {
@@ -276,10 +270,6 @@ void PeerNetworkedController::remove_synchronizer() {
276270

277271
// Unregister the event processors with the scene synchronizer.
278272
scene_synchronizer->event_peer_status_updated.unbind(event_handler_peer_status_updated);
279-
scene_synchronizer->event_state_validated.unbind(event_handler_state_validated);
280-
scene_synchronizer->event_rewind_frame_begin.unbind(event_handler_rewind_frame_begin);
281-
event_handler_rewind_frame_begin = NS::NullPHandler;
282-
event_handler_state_validated = NS::NullPHandler;
283273
event_handler_peer_status_updated = NS::NullPHandler;
284274
scene_synchronizer = nullptr;
285275
}
@@ -300,18 +290,6 @@ void PeerNetworkedController::on_peer_status_updated(int p_peer_id, bool p_conne
300290
}
301291
}
302292

303-
void PeerNetworkedController::on_state_validated(FrameIndex p_frame_index, bool p_detected_desync) {
304-
if (controller) {
305-
controller->on_state_validated(p_frame_index);
306-
}
307-
}
308-
309-
void PeerNetworkedController::on_rewind_frame_begin(FrameIndex p_input_id, int p_index, int p_count) {
310-
if (controller && can_simulate()) {
311-
controller->queue_instant_process(p_input_id, p_index, p_count);
312-
}
313-
}
314-
315293
void PeerNetworkedController::controllable_collect_input(double p_delta, DataBuffer &r_data_buffer) {
316294
const std::vector<ObjectData *> &sorted_controllable_objects = get_sorted_controllable_objects();
317295
for (ObjectData *object_data : sorted_controllable_objects) {
@@ -1003,6 +981,19 @@ PlayerController::PlayerController(PeerNetworkedController *p_peer_controller) :
1003981
Controller(p_peer_controller),
1004982
current_input_id(FrameIndex::NONE),
1005983
input_buffers_counter(0) {
984+
event_handler_rewind_frame_begin =
985+
peer_controller->scene_synchronizer->event_rewind_frame_begin.bind(std::bind(&PlayerController::on_rewind_frame_begin, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
986+
987+
event_handler_state_validated =
988+
peer_controller->scene_synchronizer->event_state_validated.bind(std::bind(&PlayerController::on_state_validated, this, std::placeholders::_1, std::placeholders::_2));
989+
}
990+
991+
PlayerController::~PlayerController() {
992+
peer_controller->scene_synchronizer->event_rewind_frame_begin.unbind(event_handler_rewind_frame_begin);
993+
event_handler_rewind_frame_begin = NS::NullPHandler;
994+
995+
peer_controller->scene_synchronizer->event_state_validated.unbind(event_handler_state_validated);
996+
event_handler_state_validated = NS::NullPHandler;
1006997
}
1007998

1008999
void PlayerController::notify_frame_checked(FrameIndex p_frame_index) {
@@ -1041,6 +1032,20 @@ int PlayerController::get_frames_count() const {
10411032
return frames_input.size();
10421033
}
10431034

1035+
int PlayerController::count_frames_after(FrameIndex p_frame_index) const {
1036+
NS_PROFILE
1037+
1038+
int count = 0;
1039+
1040+
for (const FrameInput &frame : frames_input) {
1041+
if (frame.id > p_frame_index) {
1042+
count += 1;
1043+
}
1044+
}
1045+
1046+
return count;
1047+
}
1048+
10441049
FrameIndex PlayerController::last_known_frame_index() const {
10451050
return get_stored_frame_index(-1);
10461051
}
@@ -1062,7 +1067,11 @@ FrameIndex PlayerController::get_stored_frame_index(int p_i) const {
10621067
}
10631068
}
10641069

1065-
void PlayerController::queue_instant_process(FrameIndex p_frame_index, int p_index, int p_count) {
1070+
void PlayerController::on_rewind_frame_begin(FrameIndex p_frame_index, int p_index, int p_count) {
1071+
if (!peer_controller->can_simulate()) {
1072+
return;
1073+
}
1074+
10661075
if (p_index >= 0 && p_index < int(frames_input.size())) {
10671076
queued_instant_to_process = p_index;
10681077
#ifdef DEBUG_ENABLED
@@ -1153,7 +1162,7 @@ void PlayerController::process(double p_delta) {
11531162
}
11541163
}
11551164

1156-
void PlayerController::on_state_validated(FrameIndex p_frame_index) {
1165+
void PlayerController::on_state_validated(FrameIndex p_frame_index, bool p_detected_desync) {
11571166
notify_frame_checked(p_frame_index);
11581167
}
11591168

@@ -1335,15 +1344,25 @@ bool PlayerController::can_accept_new_inputs() const {
13351344

13361345
DollController::DollController(PeerNetworkedController *p_peer_controller) :
13371346
RemotelyControlledController(p_peer_controller) {
1338-
event_handler_received_snapshot = peer_controller->scene_synchronizer->event_received_snapshot.bind(
1339-
[this](const Snapshot &p_received_snapshot) -> void {
1340-
received_snapshot(p_received_snapshot);
1341-
});
1347+
event_handler_received_snapshot =
1348+
peer_controller->scene_synchronizer->event_received_snapshot.bind(std::bind(&DollController::received_snapshot, this, std::placeholders::_1));
1349+
1350+
event_handler_rewind_frame_begin =
1351+
peer_controller->scene_synchronizer->event_rewind_frame_begin.bind(std::bind(&DollController::on_rewind_frame_begin, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
1352+
1353+
event_handler_state_validated =
1354+
peer_controller->scene_synchronizer->event_state_validated.bind(std::bind(&DollController::on_state_validated, this, std::placeholders::_1, std::placeholders::_2));
13421355
}
13431356

13441357
DollController::~DollController() {
13451358
peer_controller->scene_synchronizer->event_received_snapshot.unbind(event_handler_received_snapshot);
13461359
event_handler_received_snapshot = NS::NullPHandler;
1360+
1361+
peer_controller->scene_synchronizer->event_rewind_frame_begin.unbind(event_handler_rewind_frame_begin);
1362+
event_handler_rewind_frame_begin = NS::NullPHandler;
1363+
1364+
peer_controller->scene_synchronizer->event_state_validated.unbind(event_handler_state_validated);
1365+
event_handler_state_validated = NS::NullPHandler;
13471366
}
13481367

13491368
bool DollController::receive_inputs(const Vector<uint8_t> &p_data) {
@@ -1406,9 +1425,6 @@ bool is_doll_snap_A_older(const DollController::DollSnapshot &p_snap_a, const Do
14061425
}
14071426

14081427
void DollController::received_snapshot(const Snapshot &p_snapshot) {
1409-
// TODO enable this.
1410-
return;
1411-
14121428
const std::vector<ObjectData *> *controlled_objects = peer_controller->scene_synchronizer->get_peer_controlled_objects_data(peer_controller->get_authority_peer());
14131429
if (!controlled_objects) {
14141430
// Nothing to store.
@@ -1447,7 +1463,11 @@ void DollController::received_snapshot(const Snapshot &p_snapshot) {
14471463
is_doll_snap_A_older);
14481464
}
14491465

1450-
void DollController::queue_instant_process(FrameIndex p_frame_index, int p_index, int p_count) {
1466+
void DollController::on_rewind_frame_begin(FrameIndex p_frame_index, int p_index, int p_count) {
1467+
if (!peer_controller->can_simulate()) {
1468+
return;
1469+
}
1470+
14511471
if (streaming_paused) {
14521472
return;
14531473
}
@@ -1523,7 +1543,7 @@ void DollController::process(double p_delta) {
15231543
queued_instant_to_process = -1;
15241544
}
15251545

1526-
void DollController::on_state_validated(FrameIndex p_frame_index) {
1546+
void DollController::on_state_validated(FrameIndex p_frame_index, bool p_detected_desync) {
15271547
notify_frame_checked(p_frame_index);
15281548
}
15291549

@@ -1545,8 +1565,21 @@ void DollController::notify_frame_checked(FrameIndex p_frame_index) {
15451565
last_checked_input = p_frame_index;
15461566
}
15471567

1568+
bool DollController::__pcr__fetch_recovery_info(
1569+
FrameIndex p_checking_frame_index,
1570+
int p_predicted_frames,
1571+
std::vector<std::string> *r_differences_info
1572+
#ifdef DEBUG_ENABLED
1573+
,
1574+
std::vector<ObjectNetId> *r_different_node_data
1575+
#endif
1576+
) const {
1577+
// TODO please implement this.
1578+
return true;
1579+
}
1580+
15481581
void DollController::notify_applied_snapshot(FrameIndex frame_index, ObjectNetId p_id) {
1549-
ASSERT_NO_ENTRY(); // TODO implement.
1582+
ASSERT_NO_ENTRY(); // TODO implement or remove this function if not implemented.
15501583
}
15511584

15521585
NoNetController::NoNetController(PeerNetworkedController *p_peer_controller) :

core/peer_networked_controller.h

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,6 @@ class PeerNetworkedController final {
113113

114114
bool has_player_new_input = false;
115115

116-
NS::PHandler event_handler_rewind_frame_begin = NS::NullPHandler;
117-
NS::PHandler event_handler_state_validated = NS::NullPHandler;
118116
NS::PHandler event_handler_peer_status_updated = NS::NullPHandler;
119117

120118
public: // -------------------------------------------------------------- Events
@@ -196,8 +194,6 @@ class PeerNetworkedController final {
196194
bool has_scene_synchronizer() const;
197195

198196
void on_peer_status_updated(int p_peer_id, bool p_connected, bool p_enabled);
199-
void on_state_validated(FrameIndex p_frame_index, bool p_detected_desync);
200-
void on_rewind_frame_begin(FrameIndex p_input_id, int p_index, int p_count);
201197

202198
void controllable_collect_input(double p_delta, DataBuffer &r_data_buffer);
203199
int controllable_count_input_size(DataBuffer &p_data_buffer);
@@ -259,10 +255,8 @@ struct Controller {
259255
virtual void ready() {}
260256
virtual FrameIndex get_current_frame_index() const = 0;
261257
virtual void process(double p_delta) = 0;
262-
virtual void on_state_validated(FrameIndex p_frame_index) {}
263258

264259
virtual bool receive_inputs(const Vector<uint8_t> &p_data) { return false; };
265-
virtual void queue_instant_process(FrameIndex p_input_id, int p_index, int p_count) {}
266260
};
267261

268262
struct RemotelyControlledController : public Controller {
@@ -331,6 +325,9 @@ struct AutonomousServerController final : public ServerController {
331325
};
332326

333327
struct PlayerController final : public Controller {
328+
NS::PHandler event_handler_rewind_frame_begin = NS::NullPHandler;
329+
NS::PHandler event_handler_state_validated = NS::NullPHandler;
330+
334331
FrameIndex current_input_id;
335332
uint32_t input_buffers_counter;
336333
bool streaming_paused = false;
@@ -340,17 +337,19 @@ struct PlayerController final : public Controller {
340337
int queued_instant_to_process = -1;
341338

342339
PlayerController(PeerNetworkedController *p_node);
340+
~PlayerController();
343341

344342
void notify_frame_checked(FrameIndex p_input_id);
345343
int get_frames_count() const;
344+
int count_frames_after(FrameIndex p_frame_index) const;
346345
FrameIndex last_known_frame_index() const;
347346
FrameIndex get_stored_frame_index(int p_i) const;
348347
virtual FrameIndex get_current_frame_index() const override;
349348

350-
virtual void queue_instant_process(FrameIndex p_input_id, int p_index, int p_count) override;
349+
void on_rewind_frame_begin(FrameIndex p_input_id, int p_index, int p_count);
351350
bool has_another_instant_to_process_after(int p_i) const;
352351
virtual void process(double p_delta) override;
353-
virtual void on_state_validated(FrameIndex p_frame_index) override;
352+
void on_state_validated(FrameIndex p_frame_index, bool p_detected_desync);
354353

355354
virtual bool receive_inputs(const Vector<uint8_t> &p_data) override;
356355

@@ -390,6 +389,9 @@ struct DollController final : public RemotelyControlledController {
390389

391390
public:
392391
NS::PHandler event_handler_received_snapshot = NS::NullPHandler;
392+
NS::PHandler event_handler_rewind_frame_begin = NS::NullPHandler;
393+
NS::PHandler event_handler_state_validated = NS::NullPHandler;
394+
393395
FrameIndex last_checked_input = FrameIndex::NONE;
394396
int queued_instant_to_process = -1;
395397
// Contains the controlled nodes frames snapshot.
@@ -401,13 +403,25 @@ struct DollController final : public RemotelyControlledController {
401403

402404
virtual bool receive_inputs(const Vector<uint8_t> &p_data) override;
403405
void received_snapshot(const Snapshot &p_snapshot);
404-
virtual void queue_instant_process(FrameIndex p_input_id, int p_index, int p_count) override;
406+
void on_rewind_frame_begin(FrameIndex p_input_id, int p_index, int p_count);
405407
virtual bool fetch_next_input(double p_delta) override;
406408
virtual void process(double p_delta) override;
407-
virtual void on_state_validated(FrameIndex p_frame_index) override;
409+
void on_state_validated(FrameIndex p_frame_index, bool p_detected_desync);
408410
void notify_frame_checked(FrameIndex p_input_id);
409411

410-
void notify_applied_snapshot(FrameIndex frame_index, ObjectNetId p_id);
412+
// Checks whether this doll requires a reconciliation.
413+
// The check done is relative to the doll timeline, and not the scene sync timeline.
414+
bool __pcr__fetch_recovery_info(
415+
FrameIndex p_checking_frame_index,
416+
int p_predicted_frames,
417+
std::vector<std::string> *r_differences_info
418+
#ifdef DEBUG_ENABLED
419+
,
420+
std::vector<ObjectNetId> *r_different_node_data
421+
#endif
422+
) const;
423+
424+
void notify_applied_snapshot(FrameIndex p_frame_index, ObjectNetId p_id);
411425
};
412426

413427
/// This controller is used when the game instance is not a peer of any kind.

0 commit comments

Comments
 (0)