磁贴上的选择纹理导致性能问题

本文关键字:性能 问题 纹理 选择 | 更新日期: 2023-09-27 18:29:31

public void Draw(SpriteBatch spriteBatch)
    {
        for (int x = 0; x < width; x++)
        {
            for (int y = 0; y < height; y++)
            {
                Vector2 mouseCoord = GetMouseTilePosition();
                if (mouseCoord.X > 0)
                {
                    spriteBatch.Draw(selection, tileRect = new Rectangle((int)mouseCoord.X * 64, (int)mouseCoord.Y * 64, 64, 64),
                                    Color.White);
                }
                spriteBatch.Draw(tiles[index[x,y]].texture, tileRect = new Rectangle(x * 64, y * 64, 64, 64), 
                    Color.White);          
            }
        }  
    }
    public Vector2 GetMouseTilePosition()
    {
        for (int x = 0; x < width; x++)
        {
            for (int y = 0; y < height; y++)
            {
                if (IsMouseInsideTile(x, y))
                {
                    return new Vector2(x, y);
                }
            }
        }
        return new Vector2(-1, -1);
    }
    public bool IsMouseInsideTile(int x, int y)
    {
        MouseState MS = Mouse.GetState();
        return (MS.X >= x * 64 && MS.X <= (x + 1) * 64 &&
            MS.Y >= y * 64 && MS.Y <= (y + 1) * 64);
    }

这是非常占用大量 CPU 的。有没有更好的方法来执行此代码?我还有一个相机,我如何更改它以考虑这一点,以便我获得实际的鼠标位置

磁贴上的选择纹理导致性能问题

Jon Skeet 是对的,你可以直接调用 IsMouseInsideTile((,而不是多次遍历数组。(目前,您正在检查鼠标在整个磁贴数组中的位置,对于每个磁贴,而不是只检查您所在的当前磁贴(。

public void Draw(SpriteBatch spriteBatch)
{
    for (int x = 0; x < width; x++)
    {
        for (int y = 0; y < height; y++)
        {
            if (IsMouseInsideTile(x, y))
            {
                spriteBatch.Draw(selection, tileRect = new Rectangle(x * 64, y * 64, 64, 64),
                                    Color.White);
            }
            spriteBatch.Draw(tiles[index[x,y]].texture, tileRect = new Rectangle(x * 64, y * 64, 64, 64), 
                    Color.White);          
        }
    }  
}

对不起,都是我的错,我之前在没有仔细检查的情况下快速提交了此代码。 这个新版本应该会大大提高您的性能。