Re: [AD] Timer patch

[ Thread Index | Date Index | More lists.liballeg.org/allegro-developers Archives ]


On 2008-01-29, Ryan Dickie <goalieca@xxxxxxxxxx> wrote:
> I decided to go ahead and make a timer path for al_current_time() and
> al_rest() to take doubles and return values in seconds. I modified the
> windows timer as well (someone please test it but it should work). The
> examples and demos were also patched. The examples were clean and often
> calculated things like FPS using doubles anyways but i left the demo logic
> using milliseconds and integers so as to not "break" anything.
> 
> --Ryan Dickie

Review follows.  Just some style things I noticed, so I won't have to go
back and fix them myself :)


> Index: demo/src/UFO.cpp
> ===================================================================
> --- demo/src/UFO.cpp	(revision 9954)
> +++ demo/src/UFO.cpp	(working copy)
> @@ -19,10 +19,12 @@
>        p->die();
>        my_play_sample(RES_COLLISION);
>        return false;
> -   }
> +   }
> +   unsigned long cur_time = (unsigned long) (al_current_time() * 1000);

Try not to declare variables in the middle of a function.  Well, it *used* to
be a rule and I think it's best to stick to it.

Is the cast necessary?

>  
> -   if (al_current_time() > (unsigned long)nextShot) {
> -      nextShot = al_current_time() + SHOT_SPEED;
> +
> +   if (cur_time > (unsigned long)nextShot) {

Unnecessary cast?

> +      nextShot = cur_time + SHOT_SPEED;
>        ResourceManager& rm = ResourceManager::getInstance();
>        Player *p = (Player *)rm.getData(RES_PLAYER);
>        float px = p->getX();
> @@ -70,9 +72,10 @@
>     hp = 8;
>     points = 500;
>     ufo = true;
> +
> +   unsigned long cur_time = (unsigned long) (al_current_time() * 1000);
> +   nextShot = cur_time + SHOT_SPEED;

Unnecessary cast?
>  
> -   nextShot = al_current_time() + SHOT_SPEED;
> -
>     ResourceManager& rm = ResourceManager::getInstance();
>     bitmaps[0] = (ALLEGRO_BITMAP *)rm.getData(RES_UFO0);
>     bitmaps[1] = (ALLEGRO_BITMAP *)rm.getData(RES_UFO1);
> Index: demo/src/Player.cpp
> ===================================================================
> --- demo/src/Player.cpp	(revision 9954)
> +++ demo/src/Player.cpp	(working copy)
> @@ -63,9 +63,10 @@
>        default:
>           shotRate = INT_MAX;
>           break;
> -   }
> -   if (((unsigned long)(lastShot+shotRate) < al_current_time()) && input->b1()) {
> -      lastShot = al_current_time();
> +   }
> +   unsigned long cur_time = (unsigned long) (1e3*al_current_time());
> +   if (((unsigned long)(lastShot+shotRate) < cur_time) && input->b1()) {
> +      lastShot = cur_time;
>        float realAngle = -angle;
>        float bx = x + radius * cos(realAngle);
>        float by = y + radius * sin(realAngle);
> @@ -88,7 +89,7 @@
>     }
>  
>     if (input->cheat()) {
> -      al_rest(250);
> +      al_rest(0.250);
>        std::list<Entity *>::iterator it;
>        for (it = entities.begin(); it != entities.end(); it++) {
>           Entity *e = *it;

Ditto.

> Index: demo/src/a5teroids.cpp
> ===================================================================
> --- demo/src/a5teroids.cpp	(revision 9954)
> +++ demo/src/a5teroids.cpp	(working copy)
> @@ -42,7 +42,7 @@
>     for (;;) {
>        player->load();
>  
> -      al_rest(500);
> +      al_rest(0.500);
>  
>        play_sample(title_music, 255, 128, 1000, 1);
>        int choice = do_menu();
> @@ -53,7 +53,7 @@
>        }
>        stop_sample(title_music);
>  
> -      al_rest(250);
> +      al_rest(0.250);
>        lastUFO = -1;
>        canUFO = true;
>  
> @@ -61,7 +61,7 @@
>        play_sample(game_music, 255, 128, 1000, 1);
>  
>        int step = 0;
> -      long start = al_current_time();
> +      long start = (long) (al_current_time()*1e3);

Unnecessary cast?

>  
>        for (;;) {
>           if (entities.size() <= 0) {
> @@ -74,8 +74,8 @@
>           if (!logic(step))
>              break;
>           render(step);
> -         al_rest(10);
> -         long end = al_current_time();
> +         al_rest(0.010);
> +         long end = (long) (al_current_time()*1e3);

Unnecessary cast?

>           step = end - start;
>           start = end;
>        }
> Index: demo/src/GUI.cpp
> ===================================================================
> --- demo/src/GUI.cpp	(revision 9954)
> +++ demo/src/GUI.cpp	(working copy)
> @@ -16,12 +16,12 @@
>        if (ud < 0 && selected) {
>           selected--;
>           my_play_sample(RES_FIRELARGE);
> -         al_rest(200);
> +         al_rest(.200);
>        }
>        else if (ud > 0 && selected < (widgets.size()-1)) {
>           selected++;
>           my_play_sample(RES_FIRELARGE);
> -         al_rest(200);
> +         al_rest(.200);
>        }
>        if (input->b1()) {
>           if (!widgets[selected]->activate())
> @@ -42,7 +42,7 @@
>           widgets[i]->render(i == selected);
>        }
>        al_flip_display();
> -      al_rest(10);
> +      al_rest(.010);
>     }
>  }
>  

Might as well write the initial zeros.

> Index: demo/src/logic.cpp
> ===================================================================
> --- demo/src/logic.cpp	(revision 9954)
> +++ demo/src/logic.cpp	(working copy)
> @@ -9,12 +9,13 @@
>  const int MAX_UFO_TIME = 50000;
>  
>  bool logic(int step)
> -{
> -   if (lastUFO < 0) lastUFO = al_current_time();
> +{
> +   unsigned long cur_time = (unsigned long) (al_current_time() * 1000);

?

> +   if (lastUFO < 0) lastUFO = cur_time;
>  
> -   if (canUFO && (al_current_time() > (unsigned long)(lastUFO+MIN_UFO_TIME))) {
> +   if (canUFO && (cur_time > (unsigned long)(lastUFO+MIN_UFO_TIME))) {
>        int r = rand() % (MAX_UFO_TIME-MIN_UFO_TIME);
> -      if (r <= step || (al_current_time() > (unsigned long)(lastUFO+MAX_UFO_TIME))) {
> +      if (r <= step || (cur_time > (unsigned long)(lastUFO+MAX_UFO_TIME))) {
>           canUFO = false;
>           UFO *ufo;
>           float x, y, dx, dy;

What are those casts for?

> @@ -58,8 +59,9 @@
>     for (it = entities.begin(); it != entities.end(); it++) {
>        Entity *e = *it;
>        if (!e->logic(step)) {
> -         if (e->isUFO()) {
> -            lastUFO = al_current_time();
> +         if (e->isUFO()) {
> +            unsigned long cur_time = (unsigned long) (al_current_time()*1e3);
> +            lastUFO = cur_time;

Ditto.

>              canUFO = true;
>           }
>           delete e;

> Index: src/win/wtime.c
> ===================================================================
> --- src/win/wtime.c	(revision 9954)
> +++ src/win/wtime.c	(working copy)
> @@ -36,10 +36,10 @@
>  
>  
>  
> -unsigned long al_current_time(void)
> +double al_current_time(void)
>  {
>     /* XXX: Maybe use QueryPerformanceCounter? */
> -   return timeGetTime() - _al_win_initial_time;
> +   return ((double) (timeGetTime() - _al_win_initial_time))*1e-3;
>  }

Put spaces around the `*'.

>  
>  
> @@ -47,9 +47,9 @@
>  /* al_rest:
>   *  Rests the specified amount of milliseconds.
>   */
> -void al_rest(long msecs)
> +void al_rest(double seconds)
>  {
> -   ASSERT(msecs >= 0);
> +   ASSERT(seconds >= 0);
>  
> -   Sleep(msecs);
> +   Sleep((DWORD)(seconds*1e3));
>  }

Ditto.  1e3 might as well be 1000.0.

> Index: src/unix/utime.c
> ===================================================================
> --- src/unix/utime.c	(revision 9954)
> +++ src/unix/utime.c	(working copy)
> @@ -17,12 +17,10 @@
>  
>  
>  #include <sys/time.h>
> -#include <sys/select.h>
> -
>  #include "allegro5/altime.h"
> +#include <math.h>
>  
>  
> -
>  /* Marks the time Allegro was initialised, for al_current_time(). */
>  static struct timeval initial_time;
>  

Keep system and internal includes separate.

> @@ -39,17 +37,16 @@
>  
>  
>  /* al_current_time:
> - *  Return the current time, in microseconds, since some arbitrary
> + *  Return the current time, with microsecond resolution, since some arbitrary
>   *  point in time.
>   */
> -unsigned long al_current_time(void)
> +double al_current_time(void)
>  {
> -   struct timeval now;
> -
> -   gettimeofday(&now, NULL);
> -
> -   return ((now.tv_sec  - initial_time.tv_sec)  * 1000 +
> -           (now.tv_usec - initial_time.tv_usec) / 1000);
> +   struct timeval tp;
> +   gettimeofday(&tp, 0); //null = timezone afaik
> +   double time = (double) (tp.tv_sec - initial_time.tv_sec)
> +      + (double) (tp.tv_usec - initial_time.tv_usec) * 1.0e-6;
> +   return time;
>  }
>  
>  
> @@ -57,14 +54,11 @@
>  /* al_rest:
>   *  Make the caller rest for some time.
>   */
> -void al_rest(long msecs)
> +void al_rest(double seconds)
>  {
> -#ifdef ALLEGRO_MACOSX
> -   usleep(msecs * 1000);
> -#else
> -   struct timeval timeout;
> -   timeout.tv_sec = 0;
> -   timeout.tv_usec = msecs * 1000;
> -   select(0, NULL, NULL, NULL, &timeout);
> -#endif
> +   struct timespec tp;
> +   double fsecs = floor(seconds);
> +   tp.tv_sec = (time_t) fsecs;
> +   tp.tv_nsec = (suseconds_t) ((seconds - fsecs) * 1e9);
> +   nanosleep(&tp,0);
>  }

Add a space after the comma.

> Index: include/allegro5/altime.h
> ===================================================================
> --- include/allegro5/altime.h	(revision 9954)
> +++ include/allegro5/altime.h	(working copy)
> @@ -11,17 +11,18 @@
>  
>  
>  /* Function: al_current_time
> - *  Return the number of milliseconds since the Allegro library was
> + *  Return the number of seconds since the Allegro library was
>   *  initialised.  The return value is undefined if Allegro is uninitialised.
> + *  microsecond resolution.
>   */
> -AL_FUNC(unsigned long, al_current_time, (void));
> +AL_FUNC(double, al_current_time, (void));
>  
>  
>  
>  /* Function: al_rest
> - *  Waits for the specified number of milliseconds.
> + *  Waits for the specified number seconds (~1ms accuracy).

number of seconds

~1ms accuracy might be too tight.

>   */
> -AL_FUNC(void, al_rest, (long msecs));
> +AL_FUNC(void, al_rest, (double seconds));
>  
>  
>  
> Index: examples/exnew_mouse_events.c
> ===================================================================
> --- examples/exnew_mouse_events.c	(revision 9954)
> +++ examples/exnew_mouse_events.c	(working copy)
> @@ -50,7 +50,7 @@
>        al_clear(al_map_rgb(0, 0, 0));
>        al_draw_bitmap(cursor, mx, my, 0);
>        al_flip_display();
> -      al_rest(5);
> +      al_rest(5e-3);
>     }
>          while(1);
>  done:
> Index: examples/exnew_bitmap_target.c
> ===================================================================
> --- examples/exnew_bitmap_target.c	(revision 9954)
> +++ examples/exnew_bitmap_target.c	(working copy)
> @@ -38,7 +38,7 @@
>  static void draw(void)
>  {
>     double dt = 0;
> -   double t = al_current_time() / 1000.0;
> +   double t = al_current_time();
>     if (last_time > 0) {
>        dt = t - last_time;
>     }
> @@ -84,7 +84,7 @@
>     dy = 63;
>  
>     int frames = 0;
> -   double start = al_current_time() / 1000.0;
> +   double start = al_current_time();
>     do {
>        /* Check for ESC key or close button event and quit in either case. */
>        if (!al_event_queue_is_empty(queue)) {
> @@ -105,7 +105,7 @@
>           }
>        }
>        draw();
> -      print(0, 0, "FPS: %.1f", frames / (al_current_time() / 1000.0 - start));
> +      print(0, 0, "FPS: %.1f", frames / (al_current_time() - start));
>        if (al_get_new_bitmap_flags() & ALLEGRO_FORCE_LOCKING) {
>           print(0, a5font_text_height(myfont), "using forced bitmap locking");
>        }
> Index: examples/exnew_lockscreen.c
> ===================================================================
> --- examples/exnew_lockscreen.c	(revision 9954)
> +++ examples/exnew_lockscreen.c	(working copy)
> @@ -15,7 +15,7 @@
>          ((char *)locked.data)[i] = (i / locked.pitch) * 255 / 99;
>      al_unlock_bitmap(bitmap);
>      al_flip_display();
> -    al_rest(5000);
> +    al_rest(5.0);
>      return 0;
>  }
>  END_OF_MAIN()
> Index: examples/exnew_fs_resize.c
> ===================================================================
> --- examples/exnew_fs_resize.c	(revision 9954)
> +++ examples/exnew_fs_resize.c	(working copy)
> @@ -28,10 +28,10 @@
>     }
>  
>     redraw(picture);
> -   al_rest(2500);
> +   al_rest(2.5);
>     al_resize_display(800, 600);
>     redraw(picture);
> -   al_rest(2500);
> +   al_rest(2.5);
>  
>     return 0;
>  }
> Index: examples/exnew_bitmap.c
> ===================================================================
> --- examples/exnew_bitmap.c	(revision 9954)
> +++ examples/exnew_bitmap.c	(working copy)
> @@ -15,7 +15,7 @@
>      }
>      al_draw_bitmap(bitmap, 0, 0, 0);
>      al_flip_display();
> -    al_rest(1000);
> +    al_rest(5.0);
>      return 0;
>  }
>  END_OF_MAIN()
> Index: examples/exnew_opengl.c
> ===================================================================
> --- examples/exnew_opengl.c	(revision 9954)
> +++ examples/exnew_opengl.c	(working copy)
> @@ -12,7 +12,7 @@
>  
>  void draw_opengl(void)
>  {
> -   double ms = al_current_time() / 1000.0;
> +   double ms = al_current_time();
>  
>     glMatrixMode(GL_MODELVIEW);
>     glLoadIdentity();
> Index: examples/exnew_icon.c
> ===================================================================
> --- examples/exnew_icon.c	(revision 9954)
> +++ examples/exnew_icon.c	(working copy)
> @@ -32,7 +32,7 @@
>     {
>        al_set_display_icon(i & 1 ? icon2 : icon1);
>        al_flip_display();
> -      al_rest(500);
> +      al_rest(1);

1.0

>     }
>     return 0;
>  }
> Index: examples/exnew_mouse.c
> ===================================================================
> --- examples/exnew_mouse.c	(revision 9954)
> +++ examples/exnew_mouse.c	(working copy)
> @@ -28,7 +28,7 @@
>        al_clear(al_map_rgb(0, 0, 0));
>        al_draw_bitmap(cursor, msestate.x, msestate.y, 0);
>        al_flip_display();
> -      al_rest(5);
> +      al_rest(5e-3);
>     } while (!al_key_down(&kbdstate, ALLEGRO_KEY_ESCAPE)
>        && !msestate.buttons);
>  
> Index: examples/exnew_resize.c
> ===================================================================
> --- examples/exnew_resize.c	(revision 9954)
> +++ examples/exnew_resize.c	(working copy)
> @@ -23,7 +23,7 @@
>      ALLEGRO_EVENT event;
>      ALLEGRO_KEYBOARD *keyboard;
>  
> -    long last_resize;
> +    double last_resize;
>      int rs = 100;
>  
>      /* Initialize Allegro and create an event queue. */
> @@ -59,7 +59,7 @@
>                  break;
>              }
>          }
> -        if (al_current_time() - last_resize > 100)
> +        if (al_current_time() - last_resize > 0.1)
>          {
>              int s;
>              last_resize = al_current_time();
> Index: examples/exnew_blend.c
> ===================================================================
> --- examples/exnew_blend.c	(revision 9954)
> +++ examples/exnew_blend.c	(working copy)
> @@ -174,7 +174,7 @@
>  static void tick(void)
>  {
>     /* Count frames during the last second. */
> -   double t = al_current_time() / 1000.0;
> +   double t = al_current_time();
>     if (t >= ex.last_second + 1) {
>        ex.last_second += 1;
>        ex.fps = ex.frames_accum;
> Index: examples/exnewapi.c
> ===================================================================
> --- examples/exnewapi.c	(revision 9954)
> +++ examples/exnewapi.c	(working copy)
> @@ -17,7 +17,7 @@
>     ALLEGRO_EVENT event;
>     ALLEGRO_EVENT_QUEUE *events;
>     int quit = 0;
> -   int ticks = 0, last_rendered = 0, start_ticks;
> +   double ticks = 0, last_rendered = 0, start_ticks;

0.0

>     int fps_accumulator = 0, fps_time = 0;
>     double fps = 0;
>     int FPS = 500;
> @@ -110,9 +110,9 @@
>     al_draw_line(0, 0, 100, 0, al_map_rgba_f(1, 1, 0, 0.5));
>     al_draw_line(0, 0, 0, 100, al_map_rgba_f(1, 1, 0, 0.5));
>  	
> -   long start = al_current_time();
> -   long last_move = al_current_time();
> -   int frames = 0;
> +   double start = al_current_time();
> +   double last_move = al_current_time();
> +   double frames = 0;

frames as a double?

>  
>     while (!quit) {
>        /* read input */
> @@ -148,7 +148,7 @@
>        }
>  
>        while (last_move < al_current_time()) {
> -         last_move++;
> +         last_move+=1e-3;

Spaces.

>           x += dx;
>           if (x == 0)
>              dx = 1;
> @@ -186,7 +186,7 @@
>        }
>     }
>  
> -   printf("fps=%f\n", (float)(frames * 1000) / (float)(al_current_time()-start));
> +   printf("fps=%f\n", frames / (al_current_time()-start));
>  
>     al_destroy_bitmap(picture);
>     al_destroy_bitmap(mask);
> Index: examples/exnew_membmp.c
> ===================================================================
> --- examples/exnew_membmp.c	(revision 9954)
> +++ examples/exnew_membmp.c	(working copy)
> @@ -36,9 +36,9 @@
>  
>  static void test(ALLEGRO_BITMAP *bitmap, A5FONT_FONT *font, char *message)
>  {
> -	long frames = 0;
> -	long start_time = al_current_time();
> -	int fps = 0;
> +	double frames = 0;

Ditto.

> +	double start_time = al_current_time();
> +	double fps = 0;

0.0

>  
>  	for (;;) {
>  		if (key_down()) {
> @@ -60,15 +60,13 @@
>  
>  		print(font, message, 0, 0);
>  		char second_line[100];
> -		sprintf(second_line, "%d FPS", fps);
> +		sprintf(second_line, "%2f FPS", fps);
>  		print(font, second_line, 0, a5font_text_height(font)+5);
>  
>  		al_flip_display();
>  
>  		frames++;
> -		long now = al_current_time();
> -		long mseconds = now - start_time;
> -		fps = mseconds > 10 ? 1000 * frames / mseconds : 0;
> +		fps = frames / (al_current_time() - start_time);
>  	}
>  }
>  
> Index: examples/exnew_lockbitmap.c
> ===================================================================
> --- examples/exnew_lockbitmap.c	(revision 9954)
> +++ examples/exnew_lockbitmap.c	(working copy)
> @@ -51,7 +51,7 @@
>  
>     al_draw_bitmap(bitmap, 0, 0, 0);
>     al_flip_display();
> -   al_rest(5000);
> +   al_rest(5.0);
>     return 0;
>  }
>  END_OF_MAIN()







Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/