I know this is old but I DO have something to contribute.
In YEARS of discussing this bit (sometimes heatedly) with fellow coders, I found out that the best thing to have is:
-fixed logic rate, to gauge minimum object size and max speed, thus making sure no object will ever go RIGHT THROUGH another.
-decoupled vsynched graphic updates, for maximum smoothness
-interpolated animation: this is key. Without this, you better couple logic with the graphics update rate or it'll look strangely jerky.
But you all knew this. Now comes my contribution:
I also spent a long time fighting timer issues, because the timer I was using (SDL) has a really crappy resolution (10ms!!)
So with that low low resolution, animations and general game logic used to jump around a lot. First approach was to average over a number of frames, then the game would go smoothly over that number of frames and then jump to the new framerate, so that's no good either.
The next approach is really good and gave me solid animation with a crappy timer:
-Keep a circular buffer, save the the timedelta in a new cell and move the head in each update, average all stored timedeltas and return that.
TADA! high-precision non-jumping timer feeding from any timer, crappy or not. That added to the (already in Construct) minimum FPS makes for a SOLID and smooth logic.
Suggestion? Could specify the size of this circular array in application properties Larger takes longer to adapt to FPS changes, smaller could be jerkier. I kept using 10 to 20 cells and that was enough (remember, I had 10ms resolution!).