[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

Re: [pygame] BUG: pygame.time tick()?



hi,

was there an idea for a fix for this bug?

Would it be only passing max(max_desired_sleep, length_to_sleep) to
the delay function?

That would at least limit any error.


cheers,




On Sat, Jun 28, 2008 at 6:16 AM, Brian Fisher <brian@xxxxxxxxxxxxxxxxxxx> wrote:
> It's not true that the relevant source is in SDL - clock.tick does call
> SDL_Delay, but all SDL_Delay takes a number of ticks to sleep, and then just
> sleeps that long. It's pygame source that is deciding how long to
> sleep/wait.
>
> ... also no need to guess at the source, you can get at it from the web,
> even:
> http://www.seul.org/viewcvs/viewcvs.cgi/trunk/src/time.c?rev=1240&root=PyGame&view=auto
>
> Basically, I think this could be fixed in pygame source without an SDL
> change, just by putting a max on how long to wait in clock tick - and that
> delay could be maxed out at the framerate (surely you never would wait
> longer than 100ms to regulate a 10fps timer, right?)
>
> here's the relevant source (accurate_delay is passed in as 0, and the
> framerate arg is what was passed to tick):
> ----------------------------
>
> // to be called by the other tick functions.
> static PyObject*
>
> clock_tick_base(PyObject* self, PyObject* arg, int use_accurate_delay)
> {
>     PyClockObject* _clock = (PyClockObject*) self;
>     float framerate = 0.0f;
>     int nowtime;
>
>     if (!PyArg_ParseTuple (arg, "|f", &framerate))
>
>         return NULL;
>
>     if (framerate)
>     {
>         int delay, endtime = (int) ((1.0f / framerate) * 1000.0f);
>         _clock->rawpassed = SDL_GetTicks () - _clock->last_tick;
>         delay = endtime - _clock->rawpassed;
>
>
>         /*just doublecheck that timer is initialized*/
>         if (!SDL_WasInit (SDL_INIT_TIMER))
>         {
>             if (SDL_InitSubSystem (SDL_INIT_TIMER))
>             {
>                 RAISE (PyExc_SDLError, SDL_GetError ());
>
>                 return NULL;
>             }
>         }
>
>         if (use_accurate_delay)
>             delay = accurate_delay (delay);
>         else
>         {
>             // this uses sdls delay, which can be inaccurate.
>
>             if (delay < 0)
>                 delay = 0;
>
>             Py_BEGIN_ALLOW_THREADS;
>             SDL_Delay ((Uint32) delay);
>             Py_END_ALLOW_THREADS;
>         }
>
>         if (delay == -1)
>
>             return NULL;
>     }
>
>     nowtime = SDL_GetTicks ();
>     _clock->timepassed = nowtime - _clock->last_tick;
>     _clock->fps_count += 1;
>     _clock->last_tick = nowtime;
>     if (!framerate)
>
>         _clock->rawpassed = _clock->timepassed;
>
>     if (!_clock->fps_tick)
>     {
>         _clock->fps_count = 0;
>         _clock->fps_tick = nowtime;
>     }
>     else if (_clock->fps_count >= 10)
>
>     {
>         _clock->fps = _clock->fps_count /
>             ((nowtime - _clock->fps_tick) / 1000.0f);
>         _clock->fps_count = 0;
>         _clock->fps_tick = nowtime;
>         Py_XDECREF (_clock->rendered);
>
>     }
>     return PyInt_FromLong (_clock->timepassed);
> }
>
>
>