Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Почему так сильно падает FPS? Где вся производительность? (http://www.flasher.ru/forum/showthread.php?t=211958)

zCHESNOKz 14.12.2015 12:38

Почему так сильно падает FPS? Где вся производительность?
 
Вложений: 2
По невиданным мне причинам вращение 30 растровых картинок вызывает лаги(понижение FPS).

У меня в игре есть возможность сажать растения, когда оно созревает - на его заднем плане появляется анимация вращающегося свечения (100х100 px. растровая картинка) Задумывалось максимальное количество активных растений не больше 30 шт. Но! Начало сильно все лагать и падать FPS. Я пробовал ТвинЛайт, думал из-за него. Попробовал ентерфрейм - тоже самое. Когда у всех 30 растений включается анимация вращения клипа со свечением то FPS c 45 резко падает ниже 30.

Что я делаю не так? Почему так все падает?

Провел эксперимент - у меня отдельно есть пустой проект, где я провожу всякие испытания. Добавил на сцену 50 клипов (100х100 px. растровая картинка) и по клику включил вращение каждого клипа (также пробывал твином и ентерфреймом, твин лучше). FPS также сразу просело с 45 до 30. Что за!? Пробовал во Flashе менять в свойствах клипа менять визуализацию(варианты кеширования) - ничего не изменилось. Пробовал менять качество растрового изображения с png на jpeg - тоже ничего.

Что делать? :(((

*[никаких еффектов, в том числе и свечения нету, просто растровое изображение]

illuzor 14.12.2015 12:54

Цитата:

Что я делаю не так?
Знать бы, что вы вообще делаете.

Битмапдата одна на все картинки?

caseyryan 14.12.2015 12:55

Цитата:

Когда у всех 30 растений включается анимация вращения клипа со свечением
Счечение как сделано? Уж не глоу фильром ли?
1) Фильтры - это очень тормозная штука
2) Вращение объекта присвоением ему свойства rotation заставляет каждый раз пересчитываться матрицу трансформации объекта. Эта процедура более затратна, чем, скажем просто замена битмап даты.
Я бы лучше сделал при первом запуске такой картинки кэширование всех ее кадров в битмапдату, а потом просто заменял бы ее покадрово. Это сильно упростит процессору работу в дальнейшем

zCHESNOKz 14.12.2015 13:20

Цитата:

Сообщение от illuzor (Сообщение 1189666)
Знать бы, что вы вообще делаете.

Перечитайте еще раз вопрос. Какая битмапдата?

Я во флеше импортированую растровую картинку обернул в символ, и его уже использую в самой игре.

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

Сообщение от caseyryan (Сообщение 1189667)
Счечение как сделано? Уж не глоу фильром ли?
1) Фильтры - это очень тормозная штука
2) Вращение объекта присвоением ему свойства rotation заставляет каждый раз пересчитываться матрицу трансформации объекта. Эта процедура более затратна, чем, скажем просто замена битмап даты.
Я бы лучше сделал при первом запуске такой картинки кэширование всех ее кадров в битмапдату, а потом просто заменял бы ее покадрово. Это сильно упростит процессору работу в дальнейшем


1) Я же написал, что - " (100х100 px. растровая картинка) ".
2) Так получается, это просто rotation такое тормознутое и все нагружает?
Замена битмап даты - не совсем понял. А можно по подробней? Можно ссылки?

undefined 14.12.2015 13:55

Цитата:

2) Так получается, это просто rotation такое тормознутое и все нагружает?
Применяются ли к картинке какие-нибудь фильтры?

zCHESNOKz 14.12.2015 15:02

Цитата:

Сообщение от undefined (Сообщение 1189671)
Применяются ли к картинке какие-нибудь фильтры?

Да нет же говорю! Никаких эффектов нету. Просто растровая картинка

Bletraut 14.12.2015 18:16

Цитата:

Да нет же говорю! Никаких эффектов нету. Просто растровая картинка
Товарищ caseyryan и говорит, что растровая картинка это тот же битмап с битмапдатой. Ну и соответственно

Цитата:

2) Вращение объекта присвоением ему свойства rotation заставляет каждый раз пересчитываться матрицу трансформации объекта. Эта процедура более затратна, чем, скажем просто замена битмап даты.
Лагает скорее всего из-за этого, т.к. картинку крутить это затратно.

