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 <[EMAIL PROTECTED]> 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); > } > > >