[quake3-commits] r2083 - in trunk/code: qcommon server

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Fri Jul 15 12:51:54 EDT 2011


Author: thilo
Date: 2011-07-15 12:51:54 -0400 (Fri, 15 Jul 2011)
New Revision: 2083

Modified:
   trunk/code/qcommon/common.c
   trunk/code/qcommon/net_ip.c
   trunk/code/qcommon/qcommon.h
   trunk/code/server/server.h
   trunk/code/server/sv_init.c
   trunk/code/server/sv_main.c
Log:
Move rate limiting / queued packet sending logic from Com_Frame() to sv_main.c


Modified: trunk/code/qcommon/common.c
===================================================================
--- trunk/code/qcommon/common.c	2011-07-15 14:49:51 UTC (rev 2082)
+++ trunk/code/qcommon/common.c	2011-07-15 16:51:54 UTC (rev 2083)
@@ -77,7 +77,6 @@
 cvar_t	*sv_paused;
 cvar_t  *cl_packetdelay;
 cvar_t  *sv_packetdelay;
-cvar_t  *sv_dlRate;
 cvar_t	*com_cameraMode;
 cvar_t	*com_ansiColor;
 cvar_t	*com_unfocused;
@@ -2781,7 +2780,6 @@
 	sv_paused = Cvar_Get ("sv_paused", "0", CVAR_ROM);
 	cl_packetdelay = Cvar_Get ("cl_packetdelay", "0", CVAR_CHEAT);
 	sv_packetdelay = Cvar_Get ("sv_packetdelay", "0", CVAR_CHEAT);
-	sv_dlRate = Cvar_Get ("sv_dlRate", "100", CVAR_ARCHIVE);
 	com_sv_running = Cvar_Get ("sv_running", "0", CVAR_ROM);
 	com_cl_running = Cvar_Get ("cl_running", "0", CVAR_ROM);
 	com_buildScript = Cvar_Get( "com_buildScript", "0", 0 );
@@ -3031,16 +3029,33 @@
 
 /*
 =================
+Com_TimeVal
+=================
+*/
+
+int Com_TimeVal(int minMsec)
+{
+	int timeVal;
+
+	timeVal = Sys_Milliseconds() - com_frameTime;
+
+	if(timeVal >= minMsec)
+		timeVal = 0;
+	else
+		timeVal = minMsec - timeVal;
+
+	return timeVal;
+}
+
+/*
+=================
 Com_Frame
 =================
 */
 void Com_Frame( void ) {
 
 	int		msec, minMsec;
-	int		timeVal;
-	int		numBlocks = 1;
-	int		dlStart, deltaT, delayT;
-	static int	dlNextRound = 0;
+	int		timeVal, timeValSV;
 	static int	lastTime = 0, bias = 0;
  
 	int		timeBeforeFirstEvents;
@@ -3100,94 +3115,26 @@
 	else
 		minMsec = 1;
 
-	msec = Sys_Milliseconds() - com_frameTime;
-
-	if(msec >= minMsec)
-		timeVal = 0;
-	else
-		timeVal = minMsec - msec;
-
+	timeVal = 0;
 	do
 	{
 		if(com_sv_running->integer)
 		{
-			// Send out fragmented packets now that we're idle
-			delayT = SV_SendQueuedMessages();
-			if(delayT >= 0 && delayT < timeVal)
-				timeVal = delayT;
+			timeValSV = SV_SendQueuedPackets();
+			
+			timeVal = Com_TimeVal(minMsec);
 
-			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)
-				{
-					if(deltaT < timeVal)
-						timeVal = deltaT + 1;
-				}
-				else
-				{
-					numBlocks = SV_SendDownloadMessages();
-
-					if(numBlocks)
-					{
-						// 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;
-						}
-					}
-				}
-			}
-			else
-			{
-				if(SV_SendDownloadMessages())
-					timeVal = 1;
-			}
+			if(timeValSV < timeVal)
+				timeVal = timeValSV;
 		}
-
-		if(timeVal == 0)
-			timeVal = 1;
-
-		if(com_busyWait->integer)
-			NET_Sleep(0);
 		else
-			NET_Sleep(timeVal - 1);
-
-		msec = Sys_Milliseconds() - com_frameTime;
+			timeVal = Com_TimeVal(minMsec);
 		
-		if(msec >= minMsec)
-			timeVal = 0;
+		if(com_busyWait->integer || timeVal < 1)
+			NET_Sleep(0);
 		else
-			timeVal = minMsec - msec;
-
-	} while(timeVal > 0);
+			NET_Sleep(timeVal - 1);
+	} while(Com_TimeVal(minMsec));
 	
 	lastTime = com_frameTime;
 	com_frameTime = Com_EventLoop();

Modified: trunk/code/qcommon/net_ip.c
===================================================================
--- trunk/code/qcommon/net_ip.c	2011-07-15 14:49:51 UTC (rev 2082)
+++ trunk/code/qcommon/net_ip.c	2011-07-15 16:51:54 UTC (rev 2083)
@@ -1675,6 +1675,9 @@
 	fd_set fdr;
 	int highestfd = -1, retval;
 
