Я делаю игру со Scala.
В моей игре есть несколько пулов для хранения врагов.Они являются неизменяемыми списками, потому что они инициализируются до размера, который должен быть достаточным (поскольку создание новых экземпляров врага во время игры очень дорого).
Моя игра знает, жив ли враг, спрашивая enemy.isVisible
.Таким образом, мой CollisionHandler работает следующим образом:
- Объедините всех живых врагов в список
- Получите живые пули
- Разбейте их и выполните обнаружение столкновений для пуль и врагов втот же раздел пространства
Меня поразило то, что, согласно профилировщику, шаг 1 занимает большую часть времени.И то, что делает этот шаг, в основном говорит:
def allActiveEnemies = List(enemyType1.getAllActive, enemyType2.getAllActive, ... ).flatten
flatten
там не кажется дорогим, но вместо этого он получает вызовы getAllActive.Они реализованы в моей черте Pooled следующим образом:
trait Pooled[T <: Entity] {
var pool = List[T]()
val INITIAL_POOL_SIZE:Int
def initPool() {
for(i<-1 to INITIAL_POOL_SIZE)
{
addToPool(disable(createNew))
}
}
def getAllActive:List[T] = pool.filter(e => e.isVisible)
}
(я опустил большую часть черты, потому что я не думаю, что она здесь уместна.)
pool.filter - это то, что горит как45% от общего времени, проведенного в CollisionHandler, что кажется странным.
Есть предложения по ускорению процесса?
Может быть, использовать ArrayLists вместо List?Может быть, использовать сортировку и изменяемые коллекции?Или я просто что-то делаю ужасно неправильно?
Спасибо!