Лучшее время для Flash (ActionScript 3) - PullRequest
2 голосов
/ 01 августа 2011

Я пытаюсь сделать метроном во флэш-cs3.Использование таймера не очень согласованно.

Интересно, знает ли кто-нибудь какой-нибудь класс, который кто-то написал для лучшей возможности синхронизации?1003 *

Ответы [ 3 ]

0 голосов
/ 04 августа 2011

Вы не можете получить идеальное время в текущем проигрывателе 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");
            }
        }
    }
}

`

0 голосов
/ 15 февраля 2014

Я только что выпустил библиотеку под названием Метроном , которая решает эту проблему. Я думал, что опубликую это здесь, так как это был мой первоначальный поиск, прежде чем я решил заняться проблемой самостоятельно.

Вы можете скачать его с http://cote.cc/projects/metronome (есть также ссылка на репозиторий GitHub).

Надеюсь, это поможет!

P.S. Я также написал сообщение в блоге, подробно рассказывающее, как появилась библиотека. Он дает представление о том, как работает синхронизация в ActionScript: http://cote.cc/blog/accurate-timing-in-actionscript

0 голосов
/ 01 августа 2011

хороший вопрос.Я всегда предполагал, что неспособность достичь точного времени во Flash была опорой виртуальной машины, и я принял это.Тем не менее, я только что гуглил и нашел следующий рецепт в Adobe Developer Connection CookBooks.Судя по сравнению записанных результатов и комментариям пользователей, он, кажется, работает хорошо:

Adobe Developer Connection CookBooks: точный таймер

протестируйте его и опубликуйте свои результаты, ябыло бы интересно прочитать их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...