+	if(msec < 0)
+		msec = 0;
+
 	FD_ZERO(&fdr);
 
 	if(ip_socket != INVALID_SOCKET)

Modified: trunk/code/qcommon/qcommon.h
===================================================================
--- trunk/code/qcommon/qcommon.h	2011-07-15 14:49:51 UTC (rev 2082)
+++ trunk/code/qcommon/qcommon.h	2011-07-15 16:51:54 UTC (rev 2083)
@@ -1039,8 +1039,7 @@
 void SV_PacketEvent( netadr_t from, msg_t *msg );
 int SV_FrameMsec(void);
 qboolean SV_GameCommand( void );
-int SV_SendDownloadMessages(void);
-int SV_SendQueuedMessages(void);
+int SV_SendQueuedPackets(void);
 
 //
 // UI interface

Modified: trunk/code/server/server.h
===================================================================
--- trunk/code/server/server.h	2011-07-15 14:49:51 UTC (rev 2082)
+++ trunk/code/server/server.h	2011-07-15 16:51:54 UTC (rev 2083)
@@ -279,6 +279,7 @@
 extern	cvar_t	*sv_serverid;
 extern	cvar_t	*sv_minRate;
 extern	cvar_t	*sv_maxRate;
+extern	cvar_t	*sv_dlRate;
 extern	cvar_t	*sv_minPing;
 extern	cvar_t	*sv_maxPing;
 extern	cvar_t	*sv_gametype;
@@ -355,6 +356,8 @@
 void SV_ClientThink (client_t *cl, usercmd_t *cmd);
 
 int SV_WriteDownloadToClient(client_t *cl , msg_t *msg);
+int SV_SendDownloadMessages(void);
+int SV_SendQueuedMessages(void);
 
 #ifdef USE_VOIP
 void SV_WriteVoipToClient( client_t *cl, msg_t *msg );

Modified: trunk/code/server/sv_init.c
===================================================================
--- trunk/code/server/sv_init.c	2011-07-15 14:49:51 UTC (rev 2082)
+++ trunk/code/server/sv_init.c	2011-07-15 16:51:54 UTC (rev 2083)
@@ -643,6 +643,7 @@
 
 	sv_minRate = Cvar_Get ("sv_minRate", "0", CVAR_ARCHIVE | CVAR_SERVERINFO );
 	sv_maxRate = Cvar_Get ("sv_maxRate", "0", CVAR_ARCHIVE | CVAR_SERVERINFO );
+	sv_dlRate = Cvar_Get("sv_dlRate", "100", CVAR_ARCHIVE | CVAR_SERVERINFO);
 	sv_minPing = Cvar_Get ("sv_minPing", "0", CVAR_ARCHIVE | CVAR_SERVERINFO );
 	sv_maxPing = Cvar_Get ("sv_maxPing", "0", CVAR_ARCHIVE | CVAR_SERVERINFO );
 	sv_floodProtect = Cvar_Get ("sv_floodProtect", "1", CVAR_ARCHIVE | CVAR_SERVERINFO );

Modified: trunk/code/server/sv_main.c
===================================================================
--- trunk/code/server/sv_main.c	2011-07-15 14:49:51 UTC (rev 2082)
+++ trunk/code/server/sv_main.c	2011-07-15 16:51:54 UTC (rev 2083)
@@ -50,6 +50,7 @@
 cvar_t	*sv_serverid;
 cvar_t	*sv_minRate;
 cvar_t	*sv_maxRate;
+cvar_t	*sv_dlRate;
 cvar_t	*sv_minPing;
 cvar_t	*sv_maxPing;
 cvar_t	*sv_gametype;
@@ -1205,3 +1206,83 @@
 	else
 		return rateMsec - rate;
 }
+
+/*
+====================
+SV_SendQueuedPackets
+
+Send download messages and queued packets in the time that we're idle, i.e.
+not computing a server frame or sending client snapshots.
+Return the time in msec until we expect to be called next
+====================
+*/
+
+int SV_SendQueuedPackets()
+{
+	int numBlocks;
+	int dlStart, deltaT, delayT;
+	static int dlNextRound = 0;
+	int timeVal = INT_MAX;
+
+	// Send out fragmented packets now that we're idle
+	delayT = SV_SendQueuedMessages();
+	if(delayT >= 0)
+		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)
+		{
+			if(deltaT < timeVal)
+				timeVal = deltaT + 1;
+		}
+		else
+		{
+			numBlocks = SV_SendDownloadMessages();
+
+			if(numBlocks)
+			{
+				// 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;
+				}
+			}
+		}
+	}
+	else
+	{
+		if(SV_SendDownloadMessages())
+			timeVal = 0;
+	}
+
+	return timeVal;
+}



More information about the quake3-commits mailing list