|
|
@ -88,6 +88,8 @@ |
|
|
|
|
|
|
|
#if defined __linux || defined(PLATFORM_WEB) |
|
|
|
#include <sys/time.h> // Required for: timespec, nanosleep(), select() - POSIX |
|
|
|
#elif defined __APPLE__ |
|
|
|
#include <unistd.h> // Required for: usleep() |
|
|
|
#endif |
|
|
|
|
|
|
|
#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB) |
|
|
@ -287,7 +289,7 @@ static void InitGraphicsDevice(int width, int height); // Initialize graphics d |
|
|
|
static void SetupFramebufferSize(int displayWidth, int displayHeight); |
|
|
|
static void InitTimer(void); // Initialize timer |
|
|
|
static double GetTime(void); // Returns time since InitTimer() was run |
|
|
|
static void Wait(int ms); // Wait for some milliseconds (stop program execution) |
|
|
|
static void Wait(float ms); // Wait for some milliseconds (stop program execution) |
|
|
|
static bool GetKeyStatus(int key); // Returns if a key has been pressed |
|
|
|
static bool GetMouseButtonStatus(int button); // Returns if a mouse button has been pressed |
|
|
|
static void PollInputEvents(void); // Register user events |
|
|
@ -339,7 +341,7 @@ static void *GamepadThread(void *arg); // Mouse reading thread |
|
|
|
|
|
|
|
#if defined(_WIN32) |
|
|
|
// NOTE: We include Sleep() function signature here to avoid windows.h inclusion |
|
|
|
void __stdcall Sleep(unsigned long msTimeout); // Required for Delay() |
|
|
|
void __stdcall Sleep(unsigned long msTimeout); // Required for Wait() |
|
|
|
#endif |
|
|
|
|
|
|
|
//---------------------------------------------------------------------------------- |
|
|
@ -703,19 +705,19 @@ void EndDrawing(void) |
|
|
|
currentTime = GetTime(); |
|
|
|
drawTime = currentTime - previousTime; |
|
|
|
previousTime = currentTime; |
|
|
|
|
|
|
|
|
|
|
|
frameTime = updateTime + drawTime; |
|
|
|
|
|
|
|
// Wait for some milliseconds... |
|
|
|
if (frameTime < targetTime) |
|
|
|
{ |
|
|
|
Wait((kt">int)((targetTime - frameTime)*i">1000)); |
|
|
|
Wait((targetTime - frameTime)*f">1000.0f); |
|
|
|
|
|
|
|
currentTime = GetTime(); |
|
|
|
double extraTime = currentTime - previousTime; |
|
|
|
previousTime = currentTime; |
|
|
|
|
|
|
|
frameTime = updateTime + drawTime + extraTime; |
|
|
|
frameTime += extraTime; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
@ -851,14 +853,14 @@ void SetTargetFPS(int fps) |
|
|
|
// Returns current FPS |
|
|
|
int GetFPS(void) |
|
|
|
{ |
|
|
|
return (int)n">floorf(1.0f/GetFrameTime()); |
|
|
|
return (int)(1.0f/GetFrameTime()); |
|
|
|
} |
|
|
|
|
|
|
|
// Returns time in seconds for one frame |
|
|
|
float GetFrameTime(void) |
|
|
|
{ |
|
|
|
// NOTE: We round value to milliseconds |
|
|
|
return (n">roundf(frameTime*1000.0)/1000.0f); |
|
|
|
return (kt">float)frameTime; |
|
|
|
} |
|
|
|
|
|
|
|
// Converts Color to float array and normalizes |
|
|
@ -1688,7 +1690,10 @@ static void InitGraphicsDevice(int width, int height) |
|
|
|
#endif |
|
|
|
|
|
|
|
glfwMakeContextCurrent(window); |
|
|
|
glfwSwapInterval(0); // Disable VSync by default |
|
|
|
|
|
|
|
// Try to disable GPU V-Sync by default, set framerate using SetTargetFPS() |
|
|
|
// NOTE: V-Sync can be enabled by graphic driver configuration |
|
|
|
glfwSwapInterval(0); |
|
|
|
|
|
|
|
#if defined(PLATFORM_DESKTOP) |
|
|
|
// Load OpenGL 3.3 extensions |
|
|
@ -1696,9 +1701,8 @@ static void InitGraphicsDevice(int width, int height) |
|
|
|
rlglLoadExtensions(glfwGetProcAddress); |
|
|
|
#endif |
|
|
|
|
|
|
|
// Enables GPU v-sync, so frames are not limited to screen refresh rate (60Hz -> 60 FPS) |
|
|
|
// If not set, swap interval uses GPU v-sync configuration |
|
|
|
// Framerate can be setup using SetTargetFPS() |
|
|
|
// Try to enable GPU V-Sync, so frames are limited to screen refresh rate (60Hz -> 60 FPS) |
|
|
|
// NOTE: V-Sync can be enabled by graphic driver configuration |
|
|
|
if (configFlags & FLAG_VSYNC_HINT) |
|
|
|
{ |
|
|
|
glfwSwapInterval(1); |
|
|
@ -2001,27 +2005,30 @@ static double GetTime(void) |
|
|
|
} |
|
|
|
|
|
|
|
// Wait for some milliseconds (stop program execution) |
|
|
|
static void Wait(int ms) |
|
|
|
{ |
|
|
|
#if defined _WIN32 |
|
|
|
Sleep(ms); |
|
|
|
#elif defined __linux || defined(PLATFORM_WEB) |
|
|
|
struct timespec req = { 0 }; |
|
|
|
time_t sec = (int)(ms/1000); |
|
|
|
ms -= (sec*1000); |
|
|
|
req.tv_sec=sec; |
|
|
|
req.tv_nsec=ms*1000000L; |
|
|
|
|
|
|
|
// NOTE: Use nanosleep() on Unix platforms... usleep() it's deprecated. |
|
|
|
while (nanosleep(&req,&req) == -1) continue; |
|
|
|
//#elif defined __APPLE__ |
|
|
|
// TODO: |
|
|
|
#else |
|
|
|
static void Wait(float ms) |
|
|
|
{ |
|
|
|
#define SUPPORT_BUSY_WAIT_LOOP |
|
|
|
#if defined(SUPPORT_BUSY_WAIT_LOOP) |
|
|
|
double prevTime = GetTime(); |
|
|
|
double nextTime = 0.0; |
|
|
|
|
|
|
|
// Busy wait loop |
|
|
|
while ((nextTime - prevTime) < (double)ms/1000.0) nextTime = GetTime(); |
|
|
|
while ((nextTime - prevTime) < ms/1000.0f) nextTime = GetTime(); |
|
|
|
#else |
|
|
|
#if defined _WIN32 |
|
|
|
Sleep(ms); |
|
|
|
#elif defined __linux || defined(PLATFORM_WEB) |
|
|
|
struct timespec req = { 0 }; |
|
|
|
time_t sec = (int)(ms/1000.0f); |
|
|
|
ms -= (sec*1000); |
|
|
|
req.tv_sec = sec; |
|
|
|
req.tv_nsec = ms*1000000L; |
|
|
|
|
|
|
|
// NOTE: Use nanosleep() on Unix platforms... usleep() it's deprecated. |
|
|
|
while (nanosleep(&req, &req) == -1) continue; |
|
|
|
#elif defined __APPLE__ |
|
|
|
usleep(ms*1000.0f); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|