Skip to content
This repository was archived by the owner on Mar 29, 2025. It is now read-only.

Commit 88942eb

Browse files
committed
Refactored the send input. Now it's performed at the end of the frame opposed to the previous implementation that was executed at the end of the sub frame that could cause network saturation.
1 parent 0eef231 commit 88942eb

File tree

4 files changed

+29
-5
lines changed

4 files changed

+29
-5
lines changed

core/peer_networked_controller.cpp

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ void PeerNetworkedController::remove_synchronizer() {
218218
scene_synchronizer = nullptr;
219219
}
220220

221-
NS::SceneSynchronizerBase *PeerNetworkedController::get_scene_synchronizer() const {
221+
SceneSynchronizerBase *PeerNetworkedController::get_scene_synchronizer() const {
222222
return scene_synchronizer;
223223
}
224224

@@ -295,7 +295,7 @@ void PeerNetworkedController::encode_inputs(std::deque<FrameInput> &p_frames_inp
295295
// |-- First byte the amount of times this input is duplicated in the packet.
296296
// |-- Input buffer.
297297

298-
const size_t inputs_count = std::min(p_frames_input.size(), static_cast<size_t>(get_max_redundant_inputs() + 1));
298+
const size_t inputs_count = std::min(p_frames_input.size(), std::max(static_cast<size_t>(1), static_cast<size_t>(get_max_redundant_inputs())));
299299
if make_unlikely(inputs_count <= 0) {
300300
// Nothing to send.
301301
return;
@@ -931,9 +931,15 @@ PlayerController::PlayerController(PeerNetworkedController *p_peer_controller) :
931931

932932
event_handler_state_validated =
933933
peer_controller->scene_synchronizer->event_state_validated.bind(std::bind(&PlayerController::on_state_validated, this, std::placeholders::_1, std::placeholders::_2));
934+
935+
event_handler_on_end_process =
936+
peer_controller->scene_synchronizer->event_app_process_end.bind(std::bind(&PlayerController::on_app_process_end, this, std::placeholders::_1));
934937
}
935938

936939
PlayerController::~PlayerController() {
940+
peer_controller->scene_synchronizer->event_app_process_end.unbind(event_handler_on_end_process);
941+
event_handler_on_end_process = NS::NullPHandler;
942+
937943
peer_controller->scene_synchronizer->event_rewind_frame_begin.unbind(event_handler_rewind_frame_begin);
938944
event_handler_rewind_frame_begin = NS::NullPHandler;
939945

@@ -1104,7 +1110,7 @@ void PlayerController::process(float p_delta) {
11041110

11051111
// Keep sending inputs, despite the server seems not responding properly,
11061112
// to make sure the server becomes up to date at some point.
1107-
send_frame_input_buffer_to_server();
1113+
has_pending_inputs_sent = true;
11081114
}
11091115
}
11101116
}
@@ -1113,6 +1119,10 @@ void PlayerController::on_state_validated(FrameIndex p_frame_index, bool p_detec
11131119
notify_frame_checked(p_frame_index);
11141120
}
11151121

1122+
void PlayerController::on_app_process_end(float p_delta_seconds) {
1123+
send_frame_input_buffer_to_server();
1124+
}
1125+
11161126
FrameIndex PlayerController::get_current_frame_index() const {
11171127
return current_input_id;
11181128
}
@@ -1146,6 +1156,11 @@ void PlayerController::store_input_buffer(FrameIndex p_frame_index) {
11461156
}
11471157

11481158
void PlayerController::send_frame_input_buffer_to_server() {
1159+
if (!has_pending_inputs_sent) {
1160+
return;
1161+
}
1162+
has_pending_inputs_sent = false;
1163+
11491164
peer_controller->encode_inputs(frames_input, cached_packet_data);
11501165

11511166
peer_controller->scene_synchronizer->call_rpc_receive_inputs(

core/peer_networked_controller.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -265,15 +265,17 @@ struct AutonomousServerController final : public ServerController {
265265
};
266266

267267
struct PlayerController final : public Controller {
268-
NS::PHandler event_handler_rewind_frame_begin = NS::NullPHandler;
269-
NS::PHandler event_handler_state_validated = NS::NullPHandler;
268+
PHandler event_handler_rewind_frame_begin = NS::NullPHandler;
269+
PHandler event_handler_state_validated = NS::NullPHandler;
270+
PHandler event_handler_on_end_process = NullPHandler;
270271

271272
FrameIndex current_input_id;
272273
std::uint32_t input_buffers_counter;
273274
bool streaming_paused = false;
274275

275276
std::deque<FrameInput> frames_input;
276277
std::vector<std::uint8_t> cached_packet_data;
278+
bool has_pending_inputs_sent = false;
277279
int queued_instant_to_process = -1;
278280

279281
PlayerController(PeerNetworkedController *p_node);
@@ -290,6 +292,7 @@ struct PlayerController final : public Controller {
290292
bool has_another_instant_to_process_after(int p_i) const;
291293
virtual void process(float p_delta) override;
292294
void on_state_validated(FrameIndex p_frame_index, bool p_detected_desync);
295+
void on_app_process_end(float p_delta_seconds);
293296

294297
virtual bool receive_inputs(const std::vector<std::uint8_t> &p_data) override;
295298

scene_synchronizer.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,8 @@ void SceneSynchronizerBase::process(float p_delta) {
166166
try_fetch_unnamed_objects_data_names();
167167

168168
synchronizer->process(p_delta);
169+
170+
event_app_process_end.broadcast(p_delta);
169171
}
170172

171173
void SceneSynchronizerBase::on_app_object_removed(ObjectHandle p_app_object_handle) {

scene_synchronizer.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,10 @@ class SceneSynchronizerBase {
341341
/// Is called when the synchronization is paused.
342342
Processor<> event_sync_paused;
343343
Processor<const Settings &> event_settings_changed;
344+
/// Executed at the end of the processing.
345+
/// Notice this is not the sub and fixed time processing which is sync.
346+
/// This is emitted by the application processing function and the delta time is frame dependent.
347+
Processor<float/*delta seconds*/> event_app_process_end;
344348
Processor<int /*p_peer*/, bool /*p_connected*/, bool /*p_enabled*/> event_peer_status_updated;
345349
Processor<FrameIndex, bool /*p_desync_detected*/> event_state_validated;
346350
Processor<FrameIndex, int /*p_peer*/> event_sent_snapshot;

0 commit comments

Comments
 (0)