* Use Sys_Sleep to limit FPS, which will save CPU

* Add com_maxfpsUnfocused and com_maxfpsMinimized; self explanatory
* Fix reopening of bug 3703, I hope
This commit is contained in:
Tim Angus 2008-07-21 22:02:54 +00:00
parent 4ceb51e6ba
commit 0124371c01
7 changed files with 39 additions and 53 deletions

10
README
View file

@ -116,7 +116,7 @@ New cvars
s_alRolloff - the value of AL_ROLLOFF_FACTOR for each s_alRolloff - the value of AL_ROLLOFF_FACTOR for each
source source
s_alGraceDistance - after having passed MaxDistance, length s_alGraceDistance - after having passed MaxDistance, length
until sounds are completely inaudible. until sounds are completely inaudible
s_alDriver - which OpenAL library to use s_alDriver - which OpenAL library to use
s_alDevice - which OpenAL device to use s_alDevice - which OpenAL device to use
s_alAvailableDevices - list of available OpenAL devices s_alAvailableDevices - list of available OpenAL devices
@ -129,7 +129,9 @@ New cvars
com_ansiColor - enable use of ANSI escape codes in the tty com_ansiColor - enable use of ANSI escape codes in the tty
com_altivec - enable use of altivec on PowerPC systems com_altivec - enable use of altivec on PowerPC systems
com_standalone - Run in standalone mode. com_standalone - Run in standalone mode
com_maxfpsUnfocused - Maximum frames per second when unfocused
com_maxfpsMinimized - Maximum frames per second when minimized
s_backend - read only, indicates the current sound s_backend - read only, indicates the current sound
backend backend
s_muteWhenMinimized - mute sound when minimized s_muteWhenMinimized - mute sound when minimized
@ -165,13 +167,13 @@ New cvars
just add 3 to the value for the wanted just add 3 to the value for the wanted
color combination. For red-blue and color combination. For red-blue and
red-green you probably want to enable red-green you probably want to enable
r_greyscale. r_greyscale
r_stereoSeparation - Control eye separation. Resulting r_stereoSeparation - Control eye separation. Resulting
separation is r_zProj divided by this separation is r_zProj divided by this
value in quake3 standard units. value in quake3 standard units.
See also See also
http://wiki.ioquake3.org/Stereo_Rendering http://wiki.ioquake3.org/Stereo_Rendering
for more information. for more information
New commands New commands
video [filename] - start video capture (use with demo command) video [filename] - start video capture (use with demo command)

View file

