Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 12.09.2013, 16:35
Фенёк вне форума Посмотреть профиль Отправить личное сообщение для Фенёк Найти все сообщения от Фенёк
  № 1  
Ответить с цитированием
Фенёк

Регистрация: May 2011
Сообщений: 221
Question Скорость работы addChild() и removeChild()

Собственно передо мной стоит задача при выполнении которой будет необходимо довольно часто добавлять/удалять объекты (делаю скроллилку большого количества объектов и для того, чтобы сократить нагрузку как на память так и на ЦП хочу рисовать только те ячейки содержимого, которые будут попадать в область видимости).

Очень много наслышан о том, что методы addChild() и removeChild() занимают много процессорного времени. Я так понимаю, что это связано с тем каким образом в AS3 работают события, а потому помимо добавления объекта в список отображения происходят некие построения связей между объектами.

Так вот очень хотелось бы узнать насколько на самом деле плохо часто добавлять и удалять объекты.

В качестве альтернативного решения пробовал использовать bitmap'ы срисованные с оригинальных объектов, но надо сказать это довольно неудобно и порождает проволакивание за собой всяких «хвостиков» обязывающих на каждое изменение «родного» мувика не забывать перерисовать битмапу. Ну и да, это несет в себе определенный ряд проблем, если есть необходимость сделать содержимое интерактивным (например, сделать возможность поставить галочку в ячейке).

Может быть есть возможность хранить мувики в каком-нибудь «буффере» чтобы исключить операции не касающиеся непосредственно отображения?

Старый 12.09.2013, 17:33
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 2  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Малоизвестный факт про добавление/удаление в списке отображения:
http://flashgameblogs.ru/blog/actionscript/32.html
Т.е. объекты быстро удаляются из начала списка отображения (removeChildAt(0)).
По логике, добавляться тоже должны быстрее в начало(сам не проверял, там всётки есть проверка на наличие объекта и просто ли они по parent смотрят или по списку бегают - не знаю)

А вообще по поводу производительности addChild/RemoveChild - оно всё в AS3 не быстро работает, даже a > 0 ? a : -a работает в несколько раз быстрее Math.abs(a), потому что вызов функции жутко медленный. Так что если проблем нет - не заморачивайтесь с отрисовкой в битмап-дату (там надо очень хорошо знать что делаешь, иначе только медленнее получится)

Что касается событий:
- ADDED_TO_STAGE, REMOVED_FROM_STAGE, и т.д. вобщем не создаются, если на них не подписываться, ну проверка наличия слушателя выполняется, но это не дорого.
- Мышиные события могут вызывать тормоза при большом количестве объектов (сама проверка положения мыши не дешёвой становится при таком количестве). Лечится сначала выставлением всяческих mouseEnabled/mouseChildrenEnabled в false, а потом удалением выходящих за пределы экрана спрайтов из списка отображения(в памяти они никому не мешают даже в больших количествах, достаточно из списка убрать). Проверяется, в обработке ли событий дело, тем, что fps падает при двидении мышью над флешкой.

А вообще, если нужна производительность, то используйте Starling (сам не использовал). Там принципиально другая схема работы с выводом на экран, с задействованием возможностей видеокарты, и обработка мыши, соответственно другая. Там сложнее несколько в том плане, что текстуры придется подготавливать, работать только с растром, на треугольники ваши спрайты разбивать и т.д.

Старый 12.09.2013, 17:46
Фенёк вне форума Посмотреть профиль Отправить личное сообщение для Фенёк Найти все сообщения от Фенёк
  № 3  
Ответить с цитированием
Фенёк

Регистрация: May 2011
Сообщений: 221
Очень хочу добраться до быстрого рисования графики, но к сожалению работаю над проектом построенным без этой технологии.

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

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

Старый 12.09.2013, 18:39
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 4  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
Хотел бы поинтересоваться, уж покуда зашла речь, почему вызовы функций происходят медленно, есть ли способы оптимизации?
Это нативная вещь, её разработчики флешплеера и компилятора должны оптимизировать.

Цитата:
Ну и насчет битмап даты. Я просто брал прямоугольник в который срисовывал все содержимое мувика и перекладывал его на битмапу которую отображал. В чем потенциально могут крыться проблемы?
Отдельные битмапы с битмап-датами, которые не меняются и просто гоняются по экрану?
Я просто думал вы заморачиваетесь с отрисовкой всего в одну битмапу при любом изменении.

Создать новую тему Ответ Часовой пояс GMT +4, время: 22:52.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Теги
addChild , removeChild , быстро , или , медленно
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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