首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >System.OutOfMemoryException:内存不足

System.OutOfMemoryException:内存不足
EN

Stack Overflow用户
提问于 2019-04-28 00:36:55
回答 1查看 381关注 0票数 0

我正在制作一个游戏,它使用图形来从文件夹中随机绘制图片。Here It Is:

这是C#上的一款游戏

代码语言:javascript
复制
public static int cookiecount;
public static Random random = new Random();
public static string[] files = Directory.GetFiles(Application.StartupPath, "*.png");
public static Image im;

public static void Draw(System.Drawing.Graphics g, int x, int y)
{
    try
    {
        im = Image.FromFile(files[random.Next(0, files.Count())]);

        g.DrawImage(im, x, y, 40, 40);
    }
    catch(Exception ee) {
        MessageBox.Show("Error! " +ee.Message + " " + ee.Source + " " + ee.HelpLink,
            "Oh No", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }

    cookiecount++;
}

它会输出一个错误,内容是:

System.OutOfMemoryException: Out Of Memory

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-28 01:02:18

正如其他人所说,你有一个内存泄漏,因为你没有处理图像。注意:通常在C#中,未使用对象的内存会自动释放,但图像是特殊的,因为它们是COM对象,即非.NET对象。

不用一次又一次地加载图像,只需加载一次。因为在整个游戏中使用的是相同的图像,所以您不需要处理它们。

代码语言:javascript
复制
public static int cookiecount;
public static Random random = new Random();
public static Image[] images;

// Call this once at program start.
public static LoadImages()
{
    string[] files = Directory.GetFiles(Application.StartupPath, "*.png");
    images = new Image[files.Length];
    for (int i = 0; i < files.Length; i++) {
        images[i] = Image.FromFile(files[i]);
    }
}

public static void Draw(System.Drawing.Graphics g, int x, int y)
{
    int index = random.Next(0, images.Length);
    g.DrawImage(images[index], x, y, 40, 40);

    cookiecount++;
}

对于数组,请使用Length属性,而不是调用Count()扩展方法。它效率更高。

另外,异常处理应该移到LoadImages()。为了简单起见,我没有在这里展示它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55882656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档