summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThilo Schulz <arny@ats.s.bawue.de>2011-07-13 18:57:32 +0000
committerTim Angus <tim@ngus.net>2013-01-10 22:27:31 +0000
commitb0c78b7d9e5ec6866ac0d38ef02266d3dfaa4edb (patch)
tree0e7c0324ba49711e849ef269a2ba1e2ff5f9fe93
parent90ec05fa09b7948f65b3c27be4f134dd8e7ed109 (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.c118
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;