zCHESNOKz 14.12.2015 19:57

Цитата:

Сообщение от Bletraut (Сообщение 1189677)
Товарищ caseyryan и говорит, что растровая картинка это тот же битмап с битмапдатой. Ну и соответственно



Лагает скорее всего из-за этого, т.к. картинку крутить это затратно.

Хорошо, а не подскажите тогда как мне это исправить?

Bletraut 14.12.2015 20:11

Всё от того же caseyryan
Цитата:

Я бы лучше сделал при первом запуске такой картинки кэширование всех ее кадров в битмапдату, а потом просто заменял бы ее покадрово. Это сильно упростит процессору работу в дальнейшем
Нужно перевести все кадры анимации в битмапдаты и потом отдельно их подменять, можно написать свой велосипед основываясь на
http://gamedevblogs.ru/blog/actionscript/520.html

zCHESNOKz 14.12.2015 20:12

Цитата:

Сообщение от illuzor (Сообщение 1189666)
Битмапдата одна на все картинки?

А не подскажите как это сделать?

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

Сообщение от Bletraut (Сообщение 1189679)
Всё от того же caseyryan


Нужно перевести все кадры анимации в битмапдаты и потом отдельно их подменять, можно написать свой велосипед основываясь на
http://gamedevblogs.ru/blog/actionscript/520.html

Спасибо, посмотрю!

caseyryan 15.12.2015 09:31

Сдается мне, что лагает эта система, скорее всего, от чего-то другого. Не во вращении 30 картинок дело.

ShockWave512 15.12.2015 13:28

Профайлер (скаут) мгновенно показывает такие вещи, без гаданий где затык.

zCHESNOKz 17.12.2015 17:13

Цитата:

Сообщение от ShockWave512 (Сообщение 1189687)
Профайлер (скаут) мгновенно показывает такие вещи, без гаданий где затык.

Да, я знаю спасибо. Он как раз таки показывает нагрузку на рендер.

undefined 17.12.2015 18:20

а какого размера битмапа?

zCHESNOKz 17.12.2015 19:54

Цитата:

Сообщение от undefined (Сообщение 1189737)
а какого размера битмапа?

примерно 100х100 px

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

Сообщение от caseyryan (Сообщение 1189683)
Сдается мне, что лагает эта система, скорее всего, от чего-то другого. Не во вращении 30 картинок дело.

Ты прав. Я вроде бы нашел проблему.
[frameRae:45] (все теже картинки 100х100)
- FPS при 50 объектах почти не проседает.
- при 100 объектах, 22-37 короче среднее FPS 30.
Мне подходит вообщем.

Как у меня это получилось: Я просто сделал анимацию (вращение+scale) в самом флеше. А самое главное, что анимация должна быть типа "Анимация движения" (при "Классической анимации движения" падает FPS)
+ если вы анимируете символ в котором есть маски (или возможно еще что то типа слоев, и других вложенных клипов) то для анимации обращайте данный клип в еще один клип, и производите трансформации уже с ним. Почему в клип, а не в Графику? Потому, что при обращении в графику тоже падает FPS. Даже не помогает преобразование в ключи.

Надеюсь что так работает не только у меня, а мое решение тоже еще кому то поможет! :)

--- --- ---

Еще я выявил, что FPS начинает падать, когда поверх или снизу данного клипа размещается еще какой то клип. То есть если они друг друга перекрывают. Это особенности рендера Flash?

caseyryan 18.12.2015 06:17

Вложений: 3
Это костыльное решение. Да и вообще не решение, по сути. FPS все равно падает. И не важно до какого значения.
Скорее всего графика там у тебя векторная. Или в самих картинках, или в масках. Но тут точно какая-то дезинформация.
Вот тут вообще 200 вращаются, и ни сколько FPS не проседает. Можно и 300 сделать, будет то же самое
RectsRotation.swf   (2.9 Кб)

Код AS3:

