私はScalaでゲームを作っています。ScalaでList.filterを高速化するには?
私のゲームには、敵を守るためのプールがいくつかあります。彼らは不変のリストです。十分な大きさに初期化されているため(ゲーム中に新しい敵のインスタンスを作成するのは非常にコストがかかるためです)。
私のゲームでは、敵が生きているかどうかはenemy.isVisible
と尋ねられます。だから私のCollisionHandlerは次のように動作します:リスト
- 実弾
- をゲット宇宙パーティションこれらと同じスペースのパーティションに
を弾丸と敵のための衝突検出を行いますプロファイラーによれば、ステップ1にはほとんどの時間がかかります。
def allActiveEnemies = List(enemyType1.getAllActive, enemyType2.getAllActive, ...).flatten
がflatten
高価いないようですが、代わりにgetAllActiveのコールを取得します。そして、何そのステップはありませんが、基本的であると言います。 (私はそれはここでは関係ないと思うので、私は形質のほとんどを省略。)
pool.filterは45%のように燃えるものです
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)
}
:彼らはこのような私のプールされた特性に実装されていますCollisionHandlerで費やされた合計時間。これは本当に不思議なことです。
ここで物事をより速くするための提案はありますか?
Listの代わりにArrayListを使用していますか?たぶんいくつかの並べ替えと変更可能なコレクションを使用して?それとも、私はひどく間違ったことをやっているのですか?
ありがとうございます!
は 'e.isVisible'フィールドアクセスまたは計算ですか? – huynhjl
isVisibleはフィールドのゲッターです(私のゲームの基礎としてJavaベースのゲームエンジンを使用しています)。 – vertti
私はScala 2.8.1を使っていて、Android 2.x上でゲームが実行されていると付け加えるべきです。 – vertti