2009-08-18 69 views
3

我一直在研究.NET中的一些GDI +代碼,並一直在努力學習我的教訓。喜歡簡單的事情:GDI中的經驗法則+

  • 什麼在屏幕上看起來不錯可以不看在紙上不錯,反之亦然
  • 緩存對象太多可能會導致一個OutOfMemoryException
  • 浮標可能不準確,

...等等。我相信經驗豐富的人可以增加更多。

當使用GDI +或任何圖形庫時,遵循什麼規則?

每篇文章一個有用的提示將很好。謝謝。

+0

[在GDI + XY值硬限制(http://stackoverflow.com/questions/3468495) – 2010-08-12 17:51:28

回答

5

儘可能晚地創建對象(不要過早地優化/緩存)並儘早釋放它們(調用Dispose或使用IDisposable語句封裝)。

2

不要避免使用非託管調用,它可以加快正確完成了很多事情。

2

當您在邏輯/屏幕座標之間進行轉換時,小心謹慎。如果在錯誤的時間完成,你可能會用完精確度並得到一些令人討厭的繪圖工件。

最後一次這個位我,我試圖計算一個新的邏輯座標點;那些已經接近精度的極限了,所以新的觀點並不完全符合人們的希望。儘快進行轉換修復。

雖然API允許您將浮點座標傳遞給GDI +,但通過轉換到屏幕座標的速度可能會很快,但可能會出現類似的問題。

2

不要畫得比你更多。

一般來說,繪圖操作比您要執行的其他計算(尤其是在GDI +中,這是一個很好的API,但不是最快的繪圖庫)要貴。花更多時間在自己的代碼中避免不必要的繪圖操作(例如,多次繪製相同的東西)通常是非常值得的。

2

GDI Gotchas已經燒了我幾次。

  • 克隆不克隆()基礎數據克隆(Rectangle,PixelFormat)。所以如果你處理一個克隆(),原始對象變得不可用。如果你想要兩個獨立的位圖,使用新的位圖()。
  • 如果您加載圖像FromFile,那麼該文件被鎖定,直到位圖被丟棄(甚至不能被讀取)。
  • 使用DrawImage時,請不要忘記設置SmoothingMode,InterpolationMode和PixelOffsetMode,否則您會對圖像的低質量感到驚訝。
1

不是嚴格意義上的GDI +問題,但記住這保存自己幾個小時的調試:

一個錯誤我犯了過於頻繁地使用GDI +在.NET中是調用的Transform財產Matrix方法Graphics對象。實施例(在C++/CLI):

g->Transform->Translate(100.0f, 250.0f); // WRONG. Will not have any effect. 

Transform屬性的吸氣劑只返回矩陣的拷貝。因此,在此副本上調用的任何方法都不會影響圖形變換的值。要操作圖形變換,請調用其中一種包裝方法(如下所示)(MultiplyTransform,TranslateTransform,ScaleTransform等)。

g->TranslateTransform(100.0f, 250.0f); 
相關問題