Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 02.02.2012, 12:40
maxkar вне форума Посмотреть профиль Отправить личное сообщение для maxkar Найти все сообщения от maxkar
  № 31  
Ответить с цитированием
maxkar

Регистрация: Nov 2010
Сообщений: 497
Цитата:
Сообщение от Black Soviet Посмотреть сообщение
В параметрах публикации Flash, выставил "Аппаратное ускорение - direct (прямое ускорение)" как советовали на буржуйских форумах. Тоже не помогло.
А покажите код, которым вы флешку на страницу вставляете. Там должно быть wmode="direct". И только direct! Если он не стоит, результат рендеринга кадра отдается бразуеру, а браузерам обычно не интересно заниматься вертикальной синхронизацией.

Цитата:
Спасибо, сегодня в свободное время постараюсь реализовать и выложить резултат.
Не поможет. Потому что проблемы происходят не на этапе рендеринга, а на этапе передачи картинки монитору .

Цитата:
То есть как я понимаю проблема в том Flash начинает рисовать объект на новом месте, до конца не удалив его с предыдущего, в результате на объекте видны мерцающие горизонтальные полосы.
Нет!

Придется, правда, рассказать, как работают мониторы и видеотракт.
Так получилось, что первые мониторы были на электронно-лучевых трубках. В них "луч" бегал по экрану сверху вниз и слева направо, зажигая нужные люминофоры. В сигнале передавалась служебная информация (информация о начале/конце строки/кадра) и уровни сигналов для каждой точки, проходимой лучом.
Проще всего реализовывать такой обмен так - выделяется непрерывный блок памяти, и при обмене на выход видеокарты просто передаются "перекодированные в сигнал" значения байтов этой памяти. После окончания прохода буфер начинает передаваться заново. Занимается этим специальный чип (или часть общего чипа), который подключен к видеовыходам.
Сейчас схема передачи изображения на монитор принципиально не поменялась. Да, сигнал стал цифровым, но значения пикселей все равно передаются по-очереди и видеокарты также используют непрерывный буфер.

Теперь рассмотрим способы формирования изображения.
Как проще всего формировать изображение? Да просто изменяя значения байтов в той самой выделенной области. А что будет, если область одновременно читается и записывается? Правильно, на монитор уйдет часть "старых" данных и часть "новых". Где будет старая часть, а где новая - зависит от скоростей "читателя" (передающего картинку на монитор) и писателя. Если скорость писателя выше, новая часть будет "снизу". Если выше скорость "читателя" - сверху. Вот так и образуется "tearing" на экране. (Кстати, двойной "tearing" как у вас на картинке - все же ситуация нетипичная и редкая)
Для избавления от tearing'а тоже было придумано решение. И достаточно простое. Не нужно писать в "выводимый" кадр, нужно писать в отдельную область и после выдачи экрана выводить только полностью сформированную область. Это называется double buffering. Отрисовка производится в один буфер, а в это время второй буфер передается на монитор. После полной передачи буфера они меняются местами. Теперь на монитор передается тот буфер, который рисовался, а отрисовка производится в буфер, который только что выводился на экран. Этот механизм реализуется видеокартой. Но есть одна проблема - приложение, выполняющее отрисовку, тоже должно знать об этой схеме и правильно переключать буфера. "Просто автоматически" переключать не получится - приложение может не успеть обновить буфер и продолжит писать в "выводимый на экран" буфер. Если я не ошибаюсь, переключение буферов делается явно приложением (командой видеокарте).

Теперь вернемся к браузерам и флешу. При большинстве значений wmode флеш генерирует картинку и передает ее браузеру со словами "отрисуй-ка ты мне ее". Даже wmode="gpu" работает по этой схеме, правда само изображение формируется с использованием видеокарты. Дальше за вывод картинки отвечает браузер. Сейчас браузеры не используют вертикальную синхронизацию (им это особо и не нужно), поэтому он работает по "первой" схеме (прямая запись в видеобуфер). Ну а это и приводит к артефактам. Заметьте, что ошибка происходит на этапе вывода изображения и передачи на монитор! Никакие программные ухищрения во флеш не могут повлиять на этот эффект. А сам эффект зависит от стечения множества обстоятельств (например, от того, попал ли обмен с кадром "посередине" передачи кадра или нет).
Теперь разберем wmode="direct". Он позволяет флешке установить контроль над выводимой частью экрана. Для этого используется технология "overlay", которая позволяет составлять образ экрана из нескольких различных буферов. В основном буфере требуемая область заливается определенным цветом (одним и сплошным, цвет может быть разный). Само изображение формируется в другом буффере. При выводе проверяется цвет выводимого пикселя и при необходимости пиксель заменяется другим из буфера (с необходимой трансляцией координат). Сейчас вывод overlay-поверхностей поддерживается аппаратно видеокартой. overlay'и часто используются при выводе видео. Для буферов в этом случае тоже доступны почти все имеющиеся возможности, в том числе двойная буферизация. wmode="direct" как раз и включает эту технологию. В этом случае на странице рисуется прямоугольник определенного цвета, а flash-player формирует буфер кадра в памяти видеокарты минуя браузер. И только в этом случае флеш может переключать выдаваемый кадр "целиком", что и избавляет от проблемы tearing'а.

