diff options
| author | Magnus Auvinen <magnus.auvinen@gmail.com> | 2009-01-10 10:49:17 +0000 |
|---|---|---|
| committer | Magnus Auvinen <magnus.auvinen@gmail.com> | 2009-01-10 10:49:17 +0000 |
| commit | 599708824fde388c569b32fb3547a5a1b5731478 (patch) | |
| tree | 3c74b8335784e1c47e55576e6ac2fc9931ad3a28 /src/engine | |
| parent | b42eb557946ccfc271a4af0a7787681e2345789c (diff) | |
| download | zcatch-599708824fde388c569b32fb3547a5a1b5731478.tar.gz zcatch-599708824fde388c569b32fb3547a5a1b5731478.zip | |
removed input timing from the snapshot messages and put them in a separate message so we don't loose them if the input were late
Diffstat (limited to 'src/engine')
| -rw-r--r-- | src/engine/client/ec_client.c | 54 | ||||
| -rw-r--r-- | src/engine/e_protocol.h | 1 | ||||
| -rw-r--r-- | src/engine/server/es_server.c | 32 |
3 files changed, 39 insertions, 48 deletions
diff --git a/src/engine/client/ec_client.c b/src/engine/client/ec_client.c index f4bc902c..458d7e68 100644 --- a/src/engine/client/ec_client.c +++ b/src/engine/client/ec_client.c @@ -97,6 +97,7 @@ static int prev_tick = 0; /* predicted time */ static int current_predtick = 0; static float predintratick = 0; +static int last_input_timeleft = 0; static struct /* TODO: handle input better */ { @@ -646,6 +647,7 @@ static void client_debug_render() recv_packets, recv_bytes, recv_packets*42, recv_total, (recv_total*8)/1024, recv_bytes/recv_packets); gfx_quads_text(2, 14, 16, buffer); } + /* render rates */ { int y = 0; @@ -661,6 +663,9 @@ static void client_debug_render() } } } + + str_format(buffer, sizeof(buffer), "input time left: %d", last_input_timeleft); + gfx_quads_text(2, 70, 16, buffer); /* render graphs */ if(config.dbg_graphs) @@ -993,6 +998,31 @@ static void client_process_packet(NETCHUNK *packet) } else if(msg == NETMSG_PING_REPLY) dbg_msg("client/network", "latency %.2f", (time_get() - ping_start_time)*1000 / (float)time_freq()); + else if(msg == NETMSG_INPUTTIMING) + { + int input_predtick = msg_unpack_int(); + int time_left = msg_unpack_int(); + + /* adjust our prediction time */ + int k; + + graph_add(&input_late_graph, time_left/100.0f+0.5f); + + if(time_left < 0) + dbg_msg("client", "input was late with %d ms", time_left); + last_input_timeleft = time_left; + + for(k = 0; k < 200; k++) /* TODO: do this better */ + { + if(inputs[k].tick == input_predtick) + { + /*-1000/50 prediction_margin */ + int64 target = inputs[k].game_time + (time_get() - inputs[k].time); + st_update(&predicted_time, target - (int64)(((time_left-prediction_margin)/1000.0f)*time_freq())); + break; + } + } + } else if(msg == NETMSG_SNAP || msg == NETMSG_SNAPSINGLE || msg == NETMSG_SNAPEMPTY) { /*dbg_msg("client/network", "got snapshot"); */ @@ -1000,8 +1030,6 @@ static void client_process_packet(NETCHUNK *packet) int part = 0; int game_tick = msg_unpack_int(); int delta_tick = game_tick-msg_unpack_int(); - int input_predtick = msg_unpack_int(); - int time_left = msg_unpack_int(); int part_size = 0; int crc = 0; int complete_size = 0; @@ -1027,29 +1055,7 @@ static void client_process_packet(NETCHUNK *packet) if(msg_unpack_error()) return; - - /* TODO: adjust our prediction time */ - if(time_left) - { - int k; - - graph_add(&input_late_graph, time_left/100.0f+0.5f); - - if(time_left < 0) - dbg_msg("client", "input was late with %d ms", time_left); - for(k = 0; k < 200; k++) /* TODO: do this better */ - { - if(inputs[k].tick == input_predtick) - { - /*-1000/50 prediction_margin */ - int64 target = inputs[k].game_time + (time_get() - inputs[k].time); - st_update(&predicted_time, target - (int64)(((time_left-prediction_margin)/1000.0f)*time_freq())); - break; - } - } - } - if(game_tick >= current_recv_tick) { if(game_tick != current_recv_tick) diff --git a/src/engine/e_protocol.h b/src/engine/e_protocol.h index 033db43c..a1feb4cc 100644 --- a/src/engine/e_protocol.h +++ b/src/engine/e_protocol.h @@ -39,6 +39,7 @@ enum NETMSG_SNAPEMPTY, /* empty snapshot */ NETMSG_SNAPSINGLE, /* ? */ NETMSG_SNAPSMALL, /* */ + NETMSG_INPUTTIMING, /* reports how off the input was */ NETMSG_RCON_AUTH_STATUS,/* result of the authentication */ NETMSG_RCON_LINE, /* line that should be printed to the remote console */ diff --git a/src/engine/server/es_server.c b/src/engine/server/es_server.c index b8df0f50..0fe6562a 100644 --- a/src/engine/server/es_server.c +++ b/src/engine/server/es_server.c @@ -82,9 +82,7 @@ enum typedef struct { int data[MAX_INPUT_SIZE]; - int pred_tick; /* tick that the client predicted for the input */ int game_tick; /* the tick that was chosen for the input */ - int64 timeleft; /* how much time in ms there were left before this should be applied */ } CLIENT_INPUT; /* */ @@ -363,7 +361,7 @@ int server_send_msg(int client_id) static void server_do_snap() { - int i, k; + int i; { static PERFORMACE_INFO scope = {"presnap", 0}; @@ -412,8 +410,6 @@ static void server_do_snap() SNAPSHOT *deltashot = &emptysnap; int deltashot_size; int delta_tick = -1; - int input_predtick = -1; - int64 timeleft = 0; int deltasize; static PERFORMACE_INFO scope = {"build", 0}; perf_start(&scope); @@ -454,16 +450,6 @@ static void server_do_snap() } } - for(k = 0; k < 200; k++) /* TODO: do this better */ - { - if(clients[i].inputs[k].game_tick == current_tick) - { - timeleft = clients[i].inputs[k].timeleft; - input_predtick = clients[i].inputs[k].pred_tick; - break; - } - } - /* create delta */ { static PERFORMACE_INFO scope = {"delta", 0}; @@ -507,8 +493,6 @@ static void server_do_snap() msg_pack_int(current_tick); msg_pack_int(current_tick-delta_tick); /* compressed with */ - msg_pack_int(input_predtick); - msg_pack_int((timeleft*1000)/time_freq()); if(numpackets != 1) { @@ -528,8 +512,6 @@ static void server_do_snap() msg_pack_start_system(NETMSG_SNAPEMPTY, MSGFLAG_FLUSH); msg_pack_int(current_tick); msg_pack_int(current_tick-delta_tick); /* compressed with */ - msg_pack_int(input_predtick); - msg_pack_int((timeleft*1000)/time_freq()); msg_pack_end(); server_send_msg(i); } @@ -547,10 +529,7 @@ static void reset_client(int cid) /* reset input */ int i; for(i = 0; i < 200; i++) - { clients[cid].inputs[i].game_tick = -1; - clients[cid].inputs[i].pred_tick = -1; - } clients[cid].current_input = 0; mem_zero(&clients[cid].latestinput, sizeof(clients[cid].latestinput)); @@ -730,9 +709,14 @@ static void server_process_client_packet(NETCHUNK *packet) if(snapstorage_get(&clients[cid].snapshots, clients[cid].last_acked_snapshot, &tagtime, 0, 0) >= 0) clients[cid].latency = (int)(((time_get()-tagtime)*1000)/time_freq()); + /* add message to report the input timing */ + msg_pack_start_system(NETMSG_INPUTTIMING, MSGFLAG_VITAL); + msg_pack_int(tick); + msg_pack_int(((server_tick_start_time(tick)-time_get())*1000) / time_freq()); + msg_pack_end(); + server_send_msg(cid); + input = &clients[cid].inputs[clients[cid].current_input]; - input->timeleft = server_tick_start_time(tick)-time_get(); - input->pred_tick = tick; if(tick <= server_tick()) tick = server_tick()+1; |