![]() |
Движение множества символов
Здравствуйте!
Начал осваивать flash + actionscript 3.0 и столкнулся с проблемкой Имею поле 800x700px, на котором постепенно появляются (выходят из-за границы поля) символы (для простоты, представляют собой небольшие прямоугольнички, рисуемые в actionscript) создаю класс, в который засовываю массив этих символов, в этом же классе добавляю обработчик на ENTER_FRAME и реализую перемещение каждого из символов, в цикле пробегая по массиву таким образом при количестве в 100 символов, все начинает безбожно тормозить (около 15фпс), а если усложнить и добавить анимацию в символы, то вообще беда Как по правильному реализуется перемещение множества объектов на сцене? какие-то подводные камни? оптимизация? Дайте совет Спасибо |
Сразу бы код выкладывали, раз вопрос про оптимизацию.
|
cacheAsBitmap возможно поможет. А вообще рендер у флеша софтварный и медленный :)
|
ничего сверхъестественного
Код AS3:
Код AS3:
Код AS3:
|
то есть суть в том, что создается некое подобие игрушки Crimsonland, наверное все знают) так вот оригинал конечно был нефлешовый, но там одновременно на экране собиралось 100-200 монстриков, причем все активно шевелилось, пересчитывалось и т.д.
пытаясь повторить то же самое во флеше получаю дикие тормоза элементарно при перемещении сотни прямоугольничков |
может лучше сделать класс для каждого символа и в нём прописать движение, тормозить тогда возможно не будет
|
Один общий цикл enterFrame, где двигать все объекты сразу. Ну кэширование поставить.
Цитата:
|
Цитата:
На сцене создается один объект CreepCrowd и внутри него в enterFrame все это хозяйство крутится А насчет кеширования можно по подробнее?) хммм...взял тестовый пример с частицами, включив отображение области перерисовки, заметил, что перерисовывается вся область экрана, что не есть гуд попробовал избавиться от класса с символами, ради эксперимента, поместив создание и перемещение всех символов прямо в кадре на таймлайне, и результат на лицо: экран стал перерисовываться не полностью, а фрагментами с наибольшим скоплением символов, в результате был получен ОЧЕНЬ большой прирост производительности однако применяя данный подход к текущему случаю, прироста производительности ровным образом не наблюдается совсем....интересно почему |
cacheAsBitmap помогает только при translate-преобразованиях (изменяются x, y). Остальные преобразования — rotation, scale и skew вынуждают FP заново рендерить из вектора.
|
Кстати, на мой взгляд, все, что не требует векторных преобразований в процессе визуализации, надо гнать в растр. Лучше самостоятельно. Векторное дерево с cashAsBitmap и оно же собранное и целиком записанное как битмап - две большие разницы.
Но к рассматриваемому случаю это не относится. :) Вопрос к автору - если убрать текст (вообще), производительность повышается? Если повышается, можно попробовать заэмбедить шрифт в тексфилд. Если не повышается - подумать, как уменьшить количество вычислений. Тут, опять же, можно заменить сложные вычисления на простые (itemNamed.x += 2; ) и посмотреть, как все шевелится. Если 100 пустых квадратов без текста, передвигаемые за итерацию на 2 пикселя, не будут шевелиться - значит достигнут предел производительности ФП. Добавлено через 22 минуты на самом деле я вот тут запустил 1000 полосочек в упрощенном режиме, тормозов нет вообще: Код AS3:
Вот пример, если лень компилировать: http://mikhailk.ru/testing/clipMoving/ Добавлено через 1 час 24 минуты Стало интересно, попробовал с текстом, производительность упала примерно в 6 раз. http://mikhailk.ru/testing/clipMoving/withText.html |
| Часовой пояс GMT +4, время: 12:11. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.