Потому что Elastic Racetrack
любое выполнение кода тоже время
1. выполнить код 200 раз с интервалом 10 ms не то же самое что подождать 2000 ms, в любом случае будет тратиться время на повторный запуск таймера - это и будет погрешность.
2. цикл кадра в виртуальной машине тоже не постоянный
http://www.craftymind.com/2008/04/18...sh-9-and-avm2/ он состоит из последовательных этапов (выполнение кода, апдейт таймеров, вход в кадр, рендеринг, выход из кадра, включение сборки мусора если нужно, обработка лоадеров и тд и тп), поэтому момент повторного запуска таймера зависит не от константного времени работы, а от удачного попадания в этап апдейта таймеров и времени работы предыдущих этапов (на разных машинах время будет разное). этот цикл запускается не раз в 1ms а раз в 1 кадр. тоесть если у тебя будет 60 fps то время обработки повторного таймера будет меняться +/- 16 ms.
3. Выполнение цикла кадра AVM можно приостановить извне (попытаться закрыть окно, свернуть вкладку/окно, вызвать контекстное меню и тд) если приостановить выполнение то соответсвенно у тебя так же сдвинется отсечка таймера
Поэтому не нужно завязываться на правильность работы таймера, лучше слушать событие входа в кадр и определять поведение основываясь на времени с момента запуска AVM getTimer()