Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Flash тормозит в браузерах? (http://www.flasher.ru/forum/showthread.php?t=208589)

sospamom 01.08.2014 23:37

Flash тормозит в браузерах?
 
Flash тормозит в браузерах. Проверял на последних версиях IE, Firefox. Версия FlashPlayer последняя релизная.

Сравните как гладко скользит квадрат в standalone-плеере и как дрожит-подергивается в браузере. Иногда в браузере тоже скользит гладко, нужно подождать секунд 10.

[Вложение #31074 - не найдено]

Код AS3:

package 
{
        import flash.display.Bitmap;
        import flash.display.BitmapData;
        import flash.display.Sprite;
        import flash.events.Event;
 
        public class Main extends Sprite
        {
                private var _bitmap:Bitmap;
 
                public function Main():void
                {
                        _bitmap = new Bitmap(new BitmapData(100, 100, false, 0));
                        _bitmap.y = 100;
                        addChild(_bitmap);
 
                        addEventListener(Event.ENTER_FRAME, enterFrame);
                }
 
                private function enterFrame(e:Event):void
                {
                        _bitmap.x++;
                        if (_bitmap.x > 500) _bitmap.x = -100;
                }
        }
}

Проблема в том, что в моей игре этот эффект так сильно бросается в глаза, что кажется, что игра тормозит.
Тестировал на 4-рех компах.
В диспетчере задач процессор нагружен на ~4%, редко поднимается до 20%. В Scout память не растет (занимает ~130Мб), Garbage Collector не запускается.

Движок flashpunk, вся графика рисуется на экран блиттингом.

Задано 60fps.

Что делать?

LifeIsRhythm 01.08.2014 23:59

У меня не показывает...

А вариант только один - анимировать все движения. Да и то они будут дергаться.

Котяра 02.08.2014 00:05

во-первых, никогда не делайте привязку к фреймрейту. Делайте всегда по времени.
во-вторых, поиграйте со скоростью - чем выше скорость тем менее заметны перерисовки.

dimarik 02.08.2014 00:23

Присоединяюсь к Котяриной "во-первых". А после этого можно скрасть неравномерность движения с помощью блюр-фильтра или подобной механики. Но это уже от лукавого, по моему мнению.

Я мастрячил года три назад плавный скролл для игрушки типа "Contra", с оригинальными изображениями. То, что я увидел мне настолько не понравилось, что я решил отложить это до лучших времен. Времена наступили, но несколько в другом плане. У флеша появился Stage3D. Но и здесь тебя поджидает масса подвохов. Может лучше на Unity перейти сразу?

sospamom 02.08.2014 00:39

Вложений: 1
Спасибо за помощь, но по времени тот же самый эффект. В standalone гладко, в браузерах дрожит.
Фильтры попробую, если не получится по-другому решить.

empty.swf   (0.7 Кб)


Код AS3:

package 
{
        import flash.display.Bitmap;
        import flash.display.BitmapData;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.utils.getTimer;
 
        public class Main extends Sprite
        {
                private var _bitmap:Bitmap;
                private var _timeInPreviousFrame:Number;
 
                public function Main():void
                {
                        _bitmap = new Bitmap(new BitmapData(100, 100, false, 0));
                        _bitmap.y = 100;
                        addChild(_bitmap);
 
                        addEventListener(Event.ENTER_FRAME, enterFrame);
                }
 
                private function enterFrame(e:Event):void
                {
                        var elapsed:Number = getTimer() - _timeInPreviousFrame;
                        _timeInPreviousFrame = getTimer();
 
                        _bitmap.x += elapsed / 10;
                        if (_bitmap.x > 500) _bitmap.x = -100;
                }
        }
}


dimarik 02.08.2014 00:48

Попробуй обойтись одним getTimer(). И потестировать это не под хромом (с его PPAPI). Хотя ты и так уже все понял.

ShockWave512 02.08.2014 01:12

Давно перешел на Starling, плавность идеальная, не хуже чем в Unity.

dimarik 02.08.2014 01:22

Это проходит со сложностью приложения.

Tails 02.08.2014 10:22

Цитата:

Сообщение от dimarik (Сообщение 1169998)
Это проходит со сложностью приложения.

Как именно сложность влияет на плавность анимации?

sospamom 02.08.2014 23:38

Вложений: 1
Оставил один getTimer(). Тестирую под Firefox и IE. Все равно квадрат дрожит и дергается.
Попробовал задать PixelSnapping.NEVER — не помогает.

empty.swf   (0.7 Кб)


Код AS3:

package 
{
        import flash.display.Bitmap;
        import flash.display.BitmapData;
        import flash.display.PixelSnapping;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.utils.getTimer;
 
        public class Main extends Sprite
        {
                private var _bitmap:Bitmap;
                private var _timeInPreviousFrame:Number;
 
                public function Main():void
                {
                        _bitmap = new Bitmap(new BitmapData(100, 100, false, 0), PixelSnapping.NEVER);
                        _bitmap.y = 100;
                        addChild(_bitmap);
 
                        addEventListener(Event.ENTER_FRAME, enterFrame);
                }
 
                private function enterFrame(e:Event):void
                {
                        var getTimerTemp:Number = getTimer();
                        var elapsed:Number = getTimerTemp - _timeInPreviousFrame;
                        _timeInPreviousFrame = getTimerTemp;
 
                        _bitmap.x += elapsed / 10;
                        if (_bitmap.x > 500) _bitmap.x = -100;
                }
        }
}


Цитата:

Хотя ты и так уже все понял.
Про что ты?

ShockWave512 02.08.2014 23:49

вот кстати может чем то поможет
похожую тему когда то подымал
http://www.flasher.ru/forum/showthread.php?t=171150

sospamom 03.08.2014 00:07

Цитата:

Сообщение от ShockWave512 (Сообщение 1170035)
вот кстати может чем то поможет
похожую тему когда то подымал
http://www.flasher.ru/forum/showthread.php?t=171150

Спасибо за помощь, но нет. Попробовал сейчас применить к квадрату оба способа. Не помогает.

Способ #1
Код AS3:

_bitmap.transform.matrix3D = new Matrix3D();

Способ #2
Код AS3:

_bitmap = new Bitmap(new BitmapData(100, 100, false, 0), PixelSnapping.NEVER, true);
_bitmap.scaleX = _bitmap.scaleY = 0.999;


ivaniyses 03.08.2014 09:53

Есть специальная библиотека, позволяющая всю векторную анимацию переводить в растовую, что повышает производительность.
http://www.ant-karlov.ru/reshenie_pr..._vo_Flash.html

ShockWave512 03.08.2014 10:50

Цитата:

Сообщение от ivaniyses (Сообщение 1170053)
Есть специальная библиотека, позволяющая всю векторную анимацию переводить в растовую, что повышает производительность.

там испрользуется блиттер, вектора нет

sospamom 03.08.2014 12:31

Вложений: 1
Scout показывает, что в браузере кадры выполняются то ~10 то ~20 мс.

К посту приложил отчет Scout'a по флешке с перемещением квадрата в браузере.
Вложение 31077

sospamom 03.08.2014 13:06

Хотя это неважно. Все равно не должно быть глюков, если делаешь движение квадрата по времени. А глюки есть.

ShockWave512 03.08.2014 13:14

запишите видео, возможно это "слезы" синхронизации и они не лечатся
(ну кроме старлинга - http://www.as3gamegears.com/engines/.../starlingpunk/ )

LifeIsRhythm 03.08.2014 15:48

Цитата:

Хотя это неважно. Все равно не должно быть глюков, если делаешь движение квадрата по времени.
Почему? Анимация на времени гарантирует лишь перемещение, а дерганное оно будет или нет, этого обещать Вам никто не может.
Можно сглаживать время...

sospamom 03.08.2014 17:57

Цитата:

Сообщение от LifeIsRhythm (Сообщение 1170061)
Почему? Анимация на времени гарантирует лишь перемещение, а дерганное оно будет или нет, этого обещать Вам никто не может.

Кадр выполнился за 10мс - двинулись на пиксел
Кадр выполнился за 20мс - двинулись на два пиксела

Почему анимация может быть дерганной? Например в следующем примере квадрат скользит абсолютно гладко в standalone-плеере.

Код AS3:

private function enterFrame(e:Event):void 
                {
                        if (_counter & 1) // нечетный кадр
                                _bitmap.x += 1;
                        else
                                _bitmap.x += 2;
                }

Цитата:

Сообщение от LifeIsRhythm (Сообщение 1170061)
Можно сглаживать время...

Как?

Добавлено через 35 минут
Цитата:

Сообщение от ShockWave512 (Сообщение 1170058)
запишите видео, возможно это "слезы" синхронизации и они не лечатся

Если вы про эффект, когда половина изображения сдвигается, то такого не наблюдается.
http://en.wikipedia.org/wiki/File:Te...mulated%29.jpg

Делал прямоугольник во всю высоту флешки. Такого эффекта нет.
Код AS3:

new BitmapData(100, 300, false, 0)


LifeIsRhythm 03.08.2014 20:14

Выполнился за 10 секунд - квадрат передвинулся на px
Выполнился за 10 секунд - квадрат передвинулся еще на px
Пока все гладко и кажется без дерганья.
А тут произошел лаг на две секунды.
А тут квадрат двинулся сразу за две секунды не на один а на два px, а это уже дерганье. Разве нет?
Цитата:

Например в следующем примере квадрат скользит абсолютно гладко в standalone-плеере.
А ещё есть релизный плеер, попробуйте в нем. И ещё есть гугл хром...

Добавлено через 42 секунды
Цитата:

Как?
Я уже говорил Вам как!

sospamom 03.08.2014 20:31

Цитата:

Сообщение от LifeIsRhythm (Сообщение 1170077)
Выполнился за 10 секунд - квадрат передвинулся на px
Выполнился за 10 секунд - квадрат передвинулся еще на px
Пока все гладко и кажется без дерганья.
А тут произошел лаг на две секунды.
А тут квадрат двинулся сразу за две секунды не на один а на два px, а это уже дерганье. Разве нет?

От таких больших лагов никуда не деться. Я же хочу выяснить как избавиться от лагов когда один кадр выполняется 10 мс, а другой 20мс.


Цитата:

Сообщение от LifeIsRhythm (Сообщение 1170077)
А ещё есть релизный плеер, попробуйте в нем. И ещё есть гугл хром...

Так я и пробую в релизном плеере/плагинах/activex. В debug-версиях не пробую.


Цитата:

Сообщение от LifeIsRhythm (Сообщение 1170077)
Я уже говорил Вам как!

Напишите подробнее. Перечитал посты, не нашел, что вы имеете ввиду.

LifeIsRhythm 03.08.2014 21:00

Цитата:

От таких больших лагов никуда не деться.
Так я же не всерьёз о одном кадре в десять секунд.
Цитата:

Напишите подробнее. Перечитал посты, не нашел, что вы имеете ввиду.
Самый первый ответ в этом вопросе - попробуйте использовать tween max, а потом отпишитесь, будут у Вас лаги или нет.

sospamom 03.08.2014 21:24

Цитата:

Сообщение от LifeIsRhythm (Сообщение 1170081)
Так я же не всерьёз о одном кадре в десять секунд.

Я думал вы описались, имея ввиду 10 мс, но 2 секунды. Теперь я не понимаю что вы имели ввиду. Вы учитываете, что я не по целым пикселям иду? У меня PixelSnapping.NEVER.

Цитата:

Сообщение от LifeIsRhythm (Сообщение 1170081)
Самый первый ответ в этом вопросе - попробуйте использовать tween max, а потом отпишитесь, будут у Вас лаги или нет.

То же самое. В standalone гладко, а в браузерах дергается.
Код AS3:

public function Main():void 
                {
                        _bitmap = new Bitmap(new BitmapData(100, 300, false, 0), PixelSnapping.NEVER);
                        addChild(_bitmap);
 
                        onFinishTween();
                }
 
                private function onFinishTween():void
                {
                        _bitmap.x = -100;
                        TweenMax.to(_bitmap, 6, {x:500, onComplete:onFinishTween, ease:Linear.easeNone});
                }


Dzzirtuoz 04.08.2014 11:09

Посмотрел оба файла, что тут прикреплены, через Яндекс.браузер. Все идеально гладко плывет

ZackMercury 04.08.2014 12:54

У меня тоже наблюдаются небольшие задержки. AMD Athlon(tm) 64 X2 Dual Core Processor 5600+ 2.91 GHz, видеокарта интегрированная в материнку. Ну, не сказать, чтобы совсем хреновая, но тянет небольшие игры на минимум настройках.
http://ipic.su/img/img7/fs/Snimok.1407138606.png
В общем, я уже эту тему поднимал когда-то. Но меня не поняли, да и никто толком ответить не смог чётко.
Тормоза в Opera не так сильно заметны, как в IE.(В других браузерах не тестил)

nubideus 04.08.2014 13:45

http://gonchar.me/blog/goncharposts/1670
Цитата:

Flash has its own, separate timer that drives the frame rate, and it can get offset from vsync.

sospamom 04.08.2014 16:05

Спасибо всем за ответы

Цитата:

Сообщение от nubideus (Сообщение 1170098)

Видимо рассинхронизация с vsync незаметна глазу. В standalone-плеере ведь проблемы нет.

Увеличил зоопарк проверенных браузеров до IE, Firefox, Chrome, Yandex.

Nooob 04.08.2014 17:32

1. для таких тестов используй релизную версию флеш плеера
2. используй фреймрейт кратный 60, (30, 60, 120)
3. попробуй поставь wmode=direct|gpu, про vsync тут занятный эксперимент
4. Scout показывает
в браузере:
Waiting for GPU: 0
Waiting for Next Frame: 17
в standalone:
Waiting for GPU: 16
Waiting for Next Frame: <1
Может быть в этом принципиальные различия? разный loop рендера?

sospamom 04.08.2014 18:10

Цитата:

Сообщение от Nooob (Сообщение 1170109)
1. для таких тестов используй релизную версию флеш плеера
2. используй фреймрейт кратный 60, (30, 60, 120)
3. попробуй поставь wmode=direct|gpu, про vsync тут занятный эксперимент
4. Scout показывает
в браузере:
Waiting for GPU: 0
Waiting for Next Frame: 17
в standalone:
Waiting for GPU: 16
Waiting for Next Frame: <1
Может быть в этом принципиальные различия? разный loop рендера?

Действительно при wmode=direct лаги в браузерах пропали. Получается в standalone-плеере используется mode, который синхронится с vsync, поэтому и лагов нет.

Это грустно, потому что у меня нет доступа к редактированию html-страниц, где будет публиковаться флешка.

LifeIsRhythm 04.08.2014 18:32

Цитата:

Это грустно, потому что у меня нет доступа к редактированию html-страниц
А у меня поддержки wmode=direct... Дешёвая видео карта.. Средненькая, но я проводил тест и оказалось, что не поддерживает этот мод...
Хотя я не понимаю, почему у меня новые игры играют, а флешь у которого все в сто раз хуже чем в играх, не осиляет..

Nooob 05.08.2014 00:18

Итак, кому интересно, опытным путём в fp под windows я выяснил
- если выключено аппаратное ускорение, то вывод графики в любом флешплеере/режиме производится через GDI
- если включено аппаратное ускорение
в браузерном флеш плеере, в оконном режиме
wmode=window|opaque|transparent - GDI
wmode=gpu|direct - DirectX|OpenGL
в браузерном флеш плеере, в полно экранном режиме
wmode=любой, вывод графики через DirectX|OpenGL
это и понятно, чтоб видео в полно экранном режиме не тормозило.
в standalone флеш плеере, вне зависимости от флагов компилятора -use-gpu, -use-direct-blit
вывод происходит через DirectX|OpenGL

в выводе через DirectX|OpenGL вертикальная синхронизация всегда включена

Max_Payn 20.12.2015 03:13

а под линукс есть информация как выводится?


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

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