Ускорение работы моего List.filter на Scala?

Я делаю игру на Scala.

В моей игре есть несколько пулов для хранения врагов. Они неизменны Списки, потому что они инициализированы до размера, которого должно хватить (потому что создание новых экземпляров врагов во время игры очень дорого).

Моя игра знает, жив ли враг, задавая вражеский.isVisible . мой CollisionHandler работает следующим образом:

  1. Объединить всех живых врагов в список
  2. Получить живые пули
  3. Разделить их и выполнить обнаружение столкновений для пуль и врагов в одном и том же разделе пространства

Меня поразило то, что согласно профилировщик, шаг 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 ? Может быть, использовать какие-то сортировочные и изменяемые коллекции? Или я просто делаю что-то ужасно не так?

Спасибо!

5
задан Mechanical snail 23 August 2011 в 04:21
поделиться