Статьи

Совет: исправление ошибок V-Sync («разрыв») во Flash

В сегодняшнем (очень) кратком совете вы узнаете, как решить распространенную проблему мерцания или разрыва. Это ужасный эффект во Flash, когда растровые изображения мерцают при обновлении или появляются, как разрыв на два изображения (как на миниатюре).


В двух словах: разрыв происходит, когда Flash выводит информацию из двух разных кадров на экран одновременно. На изображении, приведенном выше, вы можете видеть, как это может выглядеть при панорамировании изображения башни; нижняя часть изображения — из одного кадра, а верхняя — из следующего. Наблюдая за этим в движении, вы бы видели его только доли секунды, но это все равно было бы заметно.

Обычно это решается с помощью «V-sync» (вертикальная синхронизация), которая останавливает видеокарту, которая рисует что-либо на экране до следующего цикла обновления экрана. Тем не менее, Flash действительно плохо поддерживает V-синхронизацию, потому что частота кадров Flash Player отличается от вертикальной частоты обновления рабочего стола, что означает, что объекты, которые имеют большую высоту, будут сильно повреждены разрывом. Это верно даже в том случае, если частота кадров Flash равна частоте вертикальной развертки рабочего стола, поскольку они все еще не синхронизированы.

Теперь вы можете задаться вопросом: почему Adobe не решает эту проблему? Причина в том, что Flash использует временную шкалу, и, следовательно, изменение частоты кадров меняет скорость воспроизведения. Если вы создали игру или галерею изображений, работающую со скоростью 60 кадров в секунду, а частота вертикальной развертки рабочего стола составляла более 60 кадров в секунду, вы бы либо слегка заикались (если вы оставили фильм со скоростью 60 кадров в секунду), либо вам пришлось бы играть Фильм возвращается быстрее, чтобы синхронизировать с рабочим столом. Для большинства контента это вообще не рекомендуется!

Это проблема разработчиков игр, которые давно хотели, чтобы Adobe исправила их, но очевидно, что с ними есть проблемы. Итак, на данный момент мы, разработчики, должны сами придумать способы решения этой проблемы. Нет простого способа исправить это на всех компьютерах, но, поскольку большинство мониторов имеют частоту обновления 59,9 или 60, вы можете установить частоту кадров 60, чтобы решить эту проблему для большинства пользователей. Однако это требует большей вычислительной мощности и может замедлить работу вашего приложения.

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


Аппаратное ускорение Уровень 1: Прямой — это ключ к решению проблемы разрыва. Это можно установить, открыв HTML-файл, в который встроен SWF-файл, и отредактировав параметры для объекта Flash.

Флаг, который вы хотите установить, это wmode: "direct" . Эта строка находится в разделе «params» вашего HTML-кода. Вот и все, что должно помочь значительно уменьшить разрыв. Если вы хотите знать почему, посмотрите на страницу Adobe по аппаратному ускорению . Это объясняет немного об обоих уровнях аппаратного ускорения. Для получения дополнительной информации ознакомьтесь с этой углубленной статьей .


Да; Еще одна вещь, которую стоит упомянуть, — чем больше объектов на экране, тем более очевидным будет разрыв. На более мелкие элементы обычно не влияют проблемы с V-синхронизацией, но элементы на экране, которые являются большими, делают это очень очевидным, так что сведением к минимуму количества крупных объектов является хорошей идеей.

Кроме того, bitmapData.lock() использовать bitmapData.lock() и bitmapData.unlock() , что помогло некоторым людям решить эту проблему. Блокировка объекта BitmapData останавливает перерисовывание любых растровых изображений до тех пор, пока они не будут разблокированы, что является хорошей идеей, если вам нужно сделать несколько изменений между кадрами. Чтобы узнать больше, посмотрите этот пост в блоге .


Вы можете сделать несколько вещей, чтобы уменьшить разрыв, но вы не можете полностью устранить это. Сокращение количества крупных объектов, установка wmode:"direct" и использование растровой блокировки — лучшие способы помочь уменьшить разрыв.