SDL  2.0
testtimer.c
Go to the documentation of this file.
1 /*
2  Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
3 
4  This software is provided 'as-is', without any express or implied
5  warranty. In no event will the authors be held liable for any damages
6  arising from the use of this software.
7 
8  Permission is granted to anyone to use this software for any purpose,
9  including commercial applications, and to alter it and redistribute it
10  freely.
11 */
12 
13 /* Test program to check the resolution of the SDL timer on the current
14  platform
15 */
16 
17 #include <stdlib.h>
18 #include <stdio.h>
19 
20 #include "SDL.h"
21 
22 #define DEFAULT_RESOLUTION 1
23 
24 static int ticks = 0;
25 
26 static Uint32 SDLCALL
27 ticktock(Uint32 interval, void *param)
28 {
29  ++ticks;
30  return (interval);
31 }
32 
33 static Uint32 SDLCALL
34 callback(Uint32 interval, void *param)
35 {
36  SDL_Log("Timer %d : param = %d\n", interval, (int) (uintptr_t) param);
37  return interval;
38 }
39 
40 int
41 main(int argc, char *argv[])
42 {
43  int i, desired;
44  SDL_TimerID t1, t2, t3;
45  Uint32 start32, now32;
46  Uint64 start, now;
47 
48  /* Enable standard application logging */
50 
51  if (SDL_Init(SDL_INIT_TIMER) < 0) {
52  SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize SDL: %s\n", SDL_GetError());
53  return (1);
54  }
55 
56  /* Start the timer */
57  desired = 0;
58  if (argv[1]) {
59  desired = atoi(argv[1]);
60  }
61  if (desired == 0) {
62  desired = DEFAULT_RESOLUTION;
63  }
64  t1 = SDL_AddTimer(desired, ticktock, NULL);
65 
66  /* Wait 10 seconds */
67  SDL_Log("Waiting 10 seconds\n");
68  SDL_Delay(10 * 1000);
69 
70  /* Stop the timer */
71  SDL_RemoveTimer(t1);
72 
73  /* Print the results */
74  if (ticks) {
75  SDL_Log("Timer resolution: desired = %d ms, actual = %f ms\n",
76  desired, (double) (10 * 1000) / ticks);
77  }
78 
79  /* Test multiple timers */
80  SDL_Log("Testing multiple timers...\n");
81  t1 = SDL_AddTimer(100, callback, (void *) 1);
82  if (!t1)
83  SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,"Could not create timer 1: %s\n", SDL_GetError());
84  t2 = SDL_AddTimer(50, callback, (void *) 2);
85  if (!t2)
86  SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,"Could not create timer 2: %s\n", SDL_GetError());
87  t3 = SDL_AddTimer(233, callback, (void *) 3);
88  if (!t3)
89  SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,"Could not create timer 3: %s\n", SDL_GetError());
90 
91  /* Wait 10 seconds */
92  SDL_Log("Waiting 10 seconds\n");
93  SDL_Delay(10 * 1000);
94 
95  SDL_Log("Removing timer 1 and waiting 5 more seconds\n");
96  SDL_RemoveTimer(t1);
97 
98  SDL_Delay(5 * 1000);
99 
100  SDL_RemoveTimer(t2);
101  SDL_RemoveTimer(t3);
102 
103  start = SDL_GetPerformanceCounter();
104  for (i = 0; i < 1000000; ++i) {
105  ticktock(0, NULL);
106  }
108  SDL_Log("1 million iterations of ticktock took %f ms\n", (double)((now - start)*1000) / SDL_GetPerformanceFrequency());
109 
110  SDL_Log("Performance counter frequency: %"SDL_PRIu64"\n", (unsigned long long) SDL_GetPerformanceFrequency());
111  start32 = SDL_GetTicks();
112  start = SDL_GetPerformanceCounter();
113  SDL_Delay(1000);
115  now32 = SDL_GetTicks();
116  SDL_Log("Delay 1 second = %d ms in ticks, %f ms according to performance counter\n", (now32-start32), (double)((now - start)*1000) / SDL_GetPerformanceFrequency());
117 
118  SDL_Quit();
119  return (0);
120 }
121 
122 /* vi: set ts=4 sw=4 expandtab: */
#define SDL_GetError
static int ticks
Definition: testtimer.c:24
int main(int argc, char *argv[])
Definition: testtimer.c:41
Uint64 SDL_GetPerformanceFrequency(void)
Get the count per second of the high resolution counter.
#define DEFAULT_RESOLUTION
Definition: testtimer.c:22
GLuint start
Definition: SDL_opengl.h:1571
uint32_t Uint32
Definition: SDL_stdinc.h:181
uint64_t Uint64
Definition: SDL_stdinc.h:194
GLuint GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat t1
#define SDL_AddTimer
#define SDL_LogError
#define SDL_Log
Uint32 SDL_GetTicks(void)
Get the number of milliseconds since the SDL library initialization.
#define SDL_Quit
static Uint32 ticktock(Uint32 interval, void *param)
Definition: testtimer.c:27
static Uint32 callback(Uint32 interval, void *param)
Definition: testtimer.c:34
unsigned int uintptr_t
#define SDL_GetPerformanceCounter
#define SDL_Delay
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
Definition: SDL_x11sym.h:50
#define SDL_LogSetPriority
#define NULL
Definition: begin_code.h:164
#define SDL_INIT_TIMER
Definition: SDL.h:76
#define SDL_PRIu64
Definition: SDL_stdinc.h:216
#define SDL_Init
GLfloat param
#define SDLCALL
Definition: SDL_internal.h:45
#define SDL_RemoveTimer
int SDL_TimerID
Definition: SDL_timer.h:86