From 00e790ce001c5d96d0c79fa229fb370a5c79fa66 Mon Sep 17 00:00:00 2001 From: Tim Angus Date: Sun, 3 Aug 2008 19:42:53 +0000 Subject: [PATCH] * 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) --- code/qcommon/common.c | 9 ++++++++- code/sys/sys_local.h | 1 + code/sys/sys_main.c | 2 ++ code/sys/sys_unix.c | 12 ++++++++++++ code/sys/sys_win32.c | 25 ++++++++++++++++++++++++- 5 files changed, 47 insertions(+), 2 deletions(-) diff --git a/code/qcommon/common.c b/code/qcommon/common.c index 475d045b..b35d8487 100644 --- a/code/qcommon/common.c +++ b/code/qcommon/common.c @@ -2864,7 +2864,14 @@ void Com_Frame( void ) { msec = minMsec; 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(); if ( lastTime > com_frameTime ) { lastTime = com_frameTime; // possible on first frame diff --git a/code/sys/sys_local.h b/code/sys/sys_local.h index e837b8bc..97a9ad65 100644 --- a/code/sys/sys_local.h +++ b/code/sys/sys_local.h @@ -47,6 +47,7 @@ unsigned int CON_LogRead( char *out, unsigned int outSize ); char *Sys_StripAppBundle( char *pwd ); #endif +void Sys_PlatformInit( void ); void Sys_SigHandler( int signal ); void Sys_ErrorDialog( const char *error ); void Sys_AnsiColorPrint( const char *msg ); diff --git a/code/sys/sys_main.c b/code/sys/sys_main.c index dc846dde..bad8772a 100644 --- a/code/sys/sys_main.c +++ b/code/sys/sys_main.c @@ -533,6 +533,8 @@ int main( int argc, char **argv ) } #endif + Sys_PlatformInit( ); + Sys_ParseArgs( argc, argv ); Sys_SetBinaryPath( Sys_Dirname( argv[ 0 ] ) ); Sys_SetDefaultInstallPath( DEFAULT_BASEDIR ); diff --git a/code/sys/sys_unix.c b/code/sys/sys_unix.c index 40479b9a..13ded33e 100644 --- a/code/sys/sys_unix.c +++ b/code/sys/sys_unix.c @@ -511,3 +511,15 @@ void Sys_ErrorDialog( const char *error ) FS_FCloseFile( f ); } + +/* +============== +Sys_PlatformInit + +Unix specific initialisation +============== +*/ +void Sys_PlatformInit( void ) +{ + // NOP +} diff --git a/code/sys/sys_win32.c b/code/sys/sys_win32.c index fb924e64..79998dc7 100644 --- a/code/sys/sys_win32.c +++ b/code/sys/sys_win32.c @@ -514,7 +514,7 @@ void Sys_FreeFileList( char **list ) ============== 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 ) @@ -522,10 +522,18 @@ void Sys_Sleep( int msec ) if( msec == 0 ) return; +#ifdef DEDICATED if( msec < 0 ) WaitForSingleObject( GetStdHandle( STD_INPUT_HANDLE ), INFINITE ); else 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 +}