Бесплатно скачать Adobe Flash Player

Ростислав Сирык: PureMVC в картинках, доклад c UAFPUG-1

Продолжаем выкладывать презентации с UAFPUG-1 в порядке изложения докладов на самой встрече.

Предупреждение: материал представлен "как был". Мы решили, что лучше выложить презентации такими сейчас, чем выложить их слишком поздно или не выложить вообще.

Итак, презентация вторая — от Ростислава '_rost' Сирыка. У нее есть особенность: презентация оптимизирована под устный доклад, поэтому не серчайте, если мало буков (зато много ссылок :):

Скачать файл презентации. Продолжение следует.

См. также первую презентацию: Эльдар Прилуцкий, Событийная модель AS3.0 и втоарую: Денис Папазов, Flash Media Server 2 и новое в FMS3.

Писал: Rost, 26 Март 2008 16:39

Комментарии:

Молодца!

injun #576871 - 26 Март 2008 17:23

Да... больше про рефакторинг, чем про PureMVC, придется делать вторую часть :)

Рост - 26 Март 2008 17:38

А по какому принципу идет подгрузка, как то квадратами.
И еще, какие используется приемы избавления от тормозов, при большом кол. объектов при драге и тд..
если это не секрет ;)

Vee - 26 Март 2008 19:55

Это не секрет и малая часть этого рассказывалас собственно на встрече (но очень сжато: и даже так я не уместился в отведенное время).

Если коротко:

- Подгрузка идет слоями (19 шт), деленными на квадраты (я назвал их Patches, хотя стоило назвать Tiles), а квадраты поделены на собственно объекты.
- По этому же принципу идет рендеринг / показ / сокрытие подгруженного.

- Приемы избавления от тормозов:
1. Карта растрируется перед каждым перетаскиванием (тащим растр, а не вектор).
1.1 Переключается качество сцены для перетаскивания: stage.quality = StageQuality.LOW / HIGH
2. Интерактивные объекты карты (а таковым может быть любой) не работают с событиями -- за все события отвечает один объект, а именно сама карта.
3. Форсируется сбощик мусора для освобожения памяти.
4. Для всех addEventListener - используются weak references:
newPoint.addEventListener(MouseEvent.CLICK, onPointClick, false, 0, true);
5. Для всех спрайтов (объектов карты) по умолчанию отключены mouseEnabled, mouseChildren, buttonMode и tabEnabled -- равны false.
6. Для всех словарей также используюится Weak References -- new Dictionary(true);
7. Для отображения адресов используется собсвенная реализация Bitmap fonts -- все адреса это не текстовые поля, а именно генеренные картинки.
8. Прячутся выходящие за пределы экрана квадраты карты / объекты втутри квадратов карты.
9. Используются типы ints/uints вместо Number -- для оптимизации памяти.
10. Для отрисовки названий улиц (текст вдоль кривой) используются классы проекта Bezier.ru -- очень помогли, буквально спасли этот функционал.

Есть еще несколько оптимизаций, и я вижу, что надо писать отдельную статью и делать отдельный доклад о них.

Наверное, я так и сделаю )

Рост - 26 Март 2008 20:18

> 1. Карта растрируется перед каждым перетаскиванием (тащим растр, а не вектор).
пробовал тоже так делать, но не реально растет используемая память (доходило до 300МБ и более).
мне приходилось применять cacheAsBitmap=true для каждого объекта, к родителю применить не мог так как его размеры быль больше 2880.
> 3. Форсируется сбощик мусора для освобожения памяти.
а это как?
> 8. Прячутся выходящие за пределы экрана квадраты карты / объекты втутри квадратов карты.
примерно тоже так делал. подписывал все объекты (dispatcher) и каждый драг опрашивал на hitTestObject экрана, то что true отображал и cacheAsBitmap остальное обратное. может можно как то оптимальнее?

Vee - 26 Март 2008 22:08

>> 1. но не реально растет используемая память (доходило до 300МБ и более).

Скорее всего дело в том, что ты явным образом не удалял битмапДату. Нужно делать

if(bmpMap != null) { bmpMap.dispose() };

каждый раз, когда "старая" битмапа тебе уже не нужна (у меня это происходит каждый раз при обновлении данных).

