|
|
|||||
Регистрация: Feb 2012
Сообщений: 11
|
Нагрузка на ЦП
Добрый день! Есть проблема, во флешке создается много объектов, которые перемещаются, вращаются и взаимодействуют друг с другом. От этого процессор нагружается и начинает тормозить. Причем загружается он всего на 25% (процессор Core2 Quad), там как раз 4 потока и флеш занимает полностью один из этих потоков. Полазив в интернете, я нашел, что разве некоторые фильтры и видео могут работать в другом потоке, что собственно особо не помогает, остальное вычисления и отрисовка идут в одном потоке.
Может кто-нибудь слышал, есть какие-нибудь хитрости чтобы это ускорить или как-нибудь обойти? весь код, особенно критические моменты оптимизированы, но флешка работает в некоторые моменты на пределе возможностей. |
|
|||||
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
Скорость рендера на флэш - это его больное место.
Есть набор хитростей для ускорения рендера (основанные в основном на том, что просто битмапа рендерится быстро, т.е. cacheAsBitmap для неотскейленных и не вращающихся работа всяко разная с битмапами итп.). Это вообще-то всё гуглится и тут в поиске тоже находится. Есть AGAL, который рендерит на видеокарте (но работа с ним отличается от работы с остальной графикой).
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. |
|
|||||
думаю тут скорее оптимизации кода больше внимания уделить надо...
ЗЫ: у меня вообще влешка больше 8% кушать не может =) все подвижные элементы(если они не должны с пользователем контактировать) делаешь в невидимом спрайте... который потом после всех перемещений отрисовываешь в битмапу методом draw()... так работает на порядок быстрее чем даже просто chageAsBitmap Последний раз редактировалось dsQuadro; 07.03.2012 в 18:44. |
|
|||||
Регистрация: Feb 2012
Сообщений: 11
|
cacheAsBitmap и другие хитрости я конечно использую, везде где возможно заменил Array на Vector, вызовы элементов массивов все идут по ссылке, все что уходит за пределы видимости либо удаляется совсем, либо просто удаляется со сцены и т. д. И, в принципе, от первоначальных показателей это дало существенный прирост, однако не решило проблему.
это делать на каждом ENTER_FRAME? Последний раз редактировалось mooncar; 07.03.2012 в 19:14. |
|
|||||
Регистрация: Apr 2011
Сообщений: 38
|
|
|
|||||
Можете через один, если вам хочется
Но имелось в виду в каждом. Как же иначе? С некоторыми извращениями можно заставить и реагировать с пользователем. Если перемещение в контейнере не добавленном в список отображения, то getObjectsUnderPoint вам в помощь. Получаем список объектов при мышином событии, которое поймал вьюпорт и вручную диспетчим от самого верхнего чайлда. Метод возвращает только объекты самого нижнего уровня иерархии отображения, поэтому появляются свои тонкости реализации. Если используете блиттинг (то есть вообще без дисплейобджектконтейнеров, а своя иерархия), то Bitmapdata:hitTest вам в руки.
__________________
9 из 10 голосов в моей голове сказали наркотикам "НЕТ" Мои ачивки: художник-паразит. Последний раз редактировалось ChuwY; 09.03.2012 в 17:21. |
|
|||||
__________________
Сам себе репортер |
|
|||||
как уже ответил ChuwY можно через один... но если серьезно то да, в каждом кадре... хотя я предпочитаю не по энтерФрейм, а по таймеру все это делать...
|
|
|||||
Вообще-то наоборот. Это энтерфрейм затупливает.
То есть, начинает реже рассылаться. А таймер фигачит через фиксированное время вне зависимости от фокуса.
__________________
9 из 10 голосов в моей голове сказали наркотикам "НЕТ" Мои ачивки: художник-паразит. |
|
|||||
.
|
А зачем вам всем ENTER_FRAME? Обновление экрана делается по просьбе представлений. Старшая из них делает stage.invalidate(). А остальные рендерят по Event.RENDER.
|
Часовой пояс GMT +4, время: 12:53. |
|
« Предыдущая тема | Следующая тема » |
|
|