图片框缺乏内存

时间:2014-10-10 17:39:57

标签: c# image memory-leaks switch-statement picturebox

我创建了与开关图像的图片框一起使用的迷你游戏。我用它来换。我通常使用最多30张图片用于app。

解释

class UnikatniHodnoty
{
    public static List<Button> buttonList = new List<Button>();
    public static List<string> uhodnuteObrazky = new List<string>();
    public static bool security = false;
    public static string pocetPokusu;
    public static string casNaObrazky;
    public static string casNaTah;
    public static string bodyKVitestvi;
}

这是我从文件加载图片的脚本:

class nacteniSouboru
{
    string obrazky;
    string zadniKarta;
    string zadniStrana;
    public string hledanyObrazek;
    public List<string> obrazkyList = new List<string>();
    public List<string> obrazkyListControl = new List<string>();

    public nacteniSouboru()
    {
        // Cesty k souborům
        var currentDirectory = Directory.GetCurrentDirectory();
        obrazky = currentDirectory + @"\vse\";
        zadniStrana = currentDirectory + @"\zadniStrana\";

        // Základní hodnota
        zadniKarta = "";
    }

    public void nacteniObrazku()
    {
        var listOfFiles = new List<string>();
        string[] fileEntries = Directory.GetFiles(obrazky);
        foreach (string fileName in fileEntries)
            listOfFiles.Add(fileName);

        Random random = new Random();
        for (int i = 0; obrazkyList.Count < 15; i++)
        {
            int index = random.Next(0, listOfFiles.Count - 1);
            if (!obrazkyList.Contains(listOfFiles[index]))
            {
                obrazkyList.Add(listOfFiles[index]);
                obrazkyListControl.Add(listOfFiles[index]);
            }
        }  
    }

    public void zobrazeniObrazku()
    {
        int i = 0;
        foreach (Button bTn in UnikatniHodnoty.buttonList)
        {
            if (bTn.BackgroundImage != null)
                bTn.BackgroundImage.Dispose();

            bTn.BackgroundImage = Image.FromFile(obrazkyList[i++]);
        }
    }

    public void nacteniHledanehoObrazku(PictureBox picture)
    {
        Random random = new Random();
        foreach (string obrazky in UnikatniHodnoty.uhodnuteObrazky)
            obrazkyListControl.Remove(obrazky);

        int index = random.Next(0, obrazkyListControl.Count - 1);
        hledanyObrazek = obrazkyListControl[index];

        if (picture.BackgroundImage != null)
            picture.BackgroundImage.Dispose();

        picture.BackgroundImage = Image.FromFile(obrazkyListControl[index]);
    }

    public void nacteniZadniStrany()
    {
        string[] fileEntries = Directory.GetFiles(zadniStrana);
        foreach (string fileName in fileEntries)
            zadniKarta = fileName;

        foreach (Button bTn in UnikatniHodnoty.buttonList)
        {
            if (bTn.BackgroundImage != null)
                bTn.BackgroundImage.Dispose();

            bTn.Text = "";
            bTn.BackgroundImage = Image.FromFile(zadniKarta);
        }
    }
}

你可以帮我解决每个开关图像后如何清理内存不足的问题,因为每隔30秒就会调用一次此功能。

