Eliminate strange wait time of ~1 ms during message handling on the

client where nothing seemed to be occuring
This commit is contained in:
Imbris 2021-06-18 03:17:55 -04:00
parent 2bb91e8d7d
commit 044b2316a6
3 changed files with 28 additions and 37 deletions

1
Cargo.lock generated
View File

@ -5718,7 +5718,6 @@ dependencies = [
"authc", "authc",
"byteorder", "byteorder",
"clap", "clap",
"futures-util",
"hashbrown 0.11.2", "hashbrown 0.11.2",
"image", "image",
"num 0.4.0", "num 0.4.0",

View File

@ -21,7 +21,6 @@ common-net = { package = "veloren-common-net", path = "../common/net" }
network = { package = "veloren-network", path = "../network", features = ["compression","quic"], default-features = false } network = { package = "veloren-network", path = "../network", features = ["compression","quic"], default-features = false }
byteorder = "1.3.2" byteorder = "1.3.2"
futures-util = "0.3.7"
tokio = { version = "1", default-features = false, features = ["rt-multi-thread"] } tokio = { version = "1", default-features = false, features = ["rt-multi-thread"] }
quinn = "0.7.2" quinn = "0.7.2"
image = { version = "0.23.12", default-features = false, features = ["png"] } image = { version = "0.23.12", default-features = false, features = ["png"] }

View File

@ -58,7 +58,6 @@ use common_net::{
use common_state::State; use common_state::State;
use common_systems::add_local_systems; use common_systems::add_local_systems;
use comp::BuffKind; use comp::BuffKind;
use futures_util::FutureExt;
use hashbrown::{HashMap, HashSet}; use hashbrown::{HashMap, HashSet};
use image::DynamicImage; use image::DynamicImage;
use network::{ConnectAddr, Network, Participant, Pid, Stream}; use network::{ConnectAddr, Network, Participant, Pid, Stream};
@ -71,7 +70,7 @@ use std::{
sync::Arc, sync::Arc,
time::{Duration, Instant}, time::{Duration, Instant},
}; };
use tokio::{runtime::Runtime, select}; use tokio::runtime::Runtime;
use tracing::{debug, error, trace, warn}; use tracing::{debug, error, trace, warn};
use vek::*; use vek::*;
@ -2014,7 +2013,7 @@ impl Client {
events: &mut Vec<Event>, events: &mut Vec<Event>,
msg: ServerGeneral, msg: ServerGeneral,
) -> Result<(), Error> { ) -> Result<(), Error> {
prof_span!("handle_character_screen_msg"); prof_span!("handle_server_character_screen_msg");
match msg { match msg {
ServerGeneral::CharacterListUpdate(character_list) => { ServerGeneral::CharacterListUpdate(character_list) => {
self.character_list.characters = character_list; self.character_list.characters = character_list;
@ -2066,34 +2065,37 @@ impl Client {
Ok(()) Ok(())
} }
async fn handle_messages( fn handle_messages(
&mut self, &mut self,
frontend_events: &mut Vec<Event>, frontend_events: &mut Vec<Event>,
cnt: &mut u64, ) -> Result<u64, Error> {
) -> Result<(), Error> { let mut cnt = 0;
loop { loop {
let (m1, m2, m3, m4, m5) = select!( let cnt_start = cnt;
msg = self.general_stream.recv().fuse() => (Some(msg), None, None, None, None),
msg = self.ping_stream.recv().fuse() => (None, Some(msg), None, None, None), while let Some(msg) = self.general_stream.try_recv()? {
msg = self.character_screen_stream.recv().fuse() => (None, None, Some(msg), None, None), cnt += 1;
msg = self.in_game_stream.recv().fuse() => (None, None, None, Some(msg), None), self.handle_server_msg(frontend_events, msg)?;
msg = self.terrain_stream.recv().fuse() => (None, None, None, None, Some(msg)),
);
*cnt += 1;
if let Some(msg) = m1 {
self.handle_server_msg(frontend_events, msg?)?;
} }
if let Some(msg) = m2 { while let Some(msg) = self.ping_stream.try_recv()? {
self.handle_ping_msg(msg?)?; cnt += 1;
self.handle_ping_msg(msg)?;
} }
if let Some(msg) = m3 { while let Some(msg) = self.character_screen_stream.try_recv()? {
self.handle_server_character_screen_msg(frontend_events, msg?)?; cnt += 1;
self.handle_server_character_screen_msg(frontend_events, msg)?;
} }
if let Some(msg) = m4 { while let Some(msg) = self.in_game_stream.try_recv()? {
self.handle_server_in_game_msg(frontend_events, msg?)?; cnt += 1;
self.handle_server_in_game_msg(frontend_events, msg)?;
} }
if let Some(msg) = m5 { while let Some(msg) = self.terrain_stream.try_recv()? {
self.handle_server_terrain_msg(msg?)?; cnt += 1;
self.handle_server_terrain_msg(msg)?;
}
if cnt_start == cnt {
return Ok(cnt);
} }
} }
} }
@ -2122,18 +2124,9 @@ impl Client {
} }
} }
let mut handles_msg = 0; let msg_count = self.handle_messages(&mut frontend_events)?;
let runtime = Arc::clone(&self.runtime); if msg_count == 0
runtime.block_on(async {
//TIMEOUT 0.01 ms for msg handling
select!(
_ = tokio::time::sleep(std::time::Duration::from_micros(10)).fuse() => Ok(()),
err = self.handle_messages(&mut frontend_events, &mut handles_msg).fuse() => err,
)
})?;
if handles_msg == 0
&& self.state.get_time() - self.last_server_pong > self.client_timeout.as_secs() as f64 && self.state.get_time() - self.last_server_pong > self.client_timeout.as_secs() as f64
{ {
return Err(Error::ServerTimeout); return Err(Error::ServerTimeout);