c# - Windows 窗体 - 应用程序反应逐渐变慢
问题描述
我的 Windows 窗体 C# 应用程序有一个烦人的问题。
我正在做一个游戏,到目前为止我所做的很简单,你可以根据游戏规则移动你的棋子
游戏开始时,一切正常,应用程序立即对我的点击做出反应,并立即按照我的意愿移动棋子。多次移动后出现问题。在大约 30 或 40 次移动之后,应用程序需要大约一秒钟才能对我的点击做出反应。这使得游戏有点无法玩,因为它的反应非常缓慢。我做的动作越多,应用程序的反应就越慢。
我正在面板中绘画(更准确地说是双缓冲面板)。我尝试在 PictureBox 中进行绘制,但它没有改变任何东西,应用程序的反应同样缓慢。这不是时间问题,我可以让应用程序打开几分钟,在我第一次点击后它仍然会快速反应。此外,如果我打开和关闭表单(不是应用程序,只是表单),它会再次开始快速反应。
有谁知道可能是什么问题?我对这个没有想法。我会添加一些代码,但我不知道具体要添加什么。我想我会补充一点,在玩家点击他的棋子或可能的移动后,面板会使用 Invalidate 命令刷新。感谢您提前提供任何帮助。
编辑:发布一些代码
private void herniPanel_Paint(object sender, PaintEventArgs e)
{
vytvoritPole(e);
if (kliknutoHracovoPole == true)//draws possible moves and the black circle
{
Pen pen = new Pen(Color.Black, 5);
e.Graphics.DrawEllipse(pen, poz_X_KHr, poz_Y_KHr, sirkaPole, vyskaPole);
foreach (MoznyTahHrace m in mozneTahyHrace)
{
m.NakresliMozneTahyHrace(e);
}
pen.Dispose();
}
}
private void vytvoritPole(PaintEventArgs e)//creates the grid
{
int poz_X_He = (this.herniPanel.Width / 2) - (sirkaPole / 2);
int poz_Y_He = 13;
for (int i = 0; i < pocetPoli; i++)
{
Pole pole = new Pole(poz_X_He, poz_Y_He, sirkaPole, vyskaPole);
herniPole.Add(pole);
switch (i)
{
case 0:
poz_Y_He += posun;
poz_X_He -= (posun / 2) + posun;
break;
case 2:
poz_Y_He += posun;
poz_X_He -= (posun / 2) + (posun * 2);
break;
case 5:
poz_Y_He += posun;
poz_X_He -= (posun / 2) + (posun * 3);
break;
case 9:
poz_Y_He += posun;
poz_X_He -= (posun / 2) + (posun * 8);
break;
case 22:
poz_Y_He += posun;
poz_X_He -= (posun / 2) + (posun * 12);
break;
case 34:
poz_Y_He += posun;
poz_X_He -= (posun / 2) + (posun * 11);
break;
case 45:
poz_Y_He += posun;
poz_X_He -= (posun / 2) + (posun * 10);
break;
case 55:
poz_Y_He += posun;
poz_X_He -= (posun / 2) + (posun * 9);
break;
case 64:
poz_Y_He += posun;
poz_X_He -= (posun / 2) + (posun * 9);
break;
case 74:
poz_Y_He += posun;
poz_X_He -= (posun / 2) + (posun * 10);
break;
case 85:
poz_Y_He += posun;
poz_X_He -= (posun / 2) + (posun * 11);
break;
case 97:
poz_Y_He += posun;
poz_X_He -= (posun / 2) + (posun * 12);
break;
case 110:
poz_Y_He += posun;
poz_X_He -= (posun / 2) + (posun * 8);
break;
case 114:
poz_Y_He += posun;
poz_X_He -= (posun / 2) + (posun * 3);
break;
case 117:
poz_Y_He += posun;
poz_X_He -= (posun / 2) + (posun * 2);
break;
case 119:
poz_Y_He += posun;
poz_X_He -= (posun / 2) + posun;
break;
}
poz_X_He += posun;
}
if (inicializace)//only at the beginning of the game, creates 10 player pieces
{
inicializace = false;
for(int i = 0; i < herniPole.Count; i++)
{
Pole pole = (Pole)herniPole[i];
poz_X_He = pole.get_poz_X_He();
poz_Y_He = pole.get_poz_Y_He();
if(poz_Y_He >= posun * 13)
{
Hrac hrac = new Hrac(poz_X_He, poz_Y_He, sirkaPole, vyskaPole);
hracovaPole.Add(hrac);
}
}
}
foreach (Pole p in herniPole)//draws the game pieces
{
p.NakresliPole(e);
}
foreach (Hrac h in hracovaPole)//draws player's pieces
{
h.NakresliHrace(e);
}
}
public void NakresliHrace(PaintEventArgs e)//draws player's pieces, NakresliMozneTahyHrace and NakresliPole work the same way
{
Pen pen = new Pen(Color.Black, 2);
SolidBrush br = new SolidBrush(Color.DodgerBlue);
e.Graphics.FillEllipse(br, this.poz_X_Hr, this.poz_Y_Hr, this.sirkaPole, this.vyskaPole);
e.Graphics.DrawEllipse(pen, this.poz_X_Hr, this.poz_Y_Hr, this.sirkaPole, this.vyskaPole);
br.Dispose();
pen.Dispose();
}
解决方案
推荐阅读
- svn - svn合并后的两个文件状态是什么意思?
- bash - 使用 exiftool 进行反向匹配
- ios - Audio Kit iOS 检测短麦克风输入的音高/频率,例如轻敲
- javascript - 使用 ajax 以 json 格式获取的数据被随机推送到数组中
- c++ - C++ shared_ptr 调用拥有对象的解构器
- java - 如何在java中更好地编写开关代码(精确数字的平滑移动)
- java - JavaMail API:在 html 类型的邮件内容中维护转义字符
- swift - 领域:多个同时写入
- c# - 如何在 DLL 中使用 System.Web.Helpers.Chart
- jenkins - Jenkins 单个 git 仓库 多个项目