--- deliantra/server/socket/loop.C 2007/03/16 02:37:54 1.43 +++ deliantra/server/socket/loop.C 2007/04/02 19:56:11 1.44 @@ -174,6 +174,7 @@ if (askface.empty ()) { + // regularly send a new face when queue is empty if (bg_scrub && !--bg_scrub && enable_bg_scrub) while (scrub_idx < faces.size () - 1) { @@ -185,17 +186,40 @@ break; } } + + rate_avail = max_rate - outputbuffer_len (); } else - while (!askface.empty () && outputbuffer_len () < max_rate) - { - // use a lifo to send most recently requested images - faceidx face = askface.back (); - askface.pop_back (); + { + int ol = outputbuffer_len (); + + rate_avail = min (max_rate, rate_avail + max_rate); + rate_avail -= ol; + + int avail = rate_avail; + + // if we can split images, transfer up to mss packets if possible + if (fxix) avail += mss - (ol % mss); + + fprintf (stderr, "ra %6d a %6d ", rate_avail, avail); - send_image (face); + while (!askface.empty () && avail > 0) + { + // use a lifo to send most recently requested images + faceidx face = askface.back (); + askface.pop_back (); - bg_scrub = BG_SCRUB_RATE; - } + send_image (face); + + bg_scrub = BG_SCRUB_RATE; + + int consumed = ol - outputbuffer_len (); + avail -= consumed; + rate_avail -= consumed; + } + + fprintf (stderr, "ra %6d a %6d\n", rate_avail, avail); + + } }