2009-07-25 84 views
2

我需要在屏幕上的800x800像素的正方形中的100個半隨機點之間繪製100條線。需要在屏幕上高效地繪製到800 * 800像素的框

我一直在使用內置的繪圖線& .NET中的drawrecangles函數,但每次繪製表單時我的繪圖都會被擦除。

所以,我一直在考慮繪製到內存中的位圖,但我不確定這是否是一個好的解決方案。

任何提示?

回答

3

這不僅是一個好主意,還有一個名稱(雙緩衝)。在窗體的Bitmap中繪製圖形,然後在窗體的Paint事件中繪製(實際上,最好使用窗體上的PictureBox進行繪製,並使用它的Paint事件),使用Graphics對象的DrawImage方法繪製位圖放入PictureBox。

一個更簡單的方法是創建您的位圖,繪製它,然後將位圖設置爲您的PictureBox的圖像屬性。即使您的表單被重新繪製,這也會自動保留圖像。

2

這是一個好主意。您將繪製到位圖並在您的窗體中繪製位圖。在修改位圖之後調用重繪(或等效)。

3

這不是一個好主意,假設我的機器的GDI +性能可比。 Form類已經通過DoubleBuffered屬性支持雙緩衝。它比你能做得更好,假設你不喜歡P/Invoke。

我的測量:

  • 100無規線,沒有雙 緩衝:68毫秒
  • 100無規線,雙緩衝: 2.6毫秒
  • Graphics.DrawImage 800x800x32PArgb, 沒有雙緩衝,空 OnPaintBackground:9.8毫秒

這當然會c當您繪製400多條線時會發生絞線。爲了獲得WF的雙緩衝給你的性能,你必須使用BufferedGraphics類。這是非常不友善的。

1

您可以在位圖上繪製以使其具有持久性,或者您可以使用繪畫事件在窗體上繪製它。

要繪製上的位圖(圖片框Picture1中,在本示例):用鹼類

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