Сначала измерьте

Не оптимизируйте вслепую. Включите fps в конфиге и посмотрите, падает ли время кадра в update или в отрисовке. Если просадка только когда камера едет по большой tilemap — это cull и слои, а не «медленный JS».

Не трогайте то, что спит

Самая дорогая привычка — в update обходить все спрайты мира. Держите активный набор: враги в камере, пули в полёте. Остальное setActive(false).setVisible(false) или в пуле.

Группы и group.get здесь полезнее, чем new Sprite каждый выстрел.

Текстуры

Сто PNG — сто загрузок и сто свапов текстур. Соберите атлас. Анимации через anims и spritesheet, не через смену setTexture каждый кадр.

Картинки больше экрана уменьшайте до реального размера отрисовки. Scale Manager не сжимает видеопамять сам по себе.

Частицы и текст

Эмиттер на максимуме легко съедает кадр. Режьте quantity, lifespan и не запускайте пять взрывов в одной точке. Текст с тенью и stroke дороже обычного. Для урона — один BitmapText, не десяток Text.

Камера и тайлы

На больших картах оставьте только видимые слои. Коллизии — отдельный слой, не весь тайлсет. Камера с startFollow не должна дергать roundPixels туда-сюда без нужды: это даёт микрошум и лишние пересчёты.

Список на вечер

Атлас вместо россыпи файлов. Пулы пуль и врагов. Пустой update у невидимых объектов. Один эмиттер на тип эффекта. Физика только там, где есть тела. Если после этого FPS живой на телефоне — остальное уже полировка.