--- deliantra/server/socket/loop.C 2007/03/15 03:30:37 1.42 +++ deliantra/server/socket/loop.C 2007/04/03 00:21:38 1.45 @@ -172,29 +172,63 @@ if (update_look) esrv_draw_look (pl->ob); - if (askface.empty ()) + if (partial_face_ofs) { - if (bg_scrub && !--bg_scrub) + } + + if (partial_face_ofs) + { + // one hell of a big thing that must be + } + else 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) { ++scrub_idx; if (!faces_sent [scrub_idx]) { send_face (scrub_idx); + flush_fx (); + bg_scrub = 1; // send up to one face per tick, unless an image was requested 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); + + while (!askface.empty () && avail > 0) + { + // use a lifo to send most recently requested images + faceidx facenum = askface.back (); + askface.pop_back (); - send_image (face); + if (fxix && 0) + { + } + else + send_image (facenum); - bg_scrub = BG_SCRUB_RATE; - } + int consumed = ol - outputbuffer_len (); + avail -= consumed; + rate_avail -= consumed; + + bg_scrub = BG_SCRUB_RATE; + } + } } +