package {
        import flash.display.Bitmap;
        import flash.display.BitmapData;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.geom.Point;
 
        [SWF(frameRate = 30)]
        public class ImagesRotation extends Sprite {
 
                private var _allObjects:Array = [];
 
                public function ImagesRotation() {
 
                        for (var i:int = 0; i < 200; i++) {
                                var b:Bitmap = new Bitmap(new BitmapData(100, 100, false, Math.random() * 100000000));
                                var s:Sprite = new Sprite();
                                var pos:Point = getRandomPosition();
                                b.x        = -b.width >> 1;
                                b.y        = -b.height >> 1;
                                s.x        = pos.x;
                                s.y        = pos.y;
                                s.addChild(b);
                                addChild(s);
                                _allObjects.push(s);
                        }
                        addChild(new Stats());
                        addEventListener(Event.ENTER_FRAME, onEnterFrame);
                }
 
                private function onEnterFrame(e:Event):void {
                        for each (var sprite:Sprite in _allObjects) {
                                sprite.rotation += 20;
                        }
                }
                private function getRandomPosition():Point {
                        return new Point(stage.stageWidth * Math.random(), stage.stageHeight * Math.random());
                }
        }
 
}


zCHESNOKz 18.12.2015 10:16

Вложений: 4
Это растр. Импортирую в библиотеку swc только растр. Из вектора - маска, для каждого изображения.

Изображение которое я вращаю - свечение. Потом в определенное время я включаю visible = true - красной зоны (изображение ). Оно как раз перекрывает свечение, ну или под ним. Не суть. И начинает падать FPS. Позже попробую показать флеху и код.
--- --- ---
Вот флешка и исходники.

Убрал векторные маски - ничего не изменилось, на FPS никак не повлияло. Дело просто в унылом рендере флеша. :(


Scketch.swf   (22.3 Кб)


код:

Код AS3:

public function Scketch()  
                {   
                        for (var i:int = 0; i < 75; i++)
                        {
                                addChild(box = new Box());
                                box_arr.push(box);
 
                                box.y = 175;
                                box.x = i * 9 + 50;   
                                //box.x = 100; 
                        }
 
                        stage.addEventListener(MouseEvent.CLICK, ClickL);
                }
 
                protected function ClickL(e:MouseEvent):void
                {
                        for (var i:int = 0; i < box_arr.length; i++)
                        box_arr[i].Bar();
                }
и
 
public function Box() 
                {
                        addChild(area = new fon_plant());
                        area.visible = false;
 
                        addChild(glow = new fon_b());
                }
 
                public function Bar():void
                {
                        swicher = false;
                        area.visible = false;
                }
 
                public function Foo():void 
                {
                        swicher = true;
                        area.visible = true;
                }


caseyryan 18.12.2015 11:50

Не надо гнать на флеш) я тебе привел код и файл, к котором двести картинок вращается. Запусти его у себя на компе. Если будет стабльно 30 фпс, значит дело в твоем коде. Если будет провисать, значит дело в компе. У меня и посерьезнее рендер бывал без провисаний, причем намного серьезнее
Цитата:

Из вектора - маска, для каждого изображения.
)) А говоришь растр. Векторная маска или просто векторная картинка. Для компа разницы нет. Одинаково сложно считается

п.с. Открыть исходник не могу. Нет у меня Flash CC

zCHESNOKz 18.12.2015 12:09

Цитата:

Сообщение от caseyryan (Сообщение 1189747)
Не надо гнать на флеш)

Я погорячился, прости Flash! :D Запустил, - твоя флеха не проседает. Комп в норме. Та и правда, глупо что я напоролся на такую маленькую проблему. Но за то очень весомую.

Как думаешь может посмотреть в сторону блиттинга, если проблема не решиться? Может поможет?

Bletraut 18.12.2015 20:19

Просмотрел исходник, причина лагов ясна - НЕ нужно оборачивать растровую картинку в мувик и делать над ней анимацию во флеше, это вся причина лагов. Как исправить:
1) Добавлять готовую растровую картинку сразу на сцену, НИ В КОЕМ случает НЕ НУЖНО оборачивать её ни в какие мувиклипы.
2) Анимацию вращения и увеличения создавать программно.

Итог: лагов не будет.

caseyryan 18.12.2015 22:15

Цитата:

