Refresh screen at maximum rate based on timer

This handles window resizes much more smoothly as well.
This commit is contained in:
Josh Holtrop 2025-04-17 16:37:15 -04:00
parent eed5ac7586
commit deed177f55

View File

@ -15,6 +15,7 @@ GLuint program_id;
mat4 view_matrix; mat4 view_matrix;
int window_width; int window_width;
int window_height; int window_height;
private __gshared bool draw_pending;
private void init() private void init()
{ {
@ -90,6 +91,7 @@ private void display(SDL_Window * window)
glDrawElements(GL_TRIANGLE_FAN, 4, GL_UNSIGNED_SHORT, null); glDrawElements(GL_TRIANGLE_FAN, 4, GL_UNSIGNED_SHORT, null);
SDL_GL_SwapWindow(window); SDL_GL_SwapWindow(window);
draw_pending = false;
} }
int main() int main()
@ -124,12 +126,13 @@ int main()
} }
init(); init();
SDL_AddTimer(5, &tick, null);
resize(WIDTH, HEIGHT); resize(WIDTH, HEIGHT);
SDL_Event event; SDL_Event event;
outer: outer:
for (;;) for (;;)
{ {
if (SDL_PollEvent(&event)) if (SDL_WaitEvent(&event))
{ {
switch (event.type) switch (event.type)
{ {
@ -159,8 +162,11 @@ outer:
break; break;
} }
} }
if (draw_pending)
{
display(window); display(window);
} }
}
SDL_GL_DeleteContext(context); SDL_GL_DeleteContext(context);
@ -170,3 +176,16 @@ outer:
return 0; return 0;
} }
private extern(C) uint tick(uint interval, void * param) nothrow
{
if (!draw_pending)
{
/* Draw a new frame every 5 ms if not still drawing the last. */
draw_pending = true;
SDL_Event event;
event.type = SDL_USEREVENT;
SDL_PushEvent(&event);
}
return interval;
}