需要在屏幕上有效地绘制到800 * 800像素的盒子

时间:2009-07-25 13:41:57

标签: vb.net

我需要在屏幕上800x800像素的正方形中的100个半随机点之间绘制100条线。

我一直在使用内置的绘图线和在.NET内部绘制drawrecangles函数,但每次表单绘制时我的绘图都会被删除。

所以,我一直在考虑绘制内存中的位图,但我不确定这是否是一个很好的解决方案。

任何提示?

5 个答案:

答案 0 :(得分:3)

这不仅是个好主意,而且还有一个名字(双缓冲)。在表单级别的Bitmap上绘制,然后在表单的Paint事件中(实际上最好使用表单上的PictureBox,并使用它的Paint事件)使用Graphics对象的DrawImage方法绘制你的位图到PictureBox。

更简单的方法是创建Bitmap,在其上绘制,然后将Bitmap设置为PictureBox的Image属性。即使您的表单重新绘制,这也会自动保留图像。

答案 1 :(得分:3)

假设我的机器的GDI +性能可比,那不是一个好主意。 Form类已经通过DoubleBuffered属性支持双缓冲。假设你不像它那样深入P / Invoke,那么它比你能做的更好。

我的测量结果:

  • 100条随机行,没有双倍 缓冲:68毫秒
  • 100条随机线,双缓冲: 2.6毫秒
  • Graphics.DrawImage 800x800x32PArgb, 没有双缓冲,空洞 OnPaintBackground:9.8毫秒

当你绘制超过400行时,这当然会改变。为了获得WF的双缓冲给你的性能,你必须使用BufferedGraphics类。这是非常不友好的。

答案 2 :(得分:2)

这是一个好主意。您绘制到位图,并在您的表单中绘制位图。只需在修改位图后调用重绘(或等效)。

答案 3 :(得分:1)

您可以在位图上绘制以使其持久化,或者您可以使用绘制事件在表单上绘制它。

要绘制位图(在此示例中为图片框Picture1):

dim g as graphics
g = Graphics.FromImage(Picture1.Image)
g.DrawRectangle(...)

使用绘画事件:

Private Sub Form1_Paint(ByVal sender As Object, ByVal e As PaintEventArgs) Handles Me.Paint
e.Graphics.DrawRectangle(...)
end sub

答案 4 :(得分:0)

虽然BufferedGraphics可能不友好,this guy explains it well使用基类,您可以将其用于自己的控件。