列出交叉引用导致c#滞后

时间:2013-06-20 04:15:41

标签: c# xna xna-4.0

我有一个类似于我的游戏的游戏,但是从上到下的角度来看,添加块是通过玩家左键单击它将块添加到指定位置来完成的,右键单击放置的块会删除块。

我遇到的问题是,当玩家左键单击时,它会将块及其位置添加到列表中(以便稍后保存到XML),因此逻辑结论是当玩家右键单击< / em>它从游戏中移除所述块,以及它从列表中的位置。

这是我使用的生成滞后的方法:

for (int b = 0; b < game.blocklist.Count; b++)
{
    for (int v = 0; v < game.blockpos1.Count; v++)
    {
        if (game.blocklist[b].visible == true)
        {
            if (game.cursor.boundingbox.Intersects(game.blocklist[b].blockrectangle) && mousestate.RightButton == ButtonState.Pressed && game.player.Builder == true)
            {
                if (game.blocklist[b].blockposition.X == game.blockpos1[v].X && game.blocklist[b].blockposition.Y == game.blockpos1[v].Y)
                {
                    game.blockpos1.RemoveAt(v);
                    game.blocklist.RemoveAt(b);
                    break;
                }
            }
        }
    }
}

现在这是我替换它的方法,它可以极大地减少延迟,并且仍能达到我想要的效果:

for (int b = 0; b < game.blocklist.Count; b++)
{
    if (game.blocklist[b].visible == true)
    {
        if (game.cursor.boundingbox.Intersects(game.blocklist[b].blockrectangle) && mousestate.RightButton == ButtonState.Pressed && game.player.Builder == true)
        {
            if (game.blocklist[b].blockposition.X == game.blockpos1[b].X && game.blocklist[b].blockposition.Y == game.blockpos1[b].Y)
            {
                game.blockpos1.RemoveAt(b);
                game.blocklist.RemoveAt(b);
                break;
            }
        }
    }
}

为什么会产生这么多滞后?我只需要澄清我做错了什么,所以我不再这样做了。

1 个答案:

答案 0 :(得分:1)

  for (int b = 0; b < game.blocklist.Count; b++)
            {
                for (int v = 0; v < game.blockpos1.Count; v++)
            {

                    if (game.blocklist[b].visible == true)
                    {

在这个版本中,基本上对于blocklist(X)中的每个项目,无论它是否可见,你都在迭代blockpos1(Y)中的每个项目。所以你做X * Y循环。然后,您将其缩小为X循环,仅评估可见项目。

考虑到代码写在问题中的方式,我会在尝试循环之前检查这两件事

mousestate.RightButton == ButtonState.Pressed && game.player.Builder == true

因为在这些循环中它们永远不会改变。所以,如果他们不是真的开始,甚至不要打扰循环。

正如Preseton在评论中所说,没有必要将事情与真实比较....你只需要做

mousestate.RightButton == ButtonState.Pressed && game.player.Builder

if (game.blocklist[b].visible)