Самая частая проблема производительности во Flash связана со сбором мусора. По крайней мере, у меня. Сборщики мусора выкидывают объекты из памяти только тогда, когда удалены не только сами объекты, но и слушатели событий, связанные с ними, и всяческие указатели на эти объекты. То есть, чтобы память не текла, нужно постоянно следить за кучей всякой ерунды. Для большинства проектов можно просто забить на оптимизацию, но если у вас куча партиклов, блюры, глоу, всё это под шум Перлина - то после пары минут игры или даже просто после пары рестартов флешка начнёт дико тормозить. Одно из решений проблемы - это создавать кэши для повторяющихся объектов (типа набигающих врагов), но проблемы окончательного удаления это не решит.
Окончательным решениемеврейского вопроса для меня стала библиотека CasaLib. Самое главное, что она может - это предоставляет свои классы CasaSprite и CasaMovieClip, которые расширяют стандартные. А в этих кастомных классах есть замечательные методы типа removeAllChildrenAndDestroy(), которые в одиночку способны справиться с главной причиной тормозов большинства флешек. Стоит заметить, что по умолчанию в этих методах дети только удаляются, а не уничтожаются, плюс рекурсивный проход метода по детям выключен. Чтобы исправить ситуацию, надо отправить true и true в качестве аргументов метода или же просто найти в библиотеке эти функции и к чёрту переписать:
removeAllChildrenAndDestroy(destroyChildren:Boolean = false, recursive:Boolean = false)
на:
removeAllChildrenAndDestroy(destroyChildren:Boolean = true, recursive:Boolean = true )
Библиотека умеет ещё много чего полезного, но главное - теперь ко мне ночью не придут партиклы, контейнер которых я зверски убил... Потому что все до единого партиклы тоже убиты, муа-ха-ха!!!!11
Окончательным решением
removeAllChildrenAndDestroy(destroyChildren:Boolean = false, recursive:Boolean = false)
на:
removeAllChildrenAndDestroy(destroyChildren:Boolean = true, recursive:Boolean = true )
Библиотека умеет ещё много чего полезного, но главное - теперь ко мне ночью не придут партиклы, контейнер которых я зверски убил... Потому что все до единого партиклы тоже убиты, муа-ха-ха!!!!11
А я пользуюсь фликселом, и самописными фабриками (с кэшом естественно). Уже год не сталкивался с проблемой утечки памяти. Все дело в архитектуре ;).
ОтветитьУдалитьА я руками всё делаю, ни на один фреймворк подсесть не удалось...
УдалитьЛегче самому следить за всеми объектами на сцене, чем юзать чужие либы.
ОтветитьУдалитьПравильно, чужие либы для слабаков! И вообще надо писать свои движки, ага.
Удалить