@ -81,7 +81,9 @@ cvar_t *sv_packetdelay;
cvar_t *com_cameraMode; cvar_t *com_cameraMode;
cvar_t *com_ansiColor; cvar_t *com_ansiColor;
cvar_t *com_unfocused; cvar_t *com_unfocused;
cvar_t *com_maxfpsUnfocused;
cvar_t *com_minimized; cvar_t *com_minimized;
cvar_t *com_maxfpsMinimized;
cvar_t *com_standalone; cvar_t *com_standalone;
// com_speeds times // com_speeds times
@ -2604,7 +2606,9 @@ void Com_Init( char *commandLine ) {
com_ansiColor = Cvar_Get( "com_ansiColor", "0", CVAR_ARCHIVE ); com_ansiColor = Cvar_Get( "com_ansiColor", "0", CVAR_ARCHIVE );
com_unfocused = Cvar_Get( "com_unfocused", "0", CVAR_ROM ); com_unfocused = Cvar_Get( "com_unfocused", "0", CVAR_ROM );
com_maxfpsUnfocused = Cvar_Get( "com_maxfpsUnfocused", "0", CVAR_ARCHIVE );
com_minimized = Cvar_Get( "com_minimized", "0", CVAR_ROM ); com_minimized = Cvar_Get( "com_minimized", "0", CVAR_ROM );
com_maxfpsMinimized = Cvar_Get( "com_maxfpsMinimized", "0", CVAR_ARCHIVE );
com_standalone = Cvar_Get( "com_standalone", "0", CVAR_INIT ); com_standalone = Cvar_Get( "com_standalone", "0", CVAR_INIT );
com_introPlayed = Cvar_Get( "com_introplayed", "0", CVAR_ARCHIVE); com_introPlayed = Cvar_Get( "com_introplayed", "0", CVAR_ARCHIVE);
@ -2844,12 +2848,23 @@ void Com_Frame( void ) {
} }
// we may want to spin here if things are going too fast // we may want to spin here if things are going too fast
if ( !com_dedicated->integer && com_maxfps->integer > 0 && !com_timedemo->integer ) { if ( !com_dedicated->integer && !com_timedemo->integer ) {
minMsec = 1000 / com_maxfps->integer; if( com_minimized->integer && com_maxfpsMinimized->integer ) {
minMsec = 1000 / com_maxfpsMinimized->integer;
} else if( com_unfocused->integer && com_maxfpsUnfocused->integer ) {
minMsec = 1000 / com_maxfpsUnfocused->integer;
} else if( com_maxfps->integer ) {
minMsec = 1000 / com_maxfps->integer;
} else {
minMsec = 1;
}
} else { } else {
minMsec = 1; minMsec = 1;
} }
msec = minMsec;
do { do {
Sys_Sleep( minMsec - msec );
com_frameTime = Com_EventLoop(); com_frameTime = Com_EventLoop();
if ( lastTime > com_frameTime ) { if ( lastTime > com_frameTime ) {
lastTime = com_frameTime; // possible on first frame lastTime = com_frameTime; // possible on first frame

View file

@ -803,7 +803,9 @@ extern cvar_t *com_journal;
extern cvar_t *com_cameraMode; extern cvar_t *com_cameraMode;
extern cvar_t *com_ansiColor; extern cvar_t *com_ansiColor;
extern cvar_t *com_unfocused; extern cvar_t *com_unfocused;
extern cvar_t *com_maxfpsUnfocused;
extern cvar_t *com_minimized; extern cvar_t *com_minimized;
extern cvar_t *com_maxfpsMinimized;
extern cvar_t *com_altivec; extern cvar_t *com_altivec;
// both client and server must agree to pause // both client and server must agree to pause

View file

@ -348,7 +348,7 @@ static void IN_DeactivateMouse( void )
if( mouseActive ) if( mouseActive )
{ {
SDL_WM_GrabInput( SDL_GRAB_OFF ); SDL_WM_GrabInput( SDL_GRAB_OFF );
SDL_WarpMouse( glConfig.vidWidth >> 1, glConfig.vidHeight >> 1 ); SDL_WarpMouse( glConfig.vidWidth / 2, glConfig.vidHeight / 2 );
SDL_ShowCursor( 1 ); SDL_ShowCursor( 1 );
mouseActive = qfalse; mouseActive = qfalse;
@ -716,15 +716,6 @@ static void IN_ProcessEvents( void )
} }
break; break;
case SDL_ACTIVEEVENT:
if( e.active.state == SDL_APPINPUTFOCUS ) {
if( e.active.gain )
IN_ActivateMouse();
else
IN_DeactivateMouse();
}
break;
case SDL_QUIT: case SDL_QUIT:
Sys_Quit(); Sys_Quit();
break; break;

View file

@ -439,42 +439,6 @@ void *Sys_LoadDll( const char *name, char *fqpath ,
return libHandle; return libHandle;
} }
/*
=================
Sys_Idle
=================
*/
static void Sys_Idle( void )
{
#ifndef DEDICATED
int appState = SDL_GetAppState( );
int sleep = 0;
// If we have no input focus at all, sleep a bit
if( !( appState & ( SDL_APPMOUSEFOCUS | SDL_APPINPUTFOCUS ) ) )
{
Cvar_SetValue( "com_unfocused", 1 );
sleep += 16;
}
else
Cvar_SetValue( "com_unfocused", 0 );
// If we're minimised, sleep a bit more
if( !( appState & SDL_APPACTIVE ) )
{
Cvar_SetValue( "com_minimized", 1 );
sleep += 32;
}
else
Cvar_SetValue( "com_minimized", 0 );
if( !com_dedicated->integer && sleep )
SDL_Delay( sleep );
#else
// Dedicated server idles via NET_Sleep
#endif
}
/* /*
================= =================
Sys_ParseArgs Sys_ParseArgs
@ -602,7 +566,13 @@ int main( int argc, char **argv )
while( 1 ) while( 1 )
{ {
Sys_Idle( ); #ifndef DEDICATED
int appState = SDL_GetAppState( );
Cvar_SetValue( "com_unfocused", !( appState & SDL_APPINPUTFOCUS ) );
Cvar_SetValue( "com_minimized", !( appState & SDL_APPACTIVE ) );
#endif
IN_Frame( ); IN_Frame( );
Com_Frame( ); Com_Frame( );
} }

View file

@ -463,6 +463,9 @@ void Sys_Sleep( int msec )
{ {
fd_set fdset; fd_set fdset;
if( msec == 0 )
return;
FD_ZERO(&fdset); FD_ZERO(&fdset);
FD_SET(fileno(stdin), &fdset); FD_SET(fileno(stdin), &fdset);
if( msec < 0 ) if( msec < 0 )

View file

@ -519,6 +519,9 @@ Block execution for msec or until input is recieved.
*/ */
void Sys_Sleep( int msec ) void Sys_Sleep( int msec )
{ {
if( msec == 0 )
return;
if( msec < 0 ) if( msec < 0 )
WaitForSingleObject( GetStdHandle( STD_INPUT_HANDLE ), INFINITE ); WaitForSingleObject( GetStdHandle( STD_INPUT_HANDLE ), INFINITE );
else else