[Net] ENet poll now only service the connection once.

It used to call `enet_host_service` until all events were consumed, but
that also meant constantly polling the connection leading to potentially
unbounded processing time.

It now only service the connection once, and instead consumes all the
retrieved events via `enet_host_check_events`.
This commit is contained in:
Jordan Schidlowsky 2021-09-27 09:39:31 +02:00 committed by Fabio Alessandrelli
parent 25636f8db7
commit 3b43dfee11
1 changed files with 16 additions and 13 deletions

View File

@ -217,20 +217,23 @@ void NetworkedMultiplayerENet::poll() {
_pop_current_packet();
ENetEvent event;
/* Keep servicing until there are no available events left in queue. */
while (true) {
if (!host || !active) { // Might have been disconnected while emitting a notification
if (!host || !active) { // Might be disconnected
return;
}
ENetEvent event;
int ret = enet_host_service(host, &event, 0);
if (ret < 0) {
// Error, do something?
break;
ERR_FAIL_MSG("Enet host service error");
} else if (ret == 0) {
break;
return; // No events
}
/* Keep servicing until there are no available events left in the queue. */
do {
if (!host || !active) { // Check again after every event
return;
}
switch (event.type) {
@ -436,7 +439,7 @@ void NetworkedMultiplayerENet::poll() {
// Do nothing
} break;
}
}
} while (enet_host_check_events(host, &event) > 0);
}
bool NetworkedMultiplayerENet::is_server() const {