Таймер Windows Forms ограничен по разрешению стандартным разрешением системных часов вашего компьютера. Это варьируется от компьютера к компьютеру, но обычно составляет от 1 мс до 20 мс.
В WinForms, когда вы запрашиваете интервал таймера в коде, Windows гарантирует, что ваш таймер будет вызываться не чаще , чем указанное количество миллисекунд. Это не гарантирует, что ваш таймер будет вызываться именно в указанные вами миллисекунды.
Это потому, что Windows является ОС с разделением времени, а не в режиме реального времени. Другие процессы и потоки будут запланированы для одновременной работы, и поэтому ваш поток будет вынужден регулярно ожидать использования процессора. Поэтому вам не следует писать код таймера WinForms, который использует точные интервалы или задержки в миллисекундах.
В вашей ситуации установка интервала в 1 мс на самом деле просто говорит Windows, чтобы запускать этот таймер так часто, как это возможно. Как вы видели, это определенно гораздо реже, чем 1 мс (60 кадр / с = около 17 мс).
Если вам нужен более точный таймер с более высоким разрешением, Windows API предоставляет таймеры с высоким разрешением / производительностью, если ваше оборудование его поддерживает, см. Как использовать таймер с высоким разрешением . Недостатком этого является то, что использование ЦП вашего приложения будет увеличено для поддержки более высокой производительности.
В целом, я думаю, вам лучше реализовать аппаратно-системный игровой цикл. Таким образом, воспринимаемая анимация вашей сцены выглядит постоянной независимо от фактической достигнутой частоты кадров. Для получения дополнительной информации эти статьи дают хороший фон.