diff options
| -rw-r--r-- | src/engine/client/client.c | 24 | ||||
| -rw-r--r-- | src/engine/client/gfx.c | 1 | ||||
| -rw-r--r-- | src/game/client/game_client.cpp | 43 |
3 files changed, 63 insertions, 5 deletions
diff --git a/src/engine/client/client.c b/src/engine/client/client.c index 6e1e88d6..7a545988 100644 --- a/src/engine/client/client.c +++ b/src/engine/client/client.c @@ -48,6 +48,8 @@ static int64 local_start_time; static int debug_font; static float frametime = 0.0001f; +static float frametime_low = 1.0f; +static float frametime_high = 0.0f; static int frames = 0; static NETADDR4 server_address; static int window_must_refocus = 0; @@ -875,6 +877,7 @@ static void client_update() { int repredict = 0; int64 now = st_get(&game_time, time_get()); + int64 pred_now = st_get(&predicted_time, time_get()); while(1) { @@ -909,10 +912,10 @@ static void client_update() { int64 curtick_start = (snapshots[SNAP_CURRENT]->tick)*time_freq()/50; int64 prevtick_start = (snapshots[SNAP_PREV]->tick)*time_freq()/50; - int64 pred_now = st_get(&predicted_time, time_get()); /*tg_add(&predicted_time_graph, pred_now, 0); */ int prev_pred_tick = (int)(pred_now*50/time_freq()); int new_pred_tick = prev_pred_tick+1; + static float last_intrapred = 0; intratick = (now - prevtick_start) / (float)(curtick_start-prevtick_start); @@ -922,14 +925,20 @@ static void client_update() prevtick_start = prev_pred_tick*time_freq()/50; intrapredtick = (pred_now - prevtick_start) / (float)(curtick_start-prevtick_start); + if(new_pred_tick > current_predtick) { + last_intrapred = intrapredtick; current_predtick = new_pred_tick; repredict = 1; /* send input */ client_send_input(); } + + if(intrapredtick < last_intrapred) + dbg_msg("client", "prediction time goes backwards, that can't be good"); + last_intrapred = intrapredtick; } /* only do sane predictions */ @@ -1091,15 +1100,24 @@ static void client_run() { if(config.debug) { - dbg_msg("client/report", "fps=%.02f netstate=%d", - frames/(float)(reportinterval/time_freq()), netclient_state(net)); + dbg_msg("client/report", "fps=%.02f (%.02f %.02f) netstate=%d", + frames/(float)(reportinterval/time_freq()), + 1.0f/frametime_high, + 1.0f/frametime_low, + netclient_state(net)); } + frametime_low = 1; + frametime_high = 0; frames = 0; reporttime += reportinterval; } /* update frametime */ frametime = (time_get()-frame_start_time)/(float)time_freq(); + if(frametime < frametime_low) + frametime_low = frametime; + if(frametime > frametime_high) + frametime_high = frametime; } modc_shutdown(); diff --git a/src/engine/client/gfx.c b/src/engine/client/gfx.c index 5d7ca4d8..31483224 100644 --- a/src/engine/client/gfx.c +++ b/src/engine/client/gfx.c @@ -628,6 +628,7 @@ void gfx_swap() } glfwSwapBuffers(); + glFinish(); glfwPollEvents(); } diff --git a/src/game/client/game_client.cpp b/src/game/client/game_client.cpp index 75899ae5..c910014c 100644 --- a/src/game/client/game_client.cpp +++ b/src/game/client/game_client.cpp @@ -753,10 +753,15 @@ static void process_events(int s) static player_core predicted_prev_player; static player_core predicted_player; +static int predicted_tick = 0; static int last_new_predicted_tick = -1; extern "C" void modc_predict() { + player_core before_prev_player = predicted_prev_player; + player_core before_player = predicted_player; + + // repredict player world_core world; int local_cid = -1; @@ -849,6 +854,27 @@ extern "C" void modc_predict() if(tick == client_predtick() && world.players[local_cid]) predicted_player = *world.players[local_cid]; } + + if(config.debug && predicted_tick == client_predtick()) + { + if(predicted_player.pos.x != before_player.pos.x || + predicted_player.pos.y != before_player.pos.y) + { + dbg_msg("client", "prediction error, (%d %d) (%d %d)", + (int)before_player.pos.x, (int)before_player.pos.y, + (int)predicted_player.pos.x, (int)predicted_player.pos.y); + } + + if(predicted_prev_player.pos.x != before_prev_player.pos.x || + predicted_prev_player.pos.y != before_prev_player.pos.y) + { + dbg_msg("client", "prediction error, prev (%d %d) (%d %d)", + (int)before_prev_player.pos.x, (int)before_prev_player.pos.y, + (int)predicted_prev_player.pos.x, (int)predicted_prev_player.pos.y); + } + } + + predicted_tick = client_predtick(); } static void clear_object_pointers() @@ -2441,7 +2467,7 @@ void render_game() gfx_quads_end(); } - if(local_character && !spectate) + if(local_character && !spectate && !(gameobj && gameobj->game_over)) { gfx_texture_set(data->images[IMAGE_GAME].id); gfx_quads_begin(); @@ -2668,7 +2694,7 @@ void render_game() } // render small score hud - if(gametype == GAMETYPE_TDM || gametype == GAMETYPE_CTF) + if(!(gameobj && gameobj->game_over) && (gametype == GAMETYPE_TDM || gametype == GAMETYPE_CTF)) { for(int t = 0; t < 2; t++) { @@ -2792,6 +2818,19 @@ void render_game() } else { + + if(gameobj && gameobj->game_over) + { + const char *text = "DRAW!"; + if(gameobj->teamscore[0] > gameobj->teamscore[1]) + text = "Red Team Wins!"; + else if(gameobj->teamscore[1] > gameobj->teamscore[0]) + text = "Blue Team Wins!"; + + float w = gfx_pretty_text_width(92.0f, text, -1); + gfx_pretty_text(width/2-w/2, 45, 92.0f, text, -1); + } + render_scoreboard(width/2-w-20, 150.0f, w, 0, "Red Team"); render_scoreboard(width/2 + 20, 150.0f, w, 1, "Blue Team"); } |