2011-04-17 28 views
3

我目前正在對使用Drawing.Graphics提請我在圖片框中顯示位圖C#應用程序。我用網格渲染一個圖形,所以除了屏幕上的點數之外,我還得畫出大約200個網格線。我可以滾動來移動圖形,但是在這樣做的時候,我注意到我的繪圖函數在結尾時表現不佳。用OpenTK和它的GLControl類取代這種方法使得渲染效率非常高,滾動非常平滑。Drawing.Graphics表現不佳

有沒有什麼辦法讓從Drawing.Graphics更快的性能?

// This is only done when the window is resized 
    Bitmap bmp = new Bitmap(picRender.Width, picRender.Height); 
    Graphics g = Graphics.FromImage(bmp); 

    // Drawing code 
    g.Clear(picRender.BackColor); 
    g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighSpeed; 
    g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.Bilinear; 
    if (background != null) 
    { 
    g.DrawImage(background, new Rectangle(0, 0, picRender.Width, picRender.Height)); 
    } 

    for (int n = 0; n < trajectories.Count; n++) 
    { 
    Trajectory trajectory = trajectories[n]; 

    Pen pen = new Pen(new SolidBrush(TrajectoryColors[n % TrajectoryColors.Length])); 

    if (RenderLines) 
    { 
    for (int i = 0; i < trajectory.samples.Count - 1; i++) 
    { 
     if (Interval_Start > trajectory.samples[i + 1].time || 
     Interval_End < trajectory.samples[i].time) { continue; } 

     g.DrawLine(pen, coordinate_system.ToPoint(trajectory.samples[i].coordinates), 
     coordinate_system.ToPoint(trajectory.samples[i + 1].coordinates)); 
    } 
    } 
    } 
    // End of drawing 
+4

@Dmi,你能顯示一些代碼嗎?性能可能取決於您採取的方法,因此有助於獲得該類型的上下文。 – 2011-04-17 16:37:03

+0

從位圖創建圖形,DrawLine x200,配置圖形。 :) – Dmi 2011-04-17 16:43:30

+0

我曾經爲Windows Phone 7製作過硬件加速的System.Drawing.Graphics版本,但並不是最好的方法;除非你有一個很好的理由來重寫GDI +。 OpenTK的圖形處理方法很快,因爲它使用GPU加速。 – IDWMaster 2011-04-17 16:44:24

回答

0

下一步優化繪圖代碼,可用於被緩衝結果的另一策略。

通過重繪整個圖像的每一個時間,但只是滾動到視圖(或者更好的是要滾動到視圖)只更新部分

如果您需要了解更多信息,我們需要看到一些代碼來幫助您分析。

0

您可以通過Graphics.SmoothingMode屬性設置爲SmoothingMode.None關閉抗鋸齒。

0

OpenGL和System.Graphics(GDI +)使用differenty種 「繪圖」 的。

使用的OpenGL圖形卡,從而重繪速度快,價格便宜。 WindowsForms中的System.Graphics使用GDI +,它由CPU執行,因此與GPU相比非常慢。

有很多trics到renderin使用GDI +加速。 一種是將代碼更改爲僅重繪已更改/移位的零件。但保持休息。