>> 3. Форсиование сборщика мусора:

Это "незаконный" хак с созданием двух одноименных локальных соединений (не люблю хаки):
private function tryRemoveGarbage():void
{
try
{
new LocalConnection().connect('pleaseRemoveGarbage');
new LocalConnection().connect('pleaseRemoveGarbage');
}
catch (e:*)
{
}
}

Кстати, у меня этот код оказался закомментированным -- то есть данная карта сейчас работает и без этого хака. Так что этот третий пункт можно уже вычеркнуть :)

> 8. Прячутся выходящие за пределы экрана квадраты карты / объекты втутри квадратов карты.

Я думаю, что голая математика оптимальнее. Я использовал такой подход: есть viewRect: Rectangle, описывающий видимую область экрана. А каждый квадрат карты имеет свой thisRect: Rectangle, описывающий его габариты. При перетаскивании карты проверяется на пересечение этих Rectangle'ов:

isEnabledInView = thisRect.intersects(viewRect);

если isEnabledInView == true, то как минимум visible = isEnabledInView; кроме этого, может потребоваться рендеринг объекта, если он еще не был загружен.

Рост - 27 Март 2008 11:32

Из презентации понятно только то, что PureMVC - это типо круто.
И снова имел возможность помедитировать на Чисто Диаграмму (она у меня почему-то всё время ассоциируется с множеством Мандельброта).

Но вот что это такое, с чем его едят и с чего вообще начать - так и не понял.

С нетерпением жду следующую презентацию - "PureMVC для тупых".
Предлагаю сделать на флеше - чтобы не просто статичные кадры были, а всякие фигулинки летали, копошились и прыгали, чтобы продемонстрировать, что вообще куда идёт и кто кого использует.

// взрывающийся вертолет не обязательно

Dan - 27 Март 2008 11:33

Dan, твоя критика совершенно уместна. К сожалению, в этот доклад я попытался слишком много втиснуть. По времени рассказ о рефакторинге занял большую половину, а еще нужно было рассказать о самой карте, так что на сам PureMVC осталась приблизительно треть времени. Хотя он нем я все же рассказал практически все -- но именно рассказал ("презентация оптимизирована под устный доклад").

Так что будет еще одна презентация. Не для тупых, а для заинтересовавшихся, и оптимизированная под собственно изучение вопроса.

Идея с анимацией хороша (я тоже об этом думал).

А диаграма была использована как коврик для медитации :)

Рост - 27 Март 2008 11:43

> на сам PureMVC осталась приблизительно треть времени.
Рост, а тебя не затруднит подготовить полноценный доклад, ну чтоб монументально так? :)

injun #576871 - 27 Март 2008 15:52

ЗЫ: а то тема больно интересная! :)

injun #576871 - 27 Март 2008 15:55

injun, в данном случае попытка монументальности мне дорого обошлась -- начал аж с необходимости рефакторинга, продолжил самим рефактрингом, на этом немного застрял -- в результате не успел.

Поэтому просьба: уточни, какие конкретно моменты монументальности тебя интересуют, я постаряюсь это _очень учесть при составлении монументального доклада. Именно твои соображения / вопросы интересуют оч сильно, так что пиши все, что придет в голову (плиииииз).

Рост - 27 Март 2008 20:10

Ну да, меня как раз и интересует (наверное не меня одного) и сам рефакторинг и дисциплина разработки на PureMVC. Я имею ввиду следующее: трудозатраты по полному/частичному преобразованию внутренней структуры с ... на pureMVC; юнит-тестирование (FlexUnit, AsUnit) в частности, и вообще регрессионное тестирование; паттерны (вообще отдельно интересная тема); общие отличия ООП от других парадигм - к примеру, от аспектно-ориентированного программирования (Fling, AIoC) в сравнении; полный цикл разработки/рефакторинга... Ээээ, ну вот примерно это интересует. :) Ну это пожалуй будет супер-монументальный труд. :)

injun #576871 - 27 Март 2008 22:40



Подписаться на новости (RSS)




Примечания:
Статус документа
: в процессе
   2002-2009 Производство: Ростислав Сирык · О проекте · Подписка на новости (RSS)