C# 瓷砖上的选择纹理导致性能问题 public void Draw(SpriteBatch-SpriteBatch) { 对于(int x=0;x
Jon Skeet是对的,您可以直接调用isMouseInsideetile(),而不是在数组中循环多次。(当前,您正在检查鼠标在整个瓷砖数组中的位置,而不是只检查当前的瓷砖)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
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);
}
}
}