PDA

Просмотр полной версии : Низкий fps анимированных Bitmap'ов.


mr.TrueMan
11.03.2013, 22:59
Здраствуйте.
Недавно закончил разработку одного проекта и обнаружил для себя неприятный факт:
При тестирование приложения в разных браузерах при движение Bitmap'ов я заметил перепады fps конкретно в их анимации.
Если в Firefox'е и хромах отклонения небольшие 3-4 fps, то в Opera вообще беда.
Fps просто ужасный, на глаз 10-12, и повторюсь, если не ошибаюсь fps низкий конкретно в анимации Bitmap'а.
У текста и фигур проблем нет или по крайней мере fps не так сильно отклоняется.
Анимация создаётся программно.
Замерка fps классом FPSMemCounter ( наверно знаете ), перепадов не показывает, хотя нормально отображало их в других приложениях.
Использование параметра cacheAsBitmap для не масштабируемых элементов не дало существенных результатов.
Вопрос: кто-нибудь сталкивался с подобным, как можно повысить показатели и собственно в чём проблема?

Проблема решена:
Помог wmode=Window, для Оперы это играет важную роль. Спасибо за помощь.

Hauts
12.03.2013, 07:41
А можно посмотреть на реализацию "анимированных Bitmap`ов"?

И, желательно, пример "вживую".

caseyryan
12.03.2013, 09:26
По идее должно быть наоборот. Тормозить сильнее должна векторная графика

iflamberg
12.03.2013, 14:15
wmode=transparent?

mr.TrueMan
12.03.2013, 16:00
Hauts, изображения анимируется с помощью этого класса, основанного на AnimateProperty (http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/mx/effects/AnimateProperty.html#propertySummary)
package code.effects.tweens
{
import flash.display.DisplayObject;
import mx.effects.AnimateProperty;
import mx.effects.easing.*;

public class Tweener extends AnimateProperty
{
public function Tweener(target:DisplayObject,property:String,easingType:Function,start:Number,end:Number,duration:Number):void {
super(target);
this.easingFunction = (easingType!=null)?easingType:Linear.easeIn;
this.property = property;
this.fromValue = start;
this.toValue = end;
this.duration = duration;
}
}

}
Ты это хотел увидеть?
iflamberg, wmode стоит opaque, transparent не могу установить, т.к. приложение используется в ВК.

iflamberg
12.03.2013, 16:14
а чего такой странный самописный твиннер? AnimateProperty, он же тяжелый. TweenLite, GTween, caurina Tweener?

mr.TrueMan
12.03.2013, 16:24
iflamberg, до этого не замечал особой разницы. Сейчас попробую сменить, надеюсь поможет.

Hauts
12.03.2013, 17:22
mr.TrueMan, я как-то не понял, что вы имеете в виду под словами "Низкий fps анимированных Bitmap'ов". Первое, что я подумал, прочитав такую формулировку — это про растровое кэширование векторной графики и всякие ухищрения для увеличения скорости рендеринга.

А вы, как я понимаю, просто двигаете картинки, раз приводите пример твинера.

Вам верно подсказали, используйте твинер пошустрее.

mr.TrueMan
12.03.2013, 23:15
iflamberg, перевёл всю программную анимацию на caurina Tweener, в опере наблюдаются улучшения, но этого недостаточно. Но теперь знаю в какую сторону рыть.
iflamberg и Hauts спасибо, надеюсь в скором времени получиться решить мою проблему. Потестирую TweenLite, гляну на результаты.

iflamberg
12.03.2013, 23:47
Боюсь, замена твинера на твинлайт уже не даст какой-либо заметной разницы. Как ни печально, но производительность флеша в плеере и в браузере - разные вещи. И, да, опера особенно тормозная в этом плане.

Hauts
13.03.2013, 12:36
iflamberg, что ж вы так сразу-то? Я более, чем уверен, что в конкретно это случае можно многое улучшить. Вот только самой флэшки пока не видел :)

iflamberg
13.03.2013, 13:15
Ну, наверняка еще где-то можно оптимизировать, но конкретно замена caurina tweener на TweenLite на мой взгляд уже бесмысленна, это не даст какого-либо существенного прироста.

mr.TrueMan
13.03.2013, 17:26
iflamberg, может быть, но вот (http://www.flasher.ru/forum/showthread.php?t=140476) похожая история, правда ей почти 5 лет и анимация была под as 2.0.
Hauts, сама флэшка что-то вроде тира ( социальная игра ), а тормозит само движение снарядов к определённой точке, да и собственно все битмапы, которые анимированы с помощью твинера, независимо с каким битмапом работает твинер, так что скорее всего дело не в структуре кода. Хотя сейчас ещё покопаюсь, попробую оптимизировать.
P.S.
Идеи есть как можно оптимизировать код под оперу?

iflamberg
13.03.2013, 17:57
На мой взгляд надо искать источник тормозов.
Если основной источник тормозов чрезмерно большое количество битмапов на сцене, то с этим тяжело что-то сделать. Сложить фон в одну битмапу, вместо нескольких; тщательно проконтролировать, чтобы битмапы, которые находятся за пределами видимого экрана не отображались, что тут еще можно придумать? Изменить концепцию самой игры, разве что.
У меня была как-та проблема с тормозами из-за того, что вместо чистых битмап я использовал мувиклип, где в разных кадрах были разные битмапы. Т.е. я пихал мувик на сцену, говорил gotoAndStop(x) и получал нужную картинку. Замена на чистый битмап дала существенный прирост.
Так же проблемаможет быть в том, что очень большое кол-во объектов то создается, то уничтожается. Т.е. проблема не в самом движении, а в том, что флешка все время то выделяет память под вновь созданные объекты, то чистит память от освободившихся. Решается созданием пула - вместо того, чтобы удалять объекты, их просто убирают со сцены, но хранят на них ссылки, по необходимости достают и запускают заново.
Так же проблема может быть в неосвобождении памяти. Характерные признаки - поначалу ничего не тормозит, но со временем накапливаются тормоза.
Проблема так же может быть в неоптимизированной математике. Неоптимальные алгоритмы проверки коллизий и все такое.

Ну и, наконец, wmode=opaque, это сразу -% производительности в браузере по сравнению с плеером. wmode=transparent, конечно еще более медленный, но все равно, по возможности надо все таки в window, я не работал с вк, не знаю, можно ли устроить.

Александр Мостовой
13.03.2013, 18:19
Если битмапов большое количество то координальное решение вопроса переход на аппаратную поддержку видяхи. ПОпробуйте движок starling

mr.TrueMan
13.03.2013, 18:36
iflamberg, пул использую, каждый снаряд, что отправляется, используется повторно, на экране остаётся лишь след от попадания. Я тщательно контролирую все объекты на экране + все битмапы закреплены на одной битмап дате, стараюсь где возможно пользоваться типизированным массивами. Единственное что может быть перегруз экрана оставленными следами ( т.е. битмапами ), но тогда бы тормоза появлялись со временем, а здесь при запуске любого снаряда + тормозит даже информер на любом игровом экране, появление которого ( иммею ввиду информер ) основано на твинере.
Математики у меня не так уж и много в данном действие, думаю сама проблема в браузере, нужно под него как то настраивать.
wmode=Window можно поставить, сейчас попробую.

Добавлено через 8 минут
iflamberg, большое спасибо. wmode=Window помог, проблем в браузерах пока не наблюдается.