From 13ccfb3728eb3dc3a6a5294a8f8754b3c5cbc903 Mon Sep 17 00:00:00 2001 From: Sam Anthony Date: Sat, 2 Nov 2024 19:36:40 -0400 Subject: frame pacing --- balls.c | 29 +++++++++++++++++++++++++---- balls.cl | 4 ++-- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/balls.c b/balls.c index 8d85a89..384f7c1 100644 --- a/balls.c +++ b/balls.c @@ -28,7 +28,13 @@ #define RMAX 0.10 /* Maximum radius. */ #define VMAX_INIT 0.05 /* Maximum initial velocity. */ -enum { WIDTH = 640, HEIGHT = 480 }; +enum { + WIDTH = 640, + HEIGHT = 640, + FPS = 60, + MS_PER_S = 1000, + FRAME_TIME_MS = MS_PER_S / FPS, + }; enum { KEY_QUIT = 'q' }; enum { NBALLS_DEFAULT = 3 }; enum { @@ -49,6 +55,7 @@ void genVertexBuffer(void); void setColors(void); void configSharedData(void); void setKernelArgs(void); +void animate(int v); void display(void); void reshape(int w, int h); void keyboard(unsigned char key, int x, int y); @@ -102,6 +109,7 @@ main(int argc, char *argv[]) { glutDisplayFunc(display); glutReshapeFunc(reshape); glutKeyboardFunc(keyboard); + glutTimerFunc(0, animate, 0); glutMainLoop(); @@ -397,13 +405,27 @@ setKernelArgs(void) { } void -display(void) { - int i; +animate(int v) { + clock_t tstart, elapsed; + unsigned int nextFrame; + + tstart = clock(); move(); collideBalls(); collideWalls(); + display(); + + elapsed = (clock() - tstart) / (CLOCKS_PER_SEC / MS_PER_S); + nextFrame = (elapsed > FRAME_TIME_MS) ? 0 : FRAME_TIME_MS-elapsed; + glutTimerFunc(nextFrame, animate, 0); +} + +void +display(void) { + int i; + glClear(GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT); genVertices(); @@ -416,7 +438,6 @@ display(void) { frameCount(); glutSwapBuffers(); - glutPostRedisplay(); } void diff --git a/balls.cl b/balls.cl index 6d015fb..05d155c 100644 --- a/balls.cl +++ b/balls.cl @@ -1,5 +1,5 @@ -#define G_FACTOR 3600.0f -#define G (9.81f / G_FACTOR) +#define FPS 60.0f +#define G (9.81f / FPS / FPS) #define DENSITY 1500.0f float mass(float radius); -- cgit v1.2.3