PDA

Просмотр полной версии : Как уменьшить нагрузку на проц при 5000 мувиках


GFreemen
23.01.2008, 23:12
Добрый день.
Делается програмка рисования.
Атачится большое число клипов (от 5000). Естественно при этом хорошо нагружается процессор - 35~55%. А если при этом еще используется onMouseMove - то просто смерть.
Все клипы - расширение класа MovieClip, в класе имеется onPress.
После эксперементов понял, что тормоза из-за большого количества клипов.
Возможно ли что-нить предпринять для уменьшения нагрузки на проц.
Может в моем класе можно убрать половину неипользуемых мной методов класа MovieClip?

CrazyFlasher
23.01.2008, 23:21
использовать BitmapData и из отрисованных клипов делать растровую картинку

GFreemen
24.01.2008, 02:51
С BitmapData не работал, поэтому вопрос
я так понимаю, необходимо все мои клипы перевести в растр, а потом из библиотеки методом attachBitmap атачить в клипы? Но все равно получится такое же огромное кол-во клипов. Ведь тормоза не из-за того, что в клипах нарисован вектр, а из-за кол-ва клипов. (при атаче 5000 пустых клипов нагрузка на проц такая же как если клипы не пустые).

MrPoma
24.01.2008, 03:01
тогда сделайте меньше тысяч клипов

etc
24.01.2008, 03:03
А зачем вам столько клипов?

GFreemen
24.01.2008, 10:49
Программа - графический редактор схем типа Visio.
Пользователь рисует линии, достает из библиотеки элементы. Все это можно зумировать, перемещать, поворачивать и редактировать. Чтение с винта и запись - из Цинка.
Так вот есть такие схемы где число этих элементов приближается к числу 5000. А получается, что каждый элемент (включая линию) находится в отдельном клипе.

etc
24.01.2008, 10:55
cacheAsBitmap попробуйте.

CrazyFlasher
24.01.2008, 11:00
вы неправильно меня поняли...можно к примеру после аттача сотни клипов всю сцену переделывать в одну растровую картинку а клипы удалять...и никаких тормозов не будет

GFreemen
24.01.2008, 11:36
2 CrazyFlasher
Да, но тогда не будут работать onPressы во всех этих клипах, что для редактора недопустимо.
2 __etc
Попробовал cacheAsBitmap на каждый клип, но особой прибавки не заметил. Дело в том, что в этих клипах нарисовано совсем ничего - менее 10 линий. Т.е. я подозреваю векторная нагруженность мала.

У меня есть идея, но я незнаю возможна ли она в принципе:
Все мои клипы принадлежат класу - который extends MovieClip. А нельзя ли моим класом, так сказать, не расширить клас MovieClip, а "сузить" его - убрав все то чем я не пользуюсь и таким образом облегчить MovieClip?

CrazyFlasher
24.01.2008, 11:42
странный редактор...интересно будет взглянуть

"сузить" нельзя =)

wvxvw
24.01.2008, 11:53
Мне как-то затруднительно представить интерфейс с 5К+ кликабельных элементов... юзера перед использованием такой штуки нужно на несколько лет на курсы отправлять =) и то вряд ли выучится =)
*Вспомнился фильм "Газонокосильщик"*
Мне кажется, что-то не так изначально в пранировании...

etc
24.01.2008, 12:55
У меня есть идея, но я незнаю возможна ли она в принципе:
Все мои клипы принадлежат класу - который extends MovieClip. А нельзя ли моим класом, так сказать, не расширить клас MovieClip, а "сузить" его - убрав все то чем я не пользуюсь и таким образом облегчить MovieClip?
Нет, нельзя. 5000 клипов — это ошибка проектирования, больше ничего не могу сказать.

GFreemen
24.01.2008, 14:05
Всем большое спасибо.
2 wvxvw
Представьте себе автокад - сколько там может быть кликабельных элементов?
Насчет планирования - в целом не спорю. Т.к. с каждым днем работы приходят новые идеи как можно было бы лучше сделать уже сделанное - но я пробовал - это тупиковый путь, т.к. буду заниматься только переделыванием, а не добавлением нового.
2 CrazyFlasher
Если интересно - вот сделанная мной swf. Естественно сохранение и чтение с винта не работает. Однако просто рисовать, добавлять и редактировать элементы можно.
Колесиком - зумируем, при зажатой средней кнопке - перетаскиваем экран, двойной щелчек средней - вместить все нарисованное на экран.
При выбранном элементе стрелка - можно изменять уже нарисованные элементы, двойной щелчек на элементе - изменение параметров.
И для примера что нужно нарисовать - картинка со схемой.

CrazyFlasher
24.01.2008, 14:21
хех...неплохо...пришла идея в голову =) можно попробовать сохранять координаты отрисованных вещей...а то что на сцене, как я уже говорил, переделывать в BitmapData...если мы тыкаем мышки, то курсор проверяет в сохранённых координатах, есть ли у нас такая и если есть рисует нужный мувик...выполнение задачи не быстрое, но зато реализуемо...

