首页 > 解决方案 > 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();
        }

标签: c#visual-studiowinforms

解决方案


推荐阅读