如何在WinForms中绘制大图像?

jfgube3f  于 2022-12-23  发布在  其他
关注(0)|答案(1)|浏览(144)

我正在为一个自上而下风格的游戏做一个地板,我曾经在那里使用图片框
我被告知,我应该使用Graphics.DrawImage();方法,而不是使用Picturebox,这似乎略有帮助,但仍然非常滞后。
我的paint函数是这样画背景的:
如何使绘图不那么滞后?图像为2256 x 1504

private void Form1_Paint(object sender, PaintEventArgs e)
{
    Graphics g = e.Graphics;
    g.DrawImage(PeanutToTheDungeon.Properties.Resources.tutorialFloor, 0, 0);
}
hm2xizp9

hm2xizp91#

我在这里要谈两点。
首先,不要像这样使用Properties.Resources。每次使用该对象的属性时,该资源的数据都会从程序集中提取出来。这意味着每次引发Paint事件时,您都会创建一个新的Image对象,这是很常见的。您应该使用该资源属性一次且仅使用一次。将该值赋给一个字段,然后重复使用该字段,这意味着每次都可以保存提取数据和创建Image对象的时间。
第二点可能适用,也可能不适用,但是,如果您通过调用InvalidateRefresh强制引发Paint事件,则需要确保使可能的最小区域无效。如果您调用RefreshInvalidate时不带参数,则将使整个for无效。这意味着整个窗体将被重绘。屏幕上像素的重绘实际上是这个过程中比较慢的部分,所以这部分你需要保持在最低限度。这意味着,当你的游戏板上发生变化时,你需要计算出包含所有可能变化的最小区域,并在调用Invalidate时指定它,这将减少重新绘制的工作量并加快过程。
注意你不需要改变你的绘图代码。你总是画所有的东西,然后系统会画你之前无效的那部分表格。

相关问题