diff options
author | Thilo Schulz <arny@ats.s.bawue.de> | 2011-07-13 18:57:32 +0000 |
---|---|---|
committer | Tim Angus <tim@ngus.net> | 2013-01-10 22:27:31 +0000 |
commit | b0c78b7d9e5ec6866ac0d38ef02266d3dfaa4edb (patch) | |
tree | 0e7c0324ba49711e849ef269a2ba1e2ff5f9fe93 | |
parent | 90ec05fa09b7948f65b3c27be4f134dd8e7ed109 (diff) |
- Make sure at least one round of download packets and packet queues gets sent each frame - Fix timeVal select timeout value for case of unlimited data rate and now downloads are active
-rw-r--r-- | src/qcommon/common.c | 118 |
1 files changed, 56 insertions, 62 deletions
diff --git a/src/qcommon/common.c b/src/qcommon/common.c index 8732eab6..768166af 100644 --- a/src/qcommon/common.c +++ b/src/qcommon/common.c @@ -2941,82 +2941,76 @@ void Com_Frame( void ) { do { - // Busy sleep the last millisecond for better timeout precision - if(timeVal < 2) - NET_Sleep(0); - else + if(com_sv_running->integer) { - if(com_sv_running->integer) + // Send out fragmented packets now that we're idle + delayT = SV_SendQueuedMessages(); + if(delayT >= 0 && delayT < timeVal) + timeVal = delayT; + + if(sv_dlRate->integer) { - // Send out fragmented packets now that we're idle - delayT = SV_SendQueuedMessages(); - if(delayT >= 0 && delayT < timeVal) - timeVal = delayT; - - if(sv_dlRate->integer) + // Rate limiting. This is very imprecise for high + // download rates due to millisecond timedelta resolution + dlStart = Sys_Milliseconds(); + deltaT = dlNextRound - dlStart; + + if(deltaT > 0) { - // Rate limiting. This is very imprecise for high - // download rates due to millisecond timedelta resolution - dlStart = Sys_Milliseconds(); - deltaT = dlNextRound - dlStart; + if(deltaT < timeVal) + timeVal = deltaT + 1; + } + else + { + numBlocks = SV_SendDownloadMessages(); - if(deltaT > 0) - { - if(deltaT < timeVal) - timeVal = deltaT + 1; - } - else + if(numBlocks) { - numBlocks = SV_SendDownloadMessages(); + // There are active downloads + deltaT = Sys_Milliseconds() - dlStart; - if(numBlocks) + delayT = 1000 * numBlocks * MAX_DOWNLOAD_BLKSIZE; + delayT /= sv_dlRate->integer * 1024; + + if(delayT <= deltaT + 1) { - // There are active downloads - deltaT = Sys_Milliseconds() - dlStart; - - delayT = 1000 * numBlocks * MAX_DOWNLOAD_BLKSIZE; - delayT /= sv_dlRate->integer * 1024; - - if(delayT <= deltaT + 1) - { - // Sending the last round of download messages - // took too long for given rate, don't wait for - // next round, but always enforce a 1ms delay - // between DL message rounds so we don't hog - // all of the bandwidth. This will result in an - // effective maximum rate of 1MB/s per user, but the - // low download window size limits this anyways. - if(timeVal > 2) - timeVal = 2; - - dlNextRound = dlStart + deltaT + 1; - } - else - { - dlNextRound = dlStart + delayT; - delayT -= deltaT; - - if(delayT < timeVal) - timeVal = delayT; - } + // Sending the last round of download messages + // took too long for given rate, don't wait for + // next round, but always enforce a 1ms delay + // between DL message rounds so we don't hog + // all of the bandwidth. This will result in an + // effective maximum rate of 1MB/s per user, but the + // low download window size limits this anyways. + if(timeVal > 2) + timeVal = 2; + + dlNextRound = dlStart + deltaT + 1; + } + else + { + dlNextRound = dlStart + delayT; + delayT -= deltaT; + + if(delayT < timeVal) + timeVal = delayT; } } } - else - { - SV_SendDownloadMessages(); + } + else + { + if(SV_SendDownloadMessages()) timeVal = 1; - } } + } - if(timeVal == 0) - timeVal = 1; + if(timeVal == 0) + timeVal = 1; - if(com_busyWait->integer) - NET_Sleep(0); - else - NET_Sleep(timeVal - 1); - } + if(com_busyWait->integer) + NET_Sleep(0); + else + NET_Sleep(timeVal - 1); msec = Sys_Milliseconds() - com_frameTime; |