1) Добавлять готовую растровую картинку сразу на сцену, НИ В КОЕМ случает НЕ НУЖНО оборачивать её ни в какие мувиклипы.
С чего бы это? Мувиклип это просто контейнер. Он никак не превратит растрову картинку в векторную. Причина лагов у него была в векторных масках. В моем файле тоже растровая картинка добавляется в контейнер, и это не приводит ни как каким лагам
Цитата:

2) Анимацию вращения и увеличения создавать программно.
То же не понятно как это может влиять на наличие лагов

zCHESNOKz 18.12.2015 22:32

Цитата:

Сообщение от Bletraut (Сообщение 1189764)
Просмотрел исходник, причина лагов ясна - НЕ нужно оборачивать растровую картинку в мувик и делать над ней анимацию во флеше, это вся причина лагов. Как исправить:
1) Добавлять готовую растровую картинку сразу на сцену, НИ В КОЕМ случает НЕ НУЖНО оборачивать её ни в какие мувиклипы.
2) Анимацию вращения и увеличения создавать программно.

Итог: лагов не будет.


Попробовал. Серьезно, ничего не изменилось.(

Bletraut 18.12.2015 22:32

Цитата:

С чего бы это? Мувиклип это просто контейнер. Он никак не превратит растрову картинку в векторную. Причина лагов у него была в векторных масках. В моем файле тоже растровая картинка добавляется в контейнер, и это не приводит ни как каким лагам
Зачем для битматы делать ещё один контейнер?

Цитата:

То же не понятно как это может влиять на наличие лагов
Если убрать флешевскую анимацию и сделать rotation += 10, то лаги исчезают

Добавлено через 39 секунд
Код AS3:

Попробовал. Серьезно, ничего не изменилось.(

Придется выложить исходник

Добавлено через 22 минуты
Все дело в альфа канале. Если убрать у картинок прозрачность, лаги пропадают. Проблема в этом.

Добавлено через 30 минут
Пример со спрайтами теперь жутко лагает. Всего лишь выставлена прозрачность.

Код AS3:

package {
        import flash.display.Bitmap;
        import flash.display.BitmapData;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.geom.Point;
 
        [SWF(frameRate = 30)]
        public class ImagesRotation extends Sprite {
 
                private var _allObjects:Array = [];
 
                public function ImagesRotation() {
 
                        for (var i:int = 0; i < 200; i++) {
                                var b:Bitmap = new Bitmap(new BitmapData(100, 100, true, Math.random() * 100000000));
                                var s:Sprite = new Sprite();
                                var pos:Point = getRandomPosition();
                                b.x        = -b.width >> 1;
                                b.y        = -b.height >> 1;
                                s.x        = pos.x;
                                s.y        = pos.y;
                                s.addChild(b);
                                addChild(s);
                                _allObjects.push(s);
                        }
                        addChild(new Stats());
                        addEventListener(Event.ENTER_FRAME, onEnterFrame);
                }
 
                private function onEnterFrame(e:Event):void {
                        for each (var sprite:Sprite in _allObjects) {
                                sprite.rotation += 20;
                        }
                }
                private function getRandomPosition():Point {
                        return new Point(stage.stageWidth * Math.random(), stage.stageHeight * Math.random());
                }
        }
 
}


zCHESNOKz 18.12.2015 23:21

Цитата:

Сообщение от Bletraut (Сообщение 1189771)
Все дело в альфа канале. Если убрать у картинок прозрачность, лаги пропадают. Проблема в этом.
[/as3]

Если честно то это вообще перебор. Если лаги берутся:
-от прозрачности;
-от векторных масок;
-от огромного[сарказм] количество клипов, 30 штук;
(возможно что еще и от длинных анимаций)

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

(Возможно это тоже имеет значение но, анимация медленная 5 сек./1 оборот, также и с scale)

Bletraut 18.12.2015 23:23

Лаги только от прозрачности.

caseyryan 18.12.2015 23:24

Цитата:

Сообщение от Bletraut (Сообщение 1189771)
Зачем для битматы делать ещё один контейнер?

Хотя бы для того, чтобы можно было легко сместить ее относительно точки трансформации. Или ты не ищешь легких путей и всегда вращаешь объекты через матрицы?


А вот с альфа каналом действительно тормозит сильнее

Bletraut 18.12.2015 23:25

Во всяком случае, прозрачность играет самую весомую роль.

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

Сообщение от caseyryan (Сообщение 1189778)
Хотя бы для того, чтобы можно было легко сместить ее относительно точки трансформации. Или ты не ищешь легких путей и всегда вращаешь объекты через матрицы?

Я работаю с 3д, там только матрицы.

elder_Nosferatu 19.12.2015 12:52

В 2д тоже только матрицы. Вопрос кому их считать. И неужели во всем 3д не найдется места таком понятию, как контейнер ;) ?

Bletraut 19.12.2015 13:06

Цитата:

И неужели во всем 3д не найдется места таком понятию, как контейнер ?
А у контейнера что, нет матриц? Добавляя модель в дополнительную обертку мы получаем 2 преобразования матрицы вместо одного.

caseyryan 19.12.2015 14:37

При чем тут матрицы контейнера? ) Я не хочу работать с матрицами напрямую, когда можно легко поворачивать контейнер. Пусть пересчет матриц на себя берет комп.
Руководствуясь такой логикой, можно вообще на ассемблере писать. Какая разница, если результат один)

