2015-02-06 37 views
0

是否每次都創建一個新的筆畫功能稱爲危險?它會使用大量的內存嗎?可以在Paint函數中創建新筆嗎?

那麼,我應該使用哪一個?

private void Form1_Paint(object sender, PaintEventArgs e) 
{ 
    e.Graphics.DrawLine(new Pen(Color.Black..... 

tpen = new Pen(Color.Black) 
private void Form1_Paint(object sender, PaintEventArgs e) 
{ 
    e.Graphics.DrawLine(tpen 
+0

我認爲,第二個版本是更好的。 Paint事件可能發生得非常頻繁,所以沒有理由每次創建新的Pen。 – 2015-02-06 14:16:05

+0

危險?是的,它可以召喚狼人。大量的公羊?是的,你的機器會在幾秒鐘內崩潰。更嚴重的一點是:你覺得怎麼樣?你做過任何研究嗎?你有沒有看到[如果我不在筆對象上調用Dispose會發生什麼?](http://stackoverflow.com/questions/4267729/what-happens-if-i-dont-call-dispose-on-the-筆對象)?你知道垃圾收集是什麼嗎? – CodeCaster 2015-02-06 14:18:21

+0

你解決了你的問題嗎? – TaW 2015-02-09 19:08:47

回答

2

PenIDisposable實現,這意味着它應儘快因爲它不需要再處理。您不應該在DrwaLine調用中直接創建它(因爲無法處理它)。它也不應該是集體成員,假設它是只有呼叫DrawLine需要。

更好的方法是:

private void Form1_Paint(object sender, PaintEventArgs e) 
{ 
    using(Pen pen = new Pen(Color.Black)) 
    { 
     e.Graphics.DrawLine(tpen, ...); 
    } 
} 

這樣的筆被佈置即使發生異常的。

如果所有你設置的是顏色,你可以通過使用靜態Pens.Black物業內聯它:

e.Graphics.DrawLine(Pens.Black, ...); 

由於對象將由Pen級緩存,你不需要擔心處置它。

+0

我同意;創建筆作爲班級領域的好處很小 - 但「使用」是必不可少的。事實上,你絕對不應該創建GDI對象並掛在它們上面!創建它們,使用它們,處置它們。 GDI對象可能會受到限制。 – 2015-02-06 14:19:39

+0

@MthetheWWatson GDI對象可能是有限的,但是說_「不應該創建GDI對象並掛在它們上!」_我認爲將取決於對象的類型。 '筆' - 當然; '刷子'當然; 'Fonts'也許;也許是'Metafiles'。 「位圖」取決於。我不想在我的無閃爍_滾動圖表control_中繼續重新創建我的離線位圖,30 FPS。 **重新創建**對象的**費用**可能勝過簡單的保留它。我重新創建它的唯一時間是如果控件調整大小。如果窗口不可見或最小化,請從DirectX/OpenGL中取出並釋放它們。 – MickyD 2015-02-06 14:39:46

+0

@MickyDuncan是的我的意思是畫筆和鋼筆,而不是位圖(這將使雙緩衝有點具有挑戰性!) – 2015-02-06 15:28:16

3
  • 如果不改變Pen屬性,你可以簡單地使用Pens.Black,一個standad Pen,你甚至無法處理。

  • 如果您知道只使用幾個Pens,您可以在程序運行時保留它們。

  • 如果你需要創建一個大的或未知數量的Pens,也許通過繪製操作的文件工作,那麼就在using條款創建它們,不用擔心創建它們的時間;它發生得非常快。

而且diposing他們是不是這麼多的內存,但約GDI資源,這是比較有限的,因此必須漏..

相關問題