RTS製作日記。その11

アバター
MNS
記事: 35
登録日時: 15年前

RTS製作日記。その11

投稿記事 by MNS » 14年前

*近くに何がいるか?― 空間分割

速度のネックになっている(そしてこれからもつきまとうであろう)、
近傍探索の処理を高速化するため、空間分割を実装します。
(ちなみに、近傍探索とは”近くのものを探すこと”で、
 身近なものでは、ある地点付近のユニットを探す処理、
 衝突判定などがそれにあたります。)

空間分割では、空間(ゲームではマップなどがあたる?)を幾つかの領域に分割し、
オブジェクトをその分割された空間にメンバーとして割り当てます。
分割空間単位で処理を行うことで、ある程度の処理の最適化が望めます。
(かなりの距離を離れているオブジェクト同士は、お互いに考慮しないということです。)

空間分割には、BSPや四分木など、いろいろな手法がありますが、
今回は単純で簡単なセル空間分割を使用します。
これは、空間を等しく長方形で分割します。


さて、ゲームのほうでは、ノードとユニット、どちらにも空間分割が使えます。
ですから、再利用が可能なようにテンプレートで作ります。
まんま本の通りになってしまいましたが、一応乗せておきます。
► スポイラーを表示
これをWorldクラスにもたせて、

CODE:

class	World
{
    …略…

	CellSpacePartition*
				m_SpacePartition;
    …略…
};
こうやって使用することができます。

CODE:

int		PathFinder::GetClosestNode(Vec2D pos)
{
	…略…

	//近傍ノードを更新
	m_pUnit->getWorld()->GetSpacePartition()
		->NeighborSearch(pos, 40);

	//全ノードについて探索
	for(Node* it = m_pUnit->getWorld()->GetSpacePartition()->begin();
		!m_pUnit->getWorld()->GetSpacePartition()->end();
		it = m_pUnit->getWorld()->GetSpacePartition()->next())
	{
		
	…略…
}
心持ち、若干軽くなった気がします。
実際に効力が大きく現れるのはもうちょっとノードが増えた時でしょう。
ということで、今回はこの辺で終了。
最後に編集したユーザー MNS on 2011年2月06日(日) 15:18 [ 編集 1 回目 ]

コメントはまだありません。