Отклонения, с которыми вы сталкиваетесь, могут быть вызваны множеством факторов, в том числе планировщиком ОС, который запускается и передает процессор другому процессу или аналогичными проблемами. На самом деле нормальный человек не скажет разницы между временем визуализации 1 и 2 мс. Движущиеся изображения работают с частотой 25 кадров в секунду, что означает, что каждый кадр показывается примерно 40 мс, и он выглядит плавным для человеческого глаза.
Что касается заикания анимации, вы должны изучить, как поддерживать постоянную скорость анимации. Наиболее распространенный подход, который я видел, выглядит примерно так:
while(loop)
{
lastFrameTime; // time it took for last frame to render
timeSinceLastUpdate+= lastFrameTime;
if(timeSinceLastUpdate > (1 second / DESIRED_UPDATES_PER_SECOND))
{
updateAnimation(timeSinceLastUpdate);
timeSinceLastUpdate = 0;
}
// do the drawing
presentScene();
}
Или вы можете просто передать lastFrameTime для обновления анимации в каждом кадре и интерполировать между состояниями анимации. Результат будет еще более плавным.
Если вы уже используете что-то подобное, возможно, вам следует искать виновников в других частях цикла рендеринга. В Direct3D дорогостоящими вещами были вызовы для рисования примитивов и изменения состояний рендеринга, поэтому вы можете проверить их аналоги в OpenGL.