El Windows Forms Timer tiene, en última instancia, una resolución limitada a la resolución del reloj del sistema estándar de su computadora. Esto varía de una computadora a otra, pero generalmente es de entre 1 ms y 20 ms.
En WinForms, cada vez que solicite un intervalo de tiempo en el código, Windows solo garantiza que su temporizador se llamará a menudo y luego el número de milisegundos especificado. No garantiza que se llame a su temporizador exactamente en los milisegundos que especifique.
Esto se debe a que Windows es un sistema operativo de tiempo compartido, no en tiempo real. Se programarán otros procesos y subprocesos para que se ejecuten al mismo tiempo, por lo que el hilo se verá obligado a esperar con regularidad el uso del procesador. Por lo tanto, no debe escribir el código del temporizador WinForms que se basa en intervalos exactos o retrasos de milisegundos.
En su situación, establecer el intervalo en 1 ms es realmente decirle a Windows que active este temporizador tan a menudo como sea posible. Como ha visto, esto es mucho menos frecuente que 1 ms (60 fps = aproximadamente 17 ms).
Si necesita un temporizador de resolución más preciso y de mayor resolución, la API de Windows proporciona temporizadores de alta resolución/rendimiento, si su hardware lo admite, consulte How to use the high resolution timer. Una desventaja de esto es que el uso de la CPU de su aplicación se incrementará para soportar un mayor rendimiento.
En general, creo que es mejor implementar un bucle de juego independiente de hardware/sistema. De esta forma, la animación percibida de su escena parece constante independientemente de la velocidad de fotogramas real lograda.Para obtener más información, these articles brinda una buena información.
¡Bonito! Usar 'Application.Idle' parece mucho más elegante que un temporizador de 1 ms. Tendré que probar este 'StopWatch' mañana también. ¡Gracias! ** Editar: ** En realidad, mentí. Cuando está cambiando el tamaño o moviendo la ventana, parece detenerse al ralentí y, por lo tanto, detiene el redibujado. Esto básicamente reduce la prioridad del dibujo. Tal vez me quede con un temporizador para imponer una tasa de redibujado mínima ... no hay razón por la que no pueda combinar ambos métodos. – mpen
Además, StopWatch solo sirve para cronometrar cosas, no para eventos de devolución de llamada. – mpen
Puede intentar iniciar su temporizador cuando el ralentí termine, y luego detenerlo/volver a comprobarlo cuando el evento inactivo se dispare. Puedes acercarte mucho de esta manera. – Nanook