Я только что попытался запустить ваш пример кода, в точности как есть, за исключением сценария кадра, и там, где я сижу, таймер работает точно так, как вы ожидаете. При таймере 30 мс среднее значение составляет около 33-34, а при таймере 3 мс - около 3,4 или 3,5. С таймером 1 мс я получаю от 1,4 до 1,6 более тысячи испытаний. Так работает во Flash и в браузере.
Что касается точности, см. Сообщение в блоге Тиника в ответе Люка. Но для верхнего предела по частоте, если вы получаете события с интервалом не более 16 мс, используя только пример кода, который вы разместили, либо что-то странное, либо, возможно, это верхний предел скорости, с которой ваш браузер выдает сообщения синхронизации Flash. Если вы получаете эти результаты в своей реальной игре, я думаю, что у вас просто есть синхронный код, который блокирует события таймера.
Еще одна вещь - я знаю, что это не то, что вы просили, но было бы разумнее обрабатывать вашу игровую логику в обработчике ENTER_FRAME. Не имеет значения, запускается ли код для запуска лазеров каждые 30 мс или каждые 3 мс, экран перерисовывается только один раз за кадр (если только вы не заставляете его обновляться чаще, чего, вероятно, не должно быть). Таким образом, все, что происходит между обновлениями экрана, - это просто накладные расходы, которые снижают общую частоту кадров, так как с небольшой хитростью должно быть возможно достичь точно таких же результатов, которые вы получите от таймера, который выполняется чаще. Например, вместо создания лазера каждые 3 мс, вы можете создавать 10 лазеров каждые 30 мс и перемещать каждый на определенное расстояние по траектории полета, как если бы он был создан на 3, 6 или 9 мс ранее.
Другой естественный способ запуска логики вне фреймовых событий - создание игрового цикла, который «теоретически» запускается каждые T миллисекунд. Затем в обработчике ENTER_FRAME
просто выполните итерацию этого цикла F / T раз, где F - количество мс, прошедших с момента последнего события кадра. Таким образом, если вы хотите, чтобы игра теоретически обновлялась каждые 5 мс, и вы хотите, чтобы экран обновлялся со скоростью 30 кадров в секунду, вы просто публикуете со скоростью 30 кадров в секунду, а в обработчике ENTER_FRAME
вы будете вызывать цикл основной игры 5-7 раз подряд в зависимости от того, сколько времени прошло с последнего кадра. На экране это даст вам такие же результаты, как если бы вы использовали событие таймера 5 мс, и это избавит от значительной части накладных расходов.