ZackMercury 19.12.2015 15:11

caseyryan, разница в том, что код на ассемблере сложно заставить тормозить, в отличии от первого.
В С++, например, ассемблерные вставки в узких местах - это норма.

caseyryan 19.12.2015 15:54

Цитата:

Сообщение от ZackMercury (Сообщение 1189788)
caseyryan, разница в том, что код на ассемблере сложно заставить тормозить, в отличии от первого.
В С++, например, ассемблерные вставки в узких местах - это норма.

Ты сам то понял что написал?

ZackMercury 19.12.2015 17:22

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

elder_Nosferatu 19.12.2015 19:44

Посчитать по 100500 матриц в каждом кадре с ожидаемым фпс, близким к 60 или посчитать 100500 матриц за всю (длительную) историю работы приложения. Оптимизация - это круто, но не забывайте, что кроме оптимизации кода существуют и другие направления оптимизации. И даже читабельность исходного кода может быть оптимизирована даже без комментариев. Само собой, если ты просто дышишь матрицами и их преобразованиями, то нет смысла свой приватный код захламлять разными к(а)нтейнераи даже на этапе инициализации. Но в другом случае операции перемещения, масштабирования, сдвига и вращения куда более понятны, чем универсальное преобразование в виде матрицы. Лишь бы эта строчка не попадала в "узкое место".

zCHESNOKz 20.12.2015 13:21

Цитата:

Сообщение от ZackMercury (Сообщение 1189794)
Думаю, трансформации матриц в подобном случае будут работать эффективней контейнера из-за меньшего уровня абстракции.

Вы про это?

Код AS3:

clip_Matrix.tx = clipBitmap.x - clip.width/2;
clip_Matrix.ty = clipBitmap.y - clip.height/2;
 
clip_Matrix.rotate( Math.PI * 1 / 180);
 
clip_Matrix.tx = clipBitmap.x - clip.width;
clip_Matrix.ty = clipBitmap.y - clip.height;


ZackMercury 20.12.2015 16:34

elder_Nosferatu прав, в этом месте трансформация не решит. Разве что совсем мизер(меньше процента).
Так что не парьтесь.

zCHESNOKz 20.12.2015 16:42

Цитата:

Сообщение от ZackMercury (Сообщение 1189803)
elder_Nosferatu прав, в этом месте трансформация не решит. Разве что совсем мизер(меньше процента).
Так что не парьтесь.

Как раз хотел написать о том, что разницы я не увидел

caseyryan 20.12.2015 20:02

Цитата:

Сообщение от ZackMercury (Сообщение 1189794)
То, что пример с ассемблером - некорректный.
Его используют там, где он нужен. То же и с матрицами.
Думаю, трансформации матриц в подобном случае будут работать эффективней контейнера из-за меньшего уровня абстракции.


Это называется "слышит звон, да не знает где он")
Пример с ассемблером, точно такой же как и с матицами. С ним тоже меньше уровней абстракции. Их как раз и придумывали для того, чтобы упростить работу программистам. Иначе все бы просто писали на ассемблере и было все к шоколаде


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

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