C# 瓷砖上的选择纹理导致性能问题 public void Draw(SpriteBatch-SpriteBatch) { 对于(int x=0;x

C# 瓷砖上的选择纹理导致性能问题 public void Draw(SpriteBatch-SpriteBatch) { 对于(int x=0;x,c#,performance,xna,selection,tile,C#,Performance,Xna,Selection,Tile,Jon Skeet是对的,您可以直接调用isMouseInsideetile(),而不是在数组中循环多次。(当前,您正在检查鼠标在整个瓷砖数组中的位置,而不是只检查当前的瓷砖) public void Draw(SpriteBatch-SpriteBatch) { 对于(int x=0;x

Jon Skeet是对的,您可以直接调用isMouseInsideetile(),而不是在数组中循环多次。(当前,您正在检查鼠标在整个瓷砖数组中的位置,而不是只检查当前的瓷砖)

public void Draw(SpriteBatch-SpriteBatch)
{
对于(int x=0;x

很抱歉,这都是我的错,我没有仔细检查就很快提交了这段代码。这个新版本应该会大大提高您的性能。

不清楚您要做什么。
宽度和高度是多少?为什么要调用
GetMouseTilePosition
(在每个坐标上循环)在
Draw
中的每次迭代中?基本上,是的-我绝对肯定有更快的方法来做这件事,但如果没有更多的上下文,很难给出建议。我只是没有包括所有的代码。宽度=17高度=15。我被告知在我的最后一个问题中使用GetMouseTilePosition,所以说实话,这就是为什么我要使用它,tha一开始,t代码看起来效率很低。现在还不清楚你想要实现什么。这是一个简单的带有嵌套for循环的平铺引擎。效率如何?我正在尝试获得我鼠标当前所在的平铺的方形选择纹理。我不明白如何再解释。效率如何?嗯,你知道吗'正在执行最里面的循环15*17*15*17=65025次。与我怀疑的要求相比,听起来效率很低。在这个问题中,你没有解释你有什么磁贴,甚至没有解释这是什么类。它是单个磁贴的表示,还是这个类中有多个磁贴?你的意思是什么“方形选择纹理”",准确吗?请阅读它的酷。如果你不介意回答的话,还有一个问题。我在网上查找的关于鼠标拾取的所有内容都说明了如何使用。包含或。矩形上的鼠标和瓷砖相交。你认为这是更好的方法还是坚持你给我的方法?我只想做任何在lon中更优化的事情我想你可以使用.intersect,但我认为在性能方面不会有太大的差异。你必须自己尝试一下,看看它是否会带来差异。
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);
    }
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);          
        }
    }  
}