マップチップ上に配置されたセルとオブジェクトの当たり判定。

そんなわけで横STGを作ってます。で、「地形」対「自機や弾」の当たり判定でやたらと重くなったので悪戦苦闘してたわけなんだけど。

■■■■■■■
■■■■■■■
■■自■■■■
■■■■■■■
■■■■■■■

こんな感じに1マス16x16ピクセルな格子状に配置したチップ(たまに当たり判定がある)と自機や敵弾(座標は1ドット単位)の当たり判定を取りたい場合。
格子状のチップは[X_NUM][Y_NUM]な配列に格納されていて、ひとまずそのまんま総当りでやったら 32.5ms とか法外な時間かかってたのでこれはまずいなと。

■■■■■■■
■□□□■■■
■□自□■■■
■□□□■■■
■■■■■■■

で、配列のインデックスと実際の座標が対応してるのを良い事に、自機の座標を一番近いセル座標に変換して(つまり配列のIndexに直接使える形に)から周辺の数マス分のチップについて(図で言う□のチップ)だけ判定するようにしたら 0.42ms まで短縮された。すごい。そうか、マップチップとの判定の最適化はこの方向でやれば良いのか。

あとは配列のインデックスと場所が対応してないもの同士の判定の最適化。例えば「自機」対「敵弾」の1対多の処理については、区画分けをして敵弾をUpdate時に対応する区画オブジェクトに紐付け。で、判定時には自機が存在する区画オブジェクトのみ抽出して、そこに紐付いてる敵弾と判定すれば良さそう。だけど弾幕ゲーにする予定はないのでひとまずこっちは置いておこう。

とりあえず、ちゃんとプロファイラかましホットスポットを突き止めるのは大事だなぁと。