2013-05-10 15 views
0

在我的節目,我有一個圖片框,包含一個位圖性能優化(300×35KB PNG文件)C#: - 重畫位圖

如果兩個變量(X/Z座標)發生變化,我畫WindowsForms。一個新的圈子每秒鐘相應的新位置 - 定時器在後臺運行,調用此方法。

void DrawEllipse() 
{  
    // Retrieve the image. 
    bChamber = new Bitmap(global::Project.Properties.Resources.driveChamber1); 

    gChamber = Graphics.FromImage(bChamber); 
    gChamber.FillEllipse(brushChamber, VirtualViewX(), VirtualViewY(), 10, 10); 
    pictureBoxDriveView.Image = bChamber;   
} 

現在我正在尋找方法來優化性能。每0.2秒重新繪製圖片,例如這麼慢的節目,我不能做任何事情。但最終我需要一個更圓滑的圓圈運動,你可以想象它是如何滯後1000毫秒刷新率的。

有沒有更好的方法來做到這一點,然後每次加載整個位圖?

+0

我不明白改變變量和這種方法之間的相關性,看起來計時器總是會每秒鐘繪製一個橢圓而不管變化如何? – Sayse 2013-05-10 09:40:05

+0

當然有更好的方法。試圖讓winforms做圖形有點像嘗試在浴室做飯。這只是錯誤的工具。創建一個WPF控件 - 在圖像上方放置一個畫布,將其捆綁成一個,使用WPF Interop導入,在畫布上繪製。 – 2013-05-10 09:45:04

+0

J ..將調查WPF,感謝提示 – 2013-05-10 09:59:32

回答

2

使用控件的方式。

  • 不要自己重繪位圖。
  • 只是在Picturebox中加載1x。
  • 處理圖片框的繪圖事件以繪製橢圓
  • 無論何時您的座標改變,圖片框都會失效。
0

繪製在控制(圖片框)圓一次

把整個300x300的圖片框控件。

當且僅當變量發生變化時,用圓圈更新圖片框的位置。

這樣你可以防止太多的繪圖。

-1

試試這個,它不會每次都從磁盤加載鏡像,所以它比較便宜。

private Image _origImage = new Bitmap(global::Project.Properties.Resources.driveChamber1); 

void DrawEllipse() 
{ 
    // Retrieve the image. 
    Image bChamber = new Bitmap((Image)this._origImage.Clone()); 

    Graphics gChamber = Graphics.FromImage(bChamber); 

    gChamber.FillEllipse(brushChamber, VirtualViewX(), VirtualViewY(), 10, 10); 
    pictureBoxDriveView.Image = bChamber; 
} 
+0

一個簡單的助推器,謝謝:) – 2013-05-10 09:59:01

+0

可以提高到200ms,並且仍然可以通過這種方式獲得更好的性能:) – 2013-05-10 10:11:28

0

嘗試形式的DoubleBuffered屬性設置爲true。這通常會改善性能。

此外,你應該把這個

// Retrieve the image. 
bChamber = new Bitmap(global::Project.Properties.Resources.driveChamber1); 

在類的構造函數。

+0

每次調用函數時都必須加載圖像,否則我會繪製一條線而不是單個圓。老圈子還在那裏 – 2013-05-10 09:58:03

+0

我明白了。那麼'DoubleBuffered'技巧仍然適用,您可以使用@ mtsiakiris的回覆,因爲它仍然會創建一個新的位圖,但只會將圖像加載到內存一次。 – 2013-05-10 10:04:10