Вместо того, чтобы полагаться на неточное поведение сна или функции таймера для конкретной платформы (которые могут хорошо работать, я не знаю), вы можете структурировать это как игровой цикл.
Внутри цикла вы вызываете функцию, чтобы узнать текущее время. Вы выясняете, сколько времени прошло с тех пор, как вы нарисовали последний кадр, и решаете, когда визуализировать следующий кадр самостоятельно, в нужное время. Во время разработки вы должны измерить фактическое количество кадров в секунду и отобразить его.
При таком подходе ваш код становится кроссплатформенным и более точным. Кроме того, ваш цикл контролирует, а не структурирует ваш код как обратные вызовы таймера, которые вы также можете предпочесть.
Недостатком является то, что цикл «занятого ожидания» означает, что ваш процесс будет использовать ЦП все время без необходимости. Чтобы уменьшить это, вы можете снизить нагрузку на процессор в цикле, явно закачивая события пользовательского интерфейса некоторым образом или, возможно, используя более короткий сон :-)
Если вы хотите узнать больше об этом подходе, тогда начните поискать материалы по игровым циклам.
Вот несколько важных ссылок:
http://www.koonsolo.com/news/dewitters-gameloop/
http://gafferongames.com/game-physics/fix-your-timestep/
И обсуждение SO:
https://gamedev.stackexchange.com/questions/1589/fixed-time-step-vs-variable-time-step