这是切换图片的脚本:

    private void obrazek_Click(object sender, EventArgs e)
    {
        Button bTn = new Button();
        bTn = (Button)sender;
        timeTah.Enabled = false;

        switch (bTn.Name)
        {
            case "picture_0_0":
                if (bTn.BackgroundImage != null) 
                    bTn.BackgroundImage.Dispose();
                bTn.BackgroundImage = Image.FromFile(soubor.obrazkyList[0]);
                if (soubor.obrazkyList[0] == soubor.hledanyObrazek)
                {
                    UnikatniHodnoty.uhodnuteObrazky.Add(soubor.obrazkyList[0]);
                    uspechNaObrazku(sender, e);
                }
                else
                    neuspechNaObrazku(sender, e);
                break;
            case "picture_0_1":
                if (bTn.BackgroundImage != null)
                    bTn.BackgroundImage.Dispose();
                bTn.BackgroundImage = Image.FromFile(soubor.obrazkyList[1]);
                if (soubor.obrazkyList[1] == soubor.hledanyObrazek)
                {
                    UnikatniHodnoty.uhodnuteObrazky.Add(soubor.obrazkyList[1]);
                    uspechNaObrazku(sender, e);
                }
                else
                    neuspechNaObrazku(sender, e);
                break;
            case "picture_0_2":
                if (bTn.BackgroundImage != null)
                    bTn.BackgroundImage.Dispose();
                bTn.BackgroundImage = Image.FromFile(soubor.obrazkyList[2]);
                if (soubor.obrazkyList[2] == soubor.hledanyObrazek)
                {
                    UnikatniHodnoty.uhodnuteObrazky.Add(soubor.obrazkyList[2]);
                    uspechNaObrazku(sender, e);
                }
                else
                    neuspechNaObrazku(sender, e);
                break;
            case "picture_0_3":
                if (bTn.BackgroundImage != null)
                    bTn.BackgroundImage.Dispose();
                bTn.BackgroundImage = Image.FromFile(soubor.obrazkyList[3]);
                if (soubor.obrazkyList[3] == soubor.hledanyObrazek)
                {
                    UnikatniHodnoty.uhodnuteObrazky.Add(soubor.obrazkyList[3]);
                    uspechNaObrazku(sender, e);
                }
                else
                    neuspechNaObrazku(sender, e);
                break;
            case "picture_0_4":
                if (bTn.BackgroundImage != null)
                    bTn.BackgroundImage.Dispose();
                bTn.BackgroundImage = Image.FromFile(soubor.obrazkyList[4]);
                if (soubor.obrazkyList[4] == soubor.hledanyObrazek)
                {
                    UnikatniHodnoty.uhodnuteObrazky.Add(soubor.obrazkyList[4]);
                    uspechNaObrazku(sender, e);
                }
                else
                    neuspechNaObrazku(sender, e);
                break;
            case "picture_1_0":
                if (bTn.BackgroundImage != null)
                    bTn.BackgroundImage.Dispose();
                bTn.BackgroundImage = Image.FromFile(soubor.obrazkyList[5]);
                if (soubor.obrazkyList[5] == soubor.hledanyObrazek)
                {
                    UnikatniHodnoty.uhodnuteObrazky.Add(soubor.obrazkyList[5]);
                    uspechNaObrazku(sender, e);
                }
                else
                    neuspechNaObrazku(sender, e);
                break;
            case "picture_1_1":
                if (bTn.BackgroundImage != null)
                    bTn.BackgroundImage.Dispose();
                bTn.BackgroundImage = Image.FromFile(soubor.obrazkyList[6]);
                if (soubor.obrazkyList[6] == soubor.hledanyObrazek)
                {
                    UnikatniHodnoty.uhodnuteObrazky.Add(soubor.obrazkyList[6]);
                    uspechNaObrazku(sender, e);
                }
                else
                    neuspechNaObrazku(sender, e);
                break;
            case "picture_1_2":
                if (bTn.BackgroundImage != null)
                    bTn.BackgroundImage.Dispose();
                bTn.BackgroundImage = Image.FromFile(soubor.obrazkyList[7]);
                if (soubor.obrazkyList[7] == soubor.hledanyObrazek)
                {
                    UnikatniHodnoty.uhodnuteObrazky.Add(soubor.obrazkyList[7]);
                    uspechNaObrazku(sender, e);
                }
                else
                    neuspechNaObrazku(sender, e);
                break;
            case "picture_1_3":
                if (bTn.BackgroundImage != null)
                    bTn.BackgroundImage.Dispose();
                bTn.BackgroundImage = Image.FromFile(soubor.obrazkyList[8]);
                if (soubor.obrazkyList[8] == soubor.hledanyObrazek)
                {
                    UnikatniHodnoty.uhodnuteObrazky.Add(soubor.obrazkyList[8]);
                    uspechNaObrazku(sender, e);
                }
                else
                    neuspechNaObrazku(sender, e);
                break;
            case "picture_1_4":
                if (bTn.BackgroundImage != null)
                    bTn.BackgroundImage.Dispose();
                bTn.BackgroundImage = Image.FromFile(soubor.obrazkyList[9]);
                if (soubor.obrazkyList[9] == soubor.hledanyObrazek)
                {
                    UnikatniHodnoty.uhodnuteObrazky.Add(soubor.obrazkyList[9]);
                    uspechNaObrazku(sender, e);
                }
                else
                    neuspechNaObrazku(sender, e);
                break;
            case "picture_2_0":
                if (bTn.BackgroundImage != null)
                    bTn.BackgroundImage.Dispose();
                bTn.BackgroundImage = Image.FromFile(soubor.obrazkyList[10]);
                if (soubor.obrazkyList[10] == soubor.hledanyObrazek)
                {
                    UnikatniHodnoty.uhodnuteObrazky.Add(soubor.obrazkyList[10]);
                    uspechNaObrazku(sender, e);
                }
                else
                    neuspechNaObrazku(sender, e);
                break;
            case "picture_2_1":
                if (bTn.BackgroundImage != null)
                    bTn.BackgroundImage.Dispose();
                bTn.BackgroundImage = Image.FromFile(soubor.obrazkyList[11]);
                if (soubor.obrazkyList[11] == soubor.hledanyObrazek)
                {
                    UnikatniHodnoty.uhodnuteObrazky.Add(soubor.obrazkyList[11]);
                    uspechNaObrazku(sender, e);
                }
                else
                    neuspechNaObrazku(sender, e);
                break;
            case "picture_2_2":
                if (bTn.BackgroundImage != null)
                    bTn.BackgroundImage.Dispose();
                bTn.BackgroundImage = Image.FromFile(soubor.obrazkyList[12]);
                if (soubor.obrazkyList[12] == soubor.hledanyObrazek)
                {
                    UnikatniHodnoty.uhodnuteObrazky.Add(soubor.obrazkyList[12]);
                    uspechNaObrazku(sender, e);
                }
                else
                    neuspechNaObrazku(sender, e);
                break;
            case "picture_2_3":
                if (bTn.BackgroundImage != null)
                    bTn.BackgroundImage.Dispose();
                bTn.BackgroundImage = Image.FromFile(soubor.obrazkyList[13]);
                if (soubor.obrazkyList[13] == soubor.hledanyObrazek)
                {
                    UnikatniHodnoty.uhodnuteObrazky.Add(soubor.obrazkyList[13]);
                    uspechNaObrazku(sender, e);
                }
                else
                    neuspechNaObrazku(sender, e);
                break;
            case "picture_2_4":
                if (bTn.BackgroundImage != null)
                    bTn.BackgroundImage.Dispose();
                bTn.BackgroundImage = Image.FromFile(soubor.obrazkyList[14]);
                if (soubor.obrazkyList[14] == soubor.hledanyObrazek)
                {
                    UnikatniHodnoty.uhodnuteObrazky.Add(soubor.obrazkyList[14]);
                    uspechNaObrazku(sender, e);
                }
                else
                    neuspechNaObrazku(sender, e);
                break;
        }
        soubor.nacteniZadniStrany();
    }

