繁体   English   中英

如何在 WinForms 中绘制大图像?

[英]How can I draw a big image in WinForms?

我正在尝试为自上而下风格的游戏制作地板,我曾经在其中使用图片框

有人告诉我,我应该使用Graphics.DrawImage();而不是使用 Picturebox。 方法,这似乎有点帮助,但仍然很滞后。

我的油漆 function 看起来像这样绘制背景看起来像这样:

我应该如何使绘图不那么滞后? 图像为 2256 x 1504

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

我想在这里提出两点。

首先,不要那样使用Properties.Resources 每次使用该 object 的属性时,该资源的数据都会从程序集中提取。 这意味着每次引发Paint事件时,您都会创建一个新的Image object,这很常见。 您应该只使用该资源属性一次,将值分配给一个字段,然后重复使用该字段。 这意味着您将节省每次提取该数据和创建Image object 的时间。

第二点可能适用也可能不适用,但是如果您通过调用InvalidateRefresh强制引发Paint事件,那么您需要确保使最小区域无效。 如果您不带任何参数调用RefreshInvalidate ,那么您就是在使整个 for 无效,这意味着将重新绘制整个表单。 屏幕上像素的重绘实际上是过程中较慢的部分,因此您需要将这部分保持在最低限度。 这意味着,当您的游戏板上发生某些变化时,您需要计算包含所有可能变化的最小区域,并在调用Invalidate时指定该区域。 这将减少重新绘制的数量并加快该过程。

请注意,您不需要更改绘图代码。 您总是绘制所有内容,然后系统将绘制您之前无效的表格部分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM