Я делаю игру на Scala.
В моей игре есть несколько пулов для хранения врагов. Они неизменны Списки, потому что они инициализированы до размера, которого должно хватить (потому что создание новых экземпляров врагов во время игры очень дорого).
Моя игра знает, жив ли враг, задавая вражеский.isVisible
. мой CollisionHandler работает следующим образом:
Меня поразило то, что согласно профилировщик, шаг 1 занимает большую часть времени. И то, что делает этот шаг, в основном говорит:
def allActiveEnemies = List(enemyType1.getAllActive, enemyType2.getAllActive, ... ).flatten
the 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 ? Может быть, использовать какие-то сортировочные и изменяемые коллекции? Или я просто делаю что-то ужасно не так?
Спасибо!