问题:

加载图片后游戏仍然崩溃,或者我添加了一些新图像到文件。如果游戏崩溃,那么它的书面崩溃就会导致“内存不足”和#34;没有更多,而不是在哪里。请帮忙。

错误:

**************例外文字**************

System.OutOfMemoryException: Out of memory 

    in System.Drawing.Image.FromFile (String filename, Boolean useEmbeddedColorManagement) 

    in System.Drawing.Image.FromFile (String filename) 

    in gameCards.soubory.nacteniSouboru.zobrazeniObrazku () d: \ Program \ gameCards \ gameCards \ files \ nacteniSouboru.cs: line 60 

    in gameCards.gameCard.spustit_Click (Object sender, EventArgs e) in d: \ Program \ gameCards \ gameCards \ gameCards.cs: line 49 

    in System.Windows.Forms.Control.OnClick (EventArgs e) 

    in System.Windows.Forms.Button.OnClick (EventArgs e) 

    in System.Windows.Forms.Button.OnMouseUp (MouseEventArgs mevent) 

    in System.Windows.Forms.Control.WmMouseUp (Message & m, MouseButtons button, Int32 clicks) 

    at System.Windows.Forms.Control.WndProc (Message & m) 

    in System.Windows.Forms.ButtonBase.WndProc (Message & m) 

    in System.Windows.Forms.Button.WndProc (Message & m) 

    at System.Windows.Forms.Control.ControlNativeWindow.OnMessage (Message & m) 

    at System.Windows.Forms.Control.ControlNativeWindow.WndProc (Message & m) 

    in System.Windows.Forms.NativeWindow.Callback (IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

public void zobrazeniObrazku()  // When i use this code so it sent me upper errors.
{
    int i = 0;
    foreach (Button bTn in UnikatniHodnoty.buttonList)
    {
        if (bTn.BackgroundImage != null)
            bTn.BackgroundImage.Dispose();

        bTn.BackgroundImage = Image.FromFile(obrazkyList[i++]);
    }
}

0 个答案:

没有答案