正如您可能从下面的代码中看出的那样,我对 C# 很陌生。对于我的第一个项目(作为一种测试),我制作了一个 2D 关卡编辑器,它有 5 层。在下面的代码中,我通过一个候选字典进行搜索,该字典在每次更改地图时生成,并且只包含填充的图块,而不是使用 for(x for(y for z(draw graphics)))必须检查网格的每个部分是否有任何东西。
它运行良好,直到我在屏幕上有大约 30 个图块,然后它开始运行得很慢,就像非常生涩一样。此绘制事件仅在需要时调用,它不会在计时器上运行,它仅在放置新图块或鼠标光标悬停在新块上时运行。所以我猜问题出在图像实际上被绘制到屏幕上的部分,就像一些东西正在积累一样。
在 DrawImage() 函数下方注释掉的行是为了测试是否只绘制矩形而不是图块集的一部分更快。它是!我很抱歉我听起来很笨,但请记住,这是我的第一个项目,我不确定在哪里可以找到关于这个特定主题的答案。
谢谢!,下面是我的绘画代码
public void editor_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
string[] keys;
string[] values;
foreach(KeyValuePair<string, string> dict in map.shortlist){
keys = dict.Key.Split('|');
values = dict.Value.Split('|');
int xpos = Convert.ToInt16(keys[0]);
int ypos = Convert.ToInt16(keys[1]);
int zpos = Convert.ToInt16(keys[2]);
Tile tile = map.data[xpos, ypos, zpos];
if (tile.type == "tile")
{
Bitmap img = tileset.bitmap.Clone(new Rectangle(tile.x * 16, tile.y * 16, 16, 16), tileset.bitmap.PixelFormat);
g.DrawImage(img, new Point(xpos * 16, ypos * 16));
//g.DrawRectangle(Pens.Blue, new Rectangle(new Point(xpos * 16, ypos * 16), new Size(16,16)));
}
}
if (selector.MouseOver == true)
{
int tileSize = Preferences.blockSize;
Pen pen = new Pen(Color.Red, 1);
g.DrawRectangle(pen, new Rectangle(new Point((MouseX / tileSize) * tileSize, (MouseY / tileSize) * tileSize), new Size(tileSize, tileSize)));
}
}