Выводы.
1. Никакие программные пляски с бубном вокруг двойной и тройной буферизации на стороне flash-player'а не помогут без включенного wmode="direct". С другой стороны, со включенным wmode="direct" (и при правильной реализации флеша, сейчас она правильная) данная проблема не возникает вообще. И никакие пляски с бубном вокруг программной двойной буферизации не нужны.
2. Проявление эффекта зависит от массы различных факторов и может нестабильно проявляться даже на одном и том же компьютере (например, в разных частях изображения или не во всех случаях).

Старый 02.02.2012, 13:01
Black Soviet вне форума Посмотреть профиль Отправить личное сообщение для Black Soviet Найти все сообщения от Black Soviet
  № 32  
Ответить с цитированием
Black Soviet
 
Аватар для Black Soviet

Регистрация: Nov 2011
Сообщений: 41
maxkar
Огромное спасибо за развернутый ответ.
Итак кое-какие результаты есть.

Выставление в хтмл-коде параметра "wmode=direct" сработало, и шар ПЕРЕСТАЛ ДЕРГАТЬСЯ и МЕРЦАТЬ. Но я искренне надеялся что установив в параметре публикации - прямое аппаратное ускорение он мне скомпилирует swf без багов. Правильно ли я понимаю, что никак кроме размещения swf в html-странице с включенным параметром wmode=direct, нельзя включить ускорение ? Меня интересует именно swf, проигрываемый в Flash Player.

Дело в том, что весьма огорчительно было увидеть коды страницы различных игровых флеш-сайтов, и увидеть что ВСЕ динамичные и сложные игры имеют параметр "wmode = window", то есть аппаратного ускорения не включено вообще.

Как вы правильно сказали, двойная буферизация мне не помогла. Изменился лишь характер артефактов. Где-то 4 секунды шар вертится плавно, потом секунду его жестко раздирает и колбасит.

Старый 02.02.2012, 18:47
maxkar вне форума Посмотреть профиль Отправить личное сообщение для maxkar Найти все сообщения от maxkar
  № 33  
Ответить с цитированием
maxkar

Регистрация: Nov 2010
Сообщений: 497
Вывод через overlay и с vsync? В самой флешке никак. И здесь тоже все более-менее причины понятны. Например, вывод через overlay не совместим с wmode="transparent". Оверлей буквально выводит область видеопамяти вместо другого прямоугольника. Т.е. никакой "прозрачности" не получится - у плеера при рендеринге просто нет нужного прямоугольника (и верхних слоев на веб-странице). Это должен делать браузер.

Таким образом, остаются только варианты, когда весь "прямоугольник" выводит сам плеер. Это режимы direct и window. С direct все понятно, он работает правильно. С window - не совсем. Например, здесь пишут, что вывод ведется через GDI в windows (создается отдельное окно и т.п.). Вполне вероятно, там используется стандартная "оконная" отрисовка (прямоугольная область пикселей) и без двойной буферизации. И не факт, что в GDI вообще можно делать "двойную буферизацию" при выводе на экран. Чисто теоретически, плеер мог бы создавать там directx overlay surface и рисовать туда. Но судя по всему он этого не делает. Так что если флажок "аппаратное ускорение" при публикации не помог, то больше ничего плеер включить двойную буферизацию не заставит.

На игровых сайтах можно посмотреть, может быть, они дают управлять параметром wmode, а window там стоит по-умолчанию. Но, конечно, далеко не все они будут поддерживать возможность такой настройки.

Старый 05.02.2012, 12:57
Black Soviet вне форума Посмотреть профиль Отправить личное сообщение для Black Soviet Найти все сообщения от Black Soviet
  № 34  
Ответить с цитированием
Black Soviet
 
Аватар для Black Soviet

Регистрация: Nov 2011
Сообщений: 41
Кое-какие положительные результаты всё же есть которые помогли минимизировать эффект "мерцания". Итак в ходе различных тестов было замечено и подмечено:

1) При маленьких скоростях объекта мерцания почти нет.
2) При маленьком размере картинки мерцания почти нет.
3) Наличие контрастного фона (белые объекты на черном фоне) увеличивают, по-крайней мере визуально, мерцание.
2) Мерцание усиливается если у объекта в первую очередь большая горизонтальная скорость. На вертикальных заходах мерцание не так сильно. (проверено на эллиптических траекториях)
3) Все картинки обязательно в растр и кэшируем.
4) В выводе графики используем copyPixels если есть альфа-канал(прозрачность), и используем beginBitmapFill если альфа не используется.
5) Для BitmapData рекомендуется lock() и unlock()
6) Если религия не позволяет использовать EnterFrame, и используем вместо него Timer, то не забываем про updateAfterEvent()
7) И самое главное, при публикации в html выставляйте параметр wmode=direct, и тогда мерцания не будет вообще.

Если кто еще может посоветовать какие-нить приёмы по улучшению отображения графики, то делимся.


Последний раз редактировалось Black Soviet; 05.02.2012 в 13:14.
Создать новую тему Ответ Часовой пояс GMT +4, время: 13:23.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Теги
rendering , wmode

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 13:23.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.