まず、私は LINQ を初めて使用するので、LINQ の詳細がよくわかりません。私は今、いくつかのコードでそれを使用しようとしていますが、私の診断によると、同じ方法で for ループを使用するのとほぼ同じ速さのようです。ただし、私が扱っているリストは非常に劇的に増加する可能性があるため、これがどれだけうまくスケーリングされるかはわかりません.
私は LINQ を衝突検出機能 (まだ開発中) の一部として使用しており、それを使用して、チェックに関連するものだけにリストを選別しています。
LINQ のバージョンは次のとおりです。
partial class Actor {
public virtual bool checkActorsForCollision(Vector2 toCheck) {
Vector2 floored=new Vector2((int)toCheck.X, (int)toCheck.Y);
if(!causingCollision) // skip if this actor doesn't collide
return false;
foreach(
Actor actor in
from a in GamePlay.actors
where a.causingCollision==true&&a.isAlive
select a
)
if( // ignore offscreen collisions, we don't care about them
(actor.location.X>GamePlay.onScreenMinimum.X)
&&
(actor.location.Y>GamePlay.onScreenMinimum.Y)
&&
(actor.location.X<GamePlay.onScreenMaximum.X)
&&
(actor.location.Y<GamePlay.onScreenMaximum.Y)
)
if(actor!=this) { // ignore collisions with self
Vector2 actorfloor=new Vector2((int)actor.location.X, (int)actor.location.Y);
if((floored.X==actorfloor.X)&&(floored.Y==actorfloor.Y))
return true;
}
return false;
}
}
これは私の以前の方法です:
partial class Actor {
public virtual bool checkActorsForCollision(Vector2 toCheck) {
Vector2 floored=new Vector2((int)toCheck.X, (int)toCheck.Y);
if(!causingCollision) // skip if this actor doesn't collide
return false;
for(int i=0; i<GamePlay.actors.Count; i++)
if( // ignore offscreen collisions, we don't care about them
(GamePlay.actors[i].location.X>GamePlay.onScreenMinimum.X)
&&
(GamePlay.actors[i].location.Y>GamePlay.onScreenMinimum.Y)
&&
(GamePlay.actors[i].location.X<GamePlay.onScreenMaximum.X)
&&
(GamePlay.actors[i].location.Y<GamePlay.onScreenMaximum.Y)
)
if( // ignore collisions with self
(GamePlay.actors[i].isAlive)
&&
(GamePlay.actors[i]!=this)
&&
(GamePlay.actors[i].causingCollision)
) {
Vector2 actorfloor=
new Vector2(
(int)GamePlay.actors[i].location.X,
(int)GamePlay.actors[i].location.Y
);
if((floored.X==actorfloor.X)&&(floored.Y==actorfloor.Y))
return true;
}
return false;
}
}
現時点ではどちらもほとんど実行されませんが (ただし、1 秒間に何度も実行されます)、プロジェクトがビルドされて複雑になるにつれて、一度に処理するオブジェクトがはるかに多くなり、衝突をチェックするコードがより詳細になります。 .