Added high resolution timing API: SDL_GetPerformanceCounter(), SDL_GetPerformanceFrequency()
This commit is contained in:
parent
98e5ddb37d
commit
85ad17e7d6
8 changed files with 127 additions and 1 deletions
|
@ -47,6 +47,16 @@ extern "C" {
|
||||||
*/
|
*/
|
||||||
extern DECLSPEC Uint32 SDLCALL SDL_GetTicks(void);
|
extern DECLSPEC Uint32 SDLCALL SDL_GetTicks(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Get the current value of the high resolution counter
|
||||||
|
*/
|
||||||
|
extern DECLSPEC Uint64 SDLCALL SDL_GetPerformanceCounter(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Get the count per second of the high resolution counter
|
||||||
|
*/
|
||||||
|
extern DECLSPEC Uint64 SDLCALL SDL_GetPerformanceFrequency(void);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Wait a specified number of milliseconds before returning.
|
* \brief Wait a specified number of milliseconds before returning.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -42,6 +42,18 @@ SDL_GetTicks(void)
|
||||||
return ((system_time() - start) / 1000);
|
return ((system_time() - start) / 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Uint64
|
||||||
|
SDL_GetPerformanceCounter(void)
|
||||||
|
{
|
||||||
|
return system_time();
|
||||||
|
}
|
||||||
|
|
||||||
|
Uint64
|
||||||
|
SDL_GetPerformanceFrequency(void)
|
||||||
|
{
|
||||||
|
return 1000000;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
SDL_Delay(Uint32 ms)
|
SDL_Delay(Uint32 ms)
|
||||||
{
|
{
|
||||||
|
|
|
@ -37,6 +37,18 @@ SDL_GetTicks(void)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Uint64
|
||||||
|
SDL_GetPerformanceCounter(void)
|
||||||
|
{
|
||||||
|
return SDL_GetTicks();
|
||||||
|
}
|
||||||
|
|
||||||
|
Uint64
|
||||||
|
SDL_GetPerformanceFrequency(void)
|
||||||
|
{
|
||||||
|
return 1000;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
SDL_Delay(Uint32 ms)
|
SDL_Delay(Uint32 ms)
|
||||||
{
|
{
|
||||||
|
|
|
@ -52,6 +52,18 @@ SDL_GetTicks(void)
|
||||||
return timer_ticks;
|
return timer_ticks;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Uint64
|
||||||
|
SDL_GetPerformanceCounter(void)
|
||||||
|
{
|
||||||
|
return SDL_GetTicks();
|
||||||
|
}
|
||||||
|
|
||||||
|
Uint64
|
||||||
|
SDL_GetPerformanceFrequency(void)
|
||||||
|
{
|
||||||
|
return 1000;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
SDL_Delay(Uint32 ms)
|
SDL_Delay(Uint32 ms)
|
||||||
{
|
{
|
||||||
|
|
|
@ -64,6 +64,7 @@ SDL_GetTicks(void)
|
||||||
#if HAVE_CLOCK_GETTIME
|
#if HAVE_CLOCK_GETTIME
|
||||||
Uint32 ticks;
|
Uint32 ticks;
|
||||||
struct timespec now;
|
struct timespec now;
|
||||||
|
|
||||||
clock_gettime(CLOCK_MONOTONIC, &now);
|
clock_gettime(CLOCK_MONOTONIC, &now);
|
||||||
ticks =
|
ticks =
|
||||||
(now.tv_sec - start.tv_sec) * 1000 + (now.tv_nsec -
|
(now.tv_sec - start.tv_sec) * 1000 + (now.tv_nsec -
|
||||||
|
@ -72,6 +73,7 @@ SDL_GetTicks(void)
|
||||||
#else
|
#else
|
||||||
Uint32 ticks;
|
Uint32 ticks;
|
||||||
struct timeval now;
|
struct timeval now;
|
||||||
|
|
||||||
gettimeofday(&now, NULL);
|
gettimeofday(&now, NULL);
|
||||||
ticks =
|
ticks =
|
||||||
(now.tv_sec - start.tv_sec) * 1000 + (now.tv_usec -
|
(now.tv_sec - start.tv_sec) * 1000 + (now.tv_usec -
|
||||||
|
@ -80,6 +82,40 @@ SDL_GetTicks(void)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Uint64
|
||||||
|
SDL_GetPerformanceCounter(void)
|
||||||
|
{
|
||||||
|
#if HAVE_CLOCK_GETTIME
|
||||||
|
Uint64 ticks;
|
||||||
|
struct timespec now;
|
||||||
|
|
||||||
|
clock_gettime(CLOCK_MONOTONIC, &now);
|
||||||
|
ticks = now.tv_sec;
|
||||||
|
ticks *= 1000000000;
|
||||||
|
ticks += now.tv_nsec;
|
||||||
|
return (ticks);
|
||||||
|
#else
|
||||||
|
Uint64 ticks;
|
||||||
|
struct timeval now;
|
||||||
|
|
||||||
|
gettimeofday(&now, NULL);
|
||||||
|
ticks = now.tv_sec;
|
||||||
|
ticks *= 1000000;
|
||||||
|
ticks += now.tv_usec;
|
||||||
|
return (ticks);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
Uint64
|
||||||
|
SDL_GetPerformanceFrequency(void)
|
||||||
|
{
|
||||||
|
#if HAVE_CLOCK_GETTIME
|
||||||
|
return 1000000000;
|
||||||
|
#else
|
||||||
|
return 1000000;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
SDL_Delay(Uint32 ms)
|
SDL_Delay(Uint32 ms)
|
||||||
{
|
{
|
||||||
|
|
|
@ -87,6 +87,18 @@ SDL_GetTicks()
|
||||||
return ((Uint32) wce_rel_ticks());
|
return ((Uint32) wce_rel_ticks());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Uint64
|
||||||
|
SDL_GetPerformanceCounter(void)
|
||||||
|
{
|
||||||
|
return SDL_GetTicks();
|
||||||
|
}
|
||||||
|
|
||||||
|
Uint64
|
||||||
|
SDL_GetPerformanceFrequency(void)
|
||||||
|
{
|
||||||
|
return 1000;
|
||||||
|
}
|
||||||
|
|
||||||
/* Give up approx. givem milliseconds to the OS. */
|
/* Give up approx. givem milliseconds to the OS. */
|
||||||
void
|
void
|
||||||
SDL_Delay(Uint32 ms)
|
SDL_Delay(Uint32 ms)
|
||||||
|
|
|
@ -99,6 +99,28 @@ SDL_GetTicks(void)
|
||||||
return (ticks);
|
return (ticks);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Uint64
|
||||||
|
SDL_GetPerformanceCounter(void)
|
||||||
|
{
|
||||||
|
LARGE_INTEGER counter;
|
||||||
|
|
||||||
|
if (!QueryPerformanceCounter(&counter)) {
|
||||||
|
return SDL_GetTicks();
|
||||||
|
}
|
||||||
|
return counter.QuadPart;
|
||||||
|
}
|
||||||
|
|
||||||
|
Uint64
|
||||||
|
SDL_GetPerformanceFrequency(void)
|
||||||
|
{
|
||||||
|
LARGE_INTEGER frequency;
|
||||||
|
|
||||||
|
if (!QueryPerformanceFrequency(&frequency)) {
|
||||||
|
return 1000;
|
||||||
|
}
|
||||||
|
return frequency.QuadPart;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
SDL_Delay(Uint32 ms)
|
SDL_Delay(Uint32 ms)
|
||||||
{
|
{
|
||||||
|
|
|
@ -29,8 +29,9 @@ callback(Uint32 interval, void *param)
|
||||||
int
|
int
|
||||||
main(int argc, char *argv[])
|
main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
int desired;
|
int i, desired;
|
||||||
SDL_TimerID t1, t2, t3;
|
SDL_TimerID t1, t2, t3;
|
||||||
|
Uint64 start, now;
|
||||||
|
|
||||||
if (SDL_Init(SDL_INIT_TIMER) < 0) {
|
if (SDL_Init(SDL_INIT_TIMER) < 0) {
|
||||||
fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError());
|
fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError());
|
||||||
|
@ -85,6 +86,15 @@ main(int argc, char *argv[])
|
||||||
SDL_RemoveTimer(t2);
|
SDL_RemoveTimer(t2);
|
||||||
SDL_RemoveTimer(t3);
|
SDL_RemoveTimer(t3);
|
||||||
|
|
||||||
|
start = SDL_GetPerformanceCounter();
|
||||||
|
for (i = 0; i < 1000000; ++i) {
|
||||||
|
ticktock(0);
|
||||||
|
}
|
||||||
|
now = SDL_GetPerformanceCounter();
|
||||||
|
printf("1 million iterations of ticktock took %f ms\n", (double)((now - start)*1000) / SDL_GetPerformanceFrequency());
|
||||||
|
|
||||||
SDL_Quit();
|
SDL_Quit();
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* vi: set ts=4 sw=4 expandtab: */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue