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