2012-08-25 80 views
2

我需要繪製大約1000行。這些線每秒變化約25次(所以每秒變換25000線)。我可以使用什麼來獲得可接受的表現?我更喜歡不使用directX調用,因爲此軟件也需要在默認情況下不具有directX的服務器上運行。.NET GDI +繪圖性能

兩種不同的方法,我試圖做到這一點,但是給了我一個熔化CPU:

設置1 - 標準.NET電話:

  • 雙緩衝面板
  • 內存位圖繪製(清算和使用Graphics.DrawLine重畫線條
  • 將位圖複製到具有Graphics.DrawImageUnscaled的面板
  • profiler說這兩個圖形調用是瓶頸

設置2 - GDI的dllimport的呼叫:

  • 雙緩衝面板
  • 與MoveToEx和LineTo等存儲器位圖從GDI
  • 繪製位圖複製到面板的BitBlt
  • 探查說這些非管理呼叫是瓶頸

會性能增加,如果我使用WPF而不是Winforms?或者通過使用directX或第三方庫來做到這一點的唯一方法?

乾杯

+0

幾何尺寸是多少? –

+0

它們具有可變長度,範圍介於1和500像素之間。 – BasiK

+0

行數是否固定? –

回答

0

調用開銷可能是限制因素。在香草GDI中,有一個PolyPolyline函數可讓您在單個調用中繪製多條線。如果你所有的線都連接好了,那麼還有一個更簡單的功能Polyline。我假設有這些GDI +等價物。我會介紹這些。即使將這些函數所需的數組綁定到您的座標需要做一些工作,它可能比對單個繪圖函數的約1000個調用要快。

+0

我認爲[Graphics.DrawLines](http://msdn.microsoft.com/en-us/library/7ewkcdb3.aspx)是等效的。還有其他批處理樣式繪圖調用:[Graphics.DrawBieziers](http://msdn.microsoft.com/en-us/library/ds101091.aspx),[Graphics.DrawRectanges](http://msdn.microsoft.com/zh-cn/library/default.aspx)。 com/en-us/library/sfth7x55.aspx),[Graphics.FillRectanges](http://msdn.microsoft.com/en-us/library/5c3h7524.aspx)。 –

+0

線路未連接。 – BasiK

+0

@BasiK:使用PolyPolyline,您可以繪製許多斷開的線。 –

0

在固定數目的線的情況下:

使用WPF並且一旦添加線的畫布。

每次打勾,根據需要更新行的末尾。您也可以更改其他屬性。

我想試試這個,因爲它是直接使用DirectX的最簡單方法。

在任何情況下:在沒有像樣的硬件的情況下在服務器上進行這麼多的圖形操作總是會很痛苦。

+0

稍後會試一試,看看會發生什麼...... – BasiK

0

我可以給你的唯一建議是,你似乎有直接訪問硬件,所以使用標準的雙緩衝方法。如果你的硬件支持它,或者只是一個內存隊列就像準備好繪製的一系列位圖一樣,也許可以與多線程結合使用,記住處理器在完成一個IO操作所需的時間內可以執行數千次內存操作(屏幕繪製)。你可以從字面上有一個處理過程,在獲得某個「緩衝區大小」(集合大小)之後,獲取數據並執行到內存表面的轉換(如果需要,則轉換爲位圖),並按順序繼續添加它們以進行泛型集合可以說接下來的5分鐘圖像可以被編碼,以等待更多的收集被該面板的過程消耗掉。然後在面板的OnPaint等價物中,它從堆棧的底部獲取一個內存表面,並從集合的底部將當前一個換掉。你可以給線程繪製任務更多的處理優先級,因爲另一個線程自然會更快。請記住用不同的線程鎖定內存表面集合,以保證線程安全。祝你好運。