DarkLight
24.01.2008, 14:29
Тут упираемся в то, что при модификации этой выделенной фигуры еще придется стирать ее из битмапа, а так как в битмапе у нас все, то в худшем случае придется перерисовывать в битмап 5000 клипов....многовато

GFreemen
24.01.2008, 14:33
2CrazyFlasher
Думал об этом. Но подозреваю, что при проверке "куда же мы ткнули" будут хорошие тормоза. Ведь для каждого элемента необходимо 4 if`а.
И еще, как тогда возможно изменять местоположение кокого-либо элемента, если у нас на одной битмапдате порядка сотни элементов.

Пока я все это писал DarkLight уже выразил мою мысль.

CrazyFlasher
24.01.2008, 14:44
ну да вообщето...надо подумать :)

wvxvw
24.01.2008, 15:33
Ну так автокад примерно и подходит под определение "на несколько лет на курсы" =)
А вообще... ну, наверное правельнее было бы хранить только абстрактое представление о том, что происходит на чертеже и отрисовывать "на заказ" нужную часть... Ну это только самые общие размышления... Так возможно, работать не на много быстрее будет, но, хотябы можно будет это как-то контролировать. Т.е. предположим, за цикл программа сможет отрисовать не больше 100 объектов, а нужно отрисовать 5000, тогда запускаем цикл 50 раз...

Волгоградец
24.01.2008, 15:54
А что если всю схему разбить, допустим, на 10 частей и с каждой отдельно работать? Ведь в том же автокаде вы не работаете со всем чертежом сразу, а лишь приближаете нужную вам часть и что-то изменяете. Правда в этом случае передвижение по участкам схемы будет не "реал-тайм", как в автокаде, а с выгрузкой и подгрузкой. А, например, при двойном клике по средней кнопке мыши, будет происходить сниматься скриншот со всех частей и выводиться схема полностью.

GFreemen
24.01.2008, 17:27
2 wvxvw
Если автокадом пользоваться только для простого черчения, его, с нуля, можно изучить за день. А если брать его полностью, включая програмирование - то действительно несколько лет.У меня же просто рисование.
2 wvxvw & Волгоградец
Рузумное зерно во всем этом есть, но сразу возникает куча вопросов. Например будут теже тормаза при просмотре всей картинки, а как выполнить перемещение с левой части к правой? Только через подгрузку. Но это полный геморой.
Нет, похоже, надо принять этом мир таким какой он есть. Для НОРМАЛЬНОЙ программы такого рода надобы использовать С++, но это посложнее будет чем AS2. Поэтому будем использовать то что есть.

wvxvw
24.01.2008, 21:00
Ну, это... про автокад не скажу, я с ним практически не сталкивался, но вот взять тот же фрихенд\иллюстратор -- если много сложных объектов, то они тоже тормозят и не совсем риалтайм отрисовываются... В глобальной перспективе избежать это все равно не удастся, нужно просто предусмотреть такую ситуацию, и что-то с ней сделать. Разбить рендеринг на циклы представляется самым простым решением...

GFreemen
25.01.2008, 00:47
2 wvxvw
Предусмотреть эту ситуацию можно в рекомендуемых параметрах системы, рекомендуя самый мощный компьютер.
Чем хорош AS, тем, что обработка начатия на элемент - самое простое решение.
Радует то, что таких больших схем - единицы. В основном порядка 2000 элементов, что неплохо перерабатывается более-менее современными кампами.
Я же искал путь уменьшения процессорной нагрузки самого MovieClip`а, но что нельзя, то нельзя.
Да, кстати, максимально возможное количество элементов в моей программе 100k :), но для нормальной работы компа это, конечно, фантастика

alexcon314
25.01.2008, 09:23
не знаю как это может вам помочь, но все же...
идея такая: использовать слои. неактивный слой преобразовывать в битмап. при активизации обратно аттачить мувы затирая битмап.
реорганизация приложения неизбежна.

GFreemen
25.01.2008, 13:19
Загружать в битмап 50-100 клипов
Удалять эти клипы
При нажатии на битмап, сохранять координаты нажатия
Атачить клипы замененные битмапом
Удалять битмап
По сохранненным координатам генерировать событие нажатия на необходимый клип.
В общем я думаю вот так.
Короче будем эксперементировать

alexcon314
25.01.2008, 13:53
я не очень ориентируюсь в этом вопросе, но наверно слой можно выполнить в виде клипа контейнера и для клипов-элементов схемы и для отрисовываемого на их основе битмапа.
аттачить клипы на их "законные" места и удалять соответствующий битмап можно по событию "активировать слой". приаттаченные клипы "естественным" образом реагируют на онпресс и пр.
по окончании редактирования слоя деактивировать его.
при деактивации перегонять клипы в контейнере в битмап, запоминать их координаты и проч. атрибуты сосотояния и удалять их.
т.е. "рабочих" клипов одновременно будет по любомуо не 5000. да это и не нужно вобщем-то: все 5000 одновременно контролировать. если конечно это не интерактивная схема, а просто рисунок.
как то так я себе это представляю.