我正在制作一个游戏,该游戏使用“图形”从文件夹中绘制随机图片。 Here It Is:
这是在C#上进行的游戏
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:内存不足
答案 0 :(得分:1)
正如其他人所说,由于不处理图像,因此会发生内存泄漏。注意:通常,未使用的对象的内存会在C#中自动释放,但是图像是特殊的,因为它们是COM对象,即非.NET对象。
一次加载一次,而不是一遍又一遍地加载图像。由于在整个游戏中会使用相同的图像,因此您无需处理它们。
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()
。为了简单起见,这里没有显示。