Вы не можете получить идеальное время в текущем проигрывателе Flash Player, поскольку вы можете запускать код только при возникновении событий (либо ENTER_FRAME, либо TimerEvent).
Как указано в предыдущем ответе, вы можете получить запись своего приложения, когда эти события произойдут (либо создав новый экземпляр Date, либо вызвав getTimer ()), а затем вычислить разницу времени между кадрами. Используя эти дельты, вы обычно можете заставить свое приложение вести себя так, как будто оно содержит точную информацию о времени, но нет способа идеально выполнить код каждые 50 миллисекунд, потому что события не срабатывают с такой точностью.
Что касается использования возможностей генерации звука: класс Sound имеет событие Event.SAMPLE_DATA, которое можно использовать вместо ENTER_FRAME или TimerEvent, но оно не реагирует так быстро. Если вы не передаете достаточно данных в буфер, событие перестает срабатывать. И объем данных для заполнения буфера больше, чем вы могли бы получить из точности ENTER_FRAME или TimerEvent. Код для поддержки:
public class Tester extends Sprite
{
private const MAXIMUM_LOG_LINES:uint = 30;
private var _timer:Timer;
private var _sound:Sound;
private var _textField:TextField;
public function Tester()
{
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
_textField = new TextField();
_textField.defaultTextFormat = new TextFormat(null, 12);
_textField.multiline = true;
_textField.wordWrap = true;
_textField.width = stage.stageWidth;
_textField.height = stage.stageHeight;
addChild(_textField);
_timer = new Timer(1, 0);
_timer.addEventListener(TimerEvent.TIMER, onTimerTick, false, 0, true);
_timer.start();
_sound = new Sound();
_sound.addEventListener(SampleDataEvent.SAMPLE_DATA, onSoundSampleData, false, 0, true);
_sound.play();
addEventListener(Event.ENTER_FRAME, onEnterFrame, false, 0, true);
}
private function onTimerTick(event:TimerEvent):void
{
log("onTimerTick(event) @"+getTimer());
}
private function onEnterFrame(event:Event):void
{
log("onEnterFrame(event) @"+getTimer());
}
private function onSoundSampleData(event:SampleDataEvent):void
{
log("onSoundSampleData(event) @"+getTimer());
for (var c:int=0; c<2048; c++)
{
event.data.writeFloat(0);
event.data.writeFloat(0);
}
}
private function log(message:String):void
{
trace(message);
_textField.appendText(message+"\n");
if (_textField.numLines > MAXIMUM_LOG_LINES)
{
var indexOfFirstLine:int = _textField.text.indexOf("\r");
while(indexOfFirstLine >= 0 && _textField.numLines > MAXIMUM_LOG_LINES)
{
indexOfFirstLine++;
_textField.text = _textField.text.substring(indexOfFirstLine, _textField.text.length);
indexOfFirstLine = _textField.text.indexOf("\r");
}
}
}
}
`