SDL_framerate.cpp 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. /*
  2. SDL_framerate: framerate manager
  3. LGPL (c) A. Schiffler
  4. */
  5. #include "stdafx.h"
  6. #include "SDL_framerate.h"
  7. /*
  8. Initialize the framerate manager
  9. */
  10. void SDL_initFramerate(FPSmanager * manager)
  11. {
  12. /*
  13. * Store some sane values
  14. */
  15. manager->framecount = 0;
  16. manager->rate = FPS_DEFAULT;
  17. manager->rateticks = (1000.0 / (float) FPS_DEFAULT);
  18. manager->lastticks = SDL_GetTicks();
  19. }
  20. /*
  21. Set the framerate in Hz
  22. */
  23. int SDL_setFramerate(FPSmanager * manager, int rate)
  24. {
  25. if ((rate >= FPS_LOWER_LIMIT) && (rate <= FPS_UPPER_LIMIT)) {
  26. manager->framecount = 0;
  27. manager->rate = rate;
  28. manager->rateticks = (1000.0 / (float) rate);
  29. return (0);
  30. } else {
  31. return (-1);
  32. }
  33. }
  34. /*
  35. Return the current target framerate in Hz
  36. */
  37. int SDL_getFramerate(FPSmanager * manager)
  38. {
  39. if (manager == NULL) {
  40. return (-1);
  41. } else {
  42. return (manager->rate);
  43. }
  44. }
  45. /*
  46. Delay execution to maintain a constant framerate. Calculate fps.
  47. */
  48. void SDL_framerateDelay(FPSmanager * manager)
  49. {
  50. Uint32 current_ticks;
  51. Uint32 target_ticks;
  52. Uint32 the_delay;
  53. /*
  54. * Next frame
  55. */
  56. manager->framecount++;
  57. /*
  58. * Get/calc ticks
  59. */
  60. current_ticks = SDL_GetTicks();
  61. target_ticks = manager->lastticks + (Uint32) ((float) manager->framecount * manager->rateticks);
  62. if (current_ticks <= target_ticks) {
  63. the_delay = target_ticks - current_ticks;
  64. SDL_Delay(the_delay);
  65. } else {
  66. manager->framecount = 0;
  67. manager->lastticks = SDL_GetTicks();
  68. }
  69. }