* Change win32 client Sys_Sleep so it ONLY sleeps since before it was waking on

more or less any input event; fine for the server, not so much use for the
  client
* In the main loop, don't bother sleeping if it's going to be less than 10ms as
  the methods we're using to sleep at the moment aren't very precise
* Add Sys_PlatformInit for platform specific initialisation
* In win32 Sys_PlatformInit force selection of the DirectX SDL backend in order
  to get better fullscreen mouse input (in conjunction with a patched SDL DLL
  http://bugzilla.libsdl.org/show_bug.cgi?id=265)
This commit is contained in:
Tim Angus 2008-08-03 19:42:53 +00:00
parent d13269c5bb
commit 00e790ce00
5 changed files with 47 additions and 2 deletions

View File

@ -2864,7 +2864,14 @@ void Com_Frame( void ) {
msec = minMsec; msec = minMsec;
do { do {
Sys_Sleep( minMsec - msec ); int timeRemaining = minMsec - msec;
// The existing Sys_Sleep implementations aren't really
// precise enough to be of use beyond 100fps
// FIXME: implement a more precise sleep (RDTSC or something)
if( timeRemaining >= 10 )
Sys_Sleep( timeRemaining );
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

@ -47,6 +47,7 @@ unsigned int CON_LogRead( char *out, unsigned int outSize );
char *Sys_StripAppBundle( char *pwd ); char *Sys_StripAppBundle( char *pwd );
#endif #endif
void Sys_PlatformInit( void );
void Sys_SigHandler( int signal ); void Sys_SigHandler( int signal );
void Sys_ErrorDialog( const char *error ); void Sys_ErrorDialog( const char *error );
void Sys_AnsiColorPrint( const char *msg ); void Sys_AnsiColorPrint( const char *msg );

View File

@ -533,6 +533,8 @@ int main( int argc, char **argv )
} }
#endif #endif
Sys_PlatformInit( );
Sys_ParseArgs( argc, argv ); Sys_ParseArgs( argc, argv );
Sys_SetBinaryPath( Sys_Dirname( argv[ 0 ] ) ); Sys_SetBinaryPath( Sys_Dirname( argv[ 0 ] ) );
Sys_SetDefaultInstallPath( DEFAULT_BASEDIR ); Sys_SetDefaultInstallPath( DEFAULT_BASEDIR );

View File

@ -511,3 +511,15 @@ void Sys_ErrorDialog( const char *error )
FS_FCloseFile( f ); FS_FCloseFile( f );
} }
/*
==============
Sys_PlatformInit
Unix specific initialisation
==============
*/
void Sys_PlatformInit( void )
{
// NOP
}

View File

@ -514,7 +514,7 @@ void Sys_FreeFileList( char **list )
============== ==============
Sys_Sleep Sys_Sleep
Block execution for msec or until input is recieved. Block execution for msec or until input is received.
============== ==============
*/ */
void Sys_Sleep( int msec ) void Sys_Sleep( int msec )
@ -522,10 +522,18 @@ void Sys_Sleep( int msec )
if( msec == 0 ) if( msec == 0 )
return; return;
#ifdef DEDICATED
if( msec < 0 ) if( msec < 0 )
WaitForSingleObject( GetStdHandle( STD_INPUT_HANDLE ), INFINITE ); WaitForSingleObject( GetStdHandle( STD_INPUT_HANDLE ), INFINITE );
else else
WaitForSingleObject( GetStdHandle( STD_INPUT_HANDLE ), msec ); WaitForSingleObject( GetStdHandle( STD_INPUT_HANDLE ), msec );
#else
// Client Sys_Sleep doesn't support waiting on stdin
if( msec < 0 )
return;
Sleep( msec );
#endif
} }
/* /*
@ -568,3 +576,18 @@ void Sys_ErrorDialog( const char *error )
} }
} }
} }
/*
==============
Sys_PlatformInit
Windows specific initialisation
==============
*/
void Sys_PlatformInit( void )
{
#ifndef DEDICATED
// Force the DirectX SDL backend to be used
_putenv( "SDL_VIDEODRIVER=directx" );
#endif
}