improved crapnet so it changes between different ping configurations. improved the game timer

This commit is contained in:
Magnus Auvinen 2009-01-21 19:12:09 +00:00
parent 38a9e32efd
commit f0760ac0d3
2 changed files with 62 additions and 19 deletions

View file

@ -270,7 +270,8 @@ static SMOOTHTIME game_time;
static SMOOTHTIME predicted_time; static SMOOTHTIME predicted_time;
/* graphs */ /* graphs */
static GRAPH input_late_graph; static GRAPH inputtime_margin_graph;
static GRAPH gametime_margin_graph;
static GRAPH fps_graph; static GRAPH fps_graph;
/* -- snapshot handling --- */ /* -- snapshot handling --- */
@ -586,7 +587,8 @@ void client_connect(const char *server_address_str)
netclient_connect(net, &server_address); netclient_connect(net, &server_address);
client_set_state(CLIENTSTATE_CONNECTING); client_set_state(CLIENTSTATE_CONNECTING);
graph_init(&input_late_graph, 0.0f, 1.0f); graph_init(&inputtime_margin_graph, -150.0f, 150.0f);
graph_init(&gametime_margin_graph, -150.0f, 150.0f);
} }
void client_disconnect_with_reason(const char *reason) void client_disconnect_with_reason(const char *reason)
@ -734,7 +736,8 @@ static void client_debug_render()
graph_scale_max(&fps_graph); graph_scale_max(&fps_graph);
graph_scale_min(&fps_graph); graph_scale_min(&fps_graph);
graph_render(&fps_graph, x, sp*5, w, h, "FPS"); graph_render(&fps_graph, x, sp*5, w, h, "FPS");
graph_render(&input_late_graph, x, sp*5+h+sp, w, h, "Input Margin"); graph_render(&inputtime_margin_graph, x, sp*5+h+sp, w, h, "Prediction Margin");
graph_render(&gametime_margin_graph, x, sp*5+h+sp+h+sp, w, h, "Gametime Margin");
} }
} }
@ -1069,17 +1072,13 @@ static void client_process_packet(NETCHUNK *packet)
if(time_left < 0) if(time_left < 0)
{ {
graph_add(&input_late_graph, time_left/100.0f+0.5f, 1,0,0); graph_add(&inputtime_margin_graph, time_left, 1,0,0);
if(config.debug)
dbg_msg("client", "input was late with %d ms", time_left);
if(predicted_time.up_adjustspeed < 30.0f) if(predicted_time.up_adjustspeed < 30.0f)
predicted_time.up_adjustspeed *= 2.0f; predicted_time.up_adjustspeed *= 2.0f;
} }
else else
{ {
graph_add(&input_late_graph, time_left/100.0f+0.5f, 0,1,0); graph_add(&inputtime_margin_graph, time_left, 0,1,0);
predicted_time.up_adjustspeed *= 0.95f; predicted_time.up_adjustspeed *= 0.95f;
if(predicted_time.up_adjustspeed < 1.0f) if(predicted_time.up_adjustspeed < 1.0f)
@ -1241,6 +1240,31 @@ static void client_process_packet(NETCHUNK *packet)
/* add new */ /* add new */
snapstorage_add(&snapshot_storage, game_tick, time_get(), snapsize, (SNAPSHOT*)tmpbuffer3, 1); snapstorage_add(&snapshot_storage, game_tick, time_get(), snapsize, (SNAPSHOT*)tmpbuffer3, 1);
/* adjust gametime timer */
{
int64 now = st_get(&game_time, time_get());
int64 tickstart = game_tick*time_freq()/50;
int64 time_left = (tickstart-now)*1000 / time_freq();
if(time_left < 0)
{
graph_add(&gametime_margin_graph, time_left, 1,0,0);
if(game_time.down_adjustspeed < 30.0f)
{
game_time.down_adjustspeed *= 2.0f;
dbg_msg("", "%f", game_time.down_adjustspeed);
}
}
else
{
graph_add(&gametime_margin_graph, time_left, 0,1,0);
game_time.down_adjustspeed *= 0.95f;
if(game_time.down_adjustspeed < 1.0f)
game_time.down_adjustspeed = 1.0f;
}
}
/* add snapshot to demo */ /* add snapshot to demo */
if(demorec_isrecording()) if(demorec_isrecording())
{ {
@ -1463,8 +1487,6 @@ static void client_update()
intratick = (now - prevtick_start) / (float)(curtick_start-prevtick_start); intratick = (now - prevtick_start) / (float)(curtick_start-prevtick_start);
ticktime = (now - prevtick_start) / (float)freq; /*(float)SERVER_TICK_SPEED);*/ ticktime = (now - prevtick_start) / (float)freq; /*(float)SERVER_TICK_SPEED);*/
/*graph_add(&intra_graph, intratick*0.25f);*/
curtick_start = new_pred_tick*time_freq()/50; curtick_start = new_pred_tick*time_freq()/50;
prevtick_start = prev_pred_tick*time_freq()/50; prevtick_start = prev_pred_tick*time_freq()/50;
predintratick = (pred_now - prevtick_start) / (float)(curtick_start-prevtick_start); predintratick = (pred_now - prevtick_start) / (float)(curtick_start-prevtick_start);

View file

@ -19,11 +19,24 @@ static PACKET *first = (PACKET *)0;
static PACKET *last = (PACKET *)0; static PACKET *last = (PACKET *)0;
static int current_latency = 0; static int current_latency = 0;
struct PINGCONFIG
{
int base;
int flux;
int spike;
int loss;
};
static PINGCONFIG config_pings[] = {
// base flux spike loss
{0, 0, 0, 0},
{40, 20, 0, 0},
{140, 40, 0, 0},
};
static int config_numpingconfs = sizeof(config_pings)/sizeof(PINGCONFIG);
static int config_interval = 10; /* seconds between different pingconfigs */
static int config_log = 0; static int config_log = 0;
static int config_ping = 40;
static int config_pingflux = 20;
static int config_pingspike = 0;
static int config_packetloss = 1; // in percent
static int config_reorder = 0; static int config_reorder = 0;
int run(int port, NETADDR dest) int run(int port, NETADDR dest)
@ -36,6 +49,14 @@ int run(int port, NETADDR dest)
while(1) while(1)
{ {
static int lastcfg = 0;
int n = ((time_get()/time_freq())/config_interval) % config_numpingconfs;
PINGCONFIG ping = config_pings[n];
if(n != lastcfg)
dbg_msg("crapnet", "cfg = %d", n);
lastcfg = n;
// handle incomming packets // handle incomming packets
while(1) while(1)
{ {
@ -46,7 +67,7 @@ int run(int port, NETADDR dest)
if(bytes <= 0) if(bytes <= 0)
break; break;
if((rand()%100) < config_packetloss) // drop the packet if((rand()%100) < ping.loss) // drop the packet
{ {
if(config_log) if(config_log)
dbg_msg("crapnet", "dropped packet"); dbg_msg("crapnet", "dropped packet");
@ -134,9 +155,9 @@ int run(int port, NETADDR dest)
// update lag // update lag
double flux = rand()/(double)RAND_MAX; double flux = rand()/(double)RAND_MAX;
int ms_spike = config_pingspike; int ms_spike = ping.spike;
int ms_flux = config_pingflux; int ms_flux = ping.flux;
int ms_ping = config_ping; int ms_ping = ping.base;
current_latency = ((time_freq()*ms_ping)/1000) + (int64)(((time_freq()*ms_flux)/1000)*flux); // 50ms current_latency = ((time_freq()*ms_ping)/1000) + (int64)(((time_freq()*ms_flux)/1000)*flux); // 50ms
if(ms_spike && (p->id%100) == 0) if(ms_spike && (p->id%100) == 0)