Поле видимости

То что касается флеша, но не касается ВКонтакте API. Например проблемы при создании прыгающего мячика.
Ответить
XELAD
Сообщения: 205
Зарегистрирован: 17 июл 2012, 05:25

Поле видимости

Сообщение XELAD »

Здравствуйте. Возможно, название темы немного из другой оперы, но идея та же.
Предположим, мы имеем на сцене (AS3) один Sprite, назовем его MAIN, в который добавлены сотни ёлок. Каждая ёлка x & y получает рэндомно, причем очень важно, что многие выходят далеко за границу flash ролика. Кроме того, каждая елка отрисована в векторе и для каждой cacheAsBitmap = true.
MAIN следует за курсором OnEnterFrame.
Теперь перейдем непосредственно к основной теме. Память компьютера загружена этими ёлками, необходимо те елки, что выходят за границы ролика удалять, НО добавлять их на те же места, если то место, где они были, снова видно на экране.
Часто вижу похожее в играх от plarium, progrestar. Если у кого есть соображения, как это реализовано, буду рад совету)

Можно сразу сказать, что
1) Создание mask лишь увеличит кол-во используемой памяти.
2) Вкл/выкл visible никак не отобразится на памяти

На ум приходит лишь запись в массив getBounds каждой елки и ежекадровый проход по нему с добавлением/удалением оной. Но это долго.
XELAD
Сообщения: 205
Зарегистрирован: 17 июл 2012, 05:25

Re: Поле видимости

Сообщение XELAD »

Логику придумал такую:
Написал свой класс. Вместо MovieClip и тп (к примеру ёлок) подобного из библиотеки, создаю экземпляр этого класса, который будет служить контейнером для вышеуказанного. Изначально контейнер пуст. К нему уже можно записывать переменные, т.к он dynamic.
Когда то,что внутри контейнера, должно появиться на сцене (к примеру, карту, на которой все эти контейнеры, перетащили-передвинули), содержимое появится. Каким образом?
Для этого все функции, действующие на содержимое, были разделены на две части - невизуальную и визуальную. Визуальные, это те, которым неважно содержимое, т.е они не используют getChild, getChildByName, и тп. Они выполняются независимо от наличия содержимого, сразу.
А вот какую нужно выполнить визуальную функцию каждому экземпляру, в случае его появления на сцене, я сообщаю моему классу. Он записывает их в массив и выполняет в нужное время.
Так же сделано и с любыми Listener'ами, они начинают работать как только содержимое появится.
Если содержимое не должно быть видно на сцене (карту передвинули), то Listener'ы удаляются, содержимое удаляется. Память очищается.

К вопросу о том, как содержимое определяет, должно ли оно быть видно? Через getBounds один раз, при создании экземпляра класса (да-да, он же пуст изначально, прогоним все визуальные функции и определим getBounds).

Немного муторно, но в результате 20мБ памяти было освобождено при локальном тестировании.
Логику описал для тех, кого заинтересовал данный вопрос.
Ответить