GDI和GDI 的應用場合思考

2022-02-03 01:47:57 字數 960 閱讀 5142

gdi是微軟公司的著名的二維圖形引擎,gdi+則是微軟公司為了提高顯示效果而推出的一種新型圖形引擎。下面我就我的一些使用經驗闡述二者適用的應用場合

gdi基本能滿足一般的繪圖要求。我覺得gdi最令人詬病的是它畫出來的線顯示的鋸齒實在比較厲害,挑剔的客戶會不滿意(注:autocad的繪製二維線應該是使用gdi的,它應該是降低了gdi的鋸齒程度,不知它是怎麼做到的?但依稀還能看到它的鋸齒)。另外在複雜的繪圖場合gdi確實不能滿足要求,如繪製漸變色的線以及漸變色區域。這時gdi+確實是派上用場了,gdi+的表現效果確實比gdi好得多。但是gdi+的互動性不如gdi。比如gdi+不支援gdi的橡皮筋技術(即gdi的繪圖模式)。gdi+不支援繪圖模式也很好理解,因為gdi+的設計目標應該是為了取得更好的表現效果,如果支援位運算的繪圖模式,勢必搞得機制非常複雜。

可能有些同學比較藐視橡皮筋:橡皮筋也稱得上是技術嗎?確實橡皮筋的原理不複雜,但是它在使用者互動中作用比較大。網上一些文章鼓吹使用雙緩衝代替gdi的橡皮筋,說實話,這個做法小規模繪圖或許可以用用,在一般的正規繪圖軟體中估計不會用,原因是什麼?因為一般的正規繪圖軟體在整個客戶區的繪圖就是使用雙緩衝繪圖的,使用者互動繪圖本來就是乙個隨機過程,難不成你為每次使用者繪圖操作都開闢乙個客戶區大小的緩衝實現雙緩衝區繪圖?因此,這個實際上這個並不可行。

gdi+也沒有自己的雙快取機制,需要gdi的雙快取機制來支撐,具體是構造記憶體dc來實現。

在圖元比較多的時候gdi+的效率也會成問題,特別是開啟反鋸齒功能的時候。網上有人測試過gdi+在開啟反鋸齒時比qt開啟反鋸齒時慢了不少(他的實驗是:分別用gdi gdi+ qt繪製寬度為3的線條999條,發現

gdi無抗鋸齒:24ms

gdi+無抗鋸齒:86ms

gdi+抗鋸齒:800ms+

qt抗鋸齒:220ms)

因此我覺得比較好的二維繪圖組合是:gdi負責互動繪圖以及雙快取的實現,gdi+負責複雜顯示效果的實現以及沒有使用者互動的繪圖場合(當然在需要考慮繪圖效率的繪圖場合斟酌使用)。

GDI和GDI 的應用場合思考

gdi是微軟公司的著名的二維圖形引擎,gdi 則是微軟公司為了提高顯示效果而推出的一種新型圖形引擎。下面我就我的一些使用經驗闡述二者適用的應用場合 gdi基本能滿足一般的繪圖要求。我覺得gdi最令人詬病的是它畫出來的線顯示的鋸齒實在比較厲害,挑剔的客戶會不滿意 注 autocad的繪製二維線應該是使...

traits的應用場合

模板 泛型 實際上就是巨集定義乙個型別,此型別是乙個通用型別 故又叫泛型 把具體型別 包括指標型別 帶入進去就會形成乙個新的型別。下面是代入時兩種編譯錯誤的解決方法 一 模板 泛型 具型成 int valuetype 時 代入基本型別 這顯然編譯不過,就像下面這樣偏特化處理 my type trai...

extern C 的應用場合

首先extern c 是一句申明語句,它的意思是告訴編譯器用c的規則去編譯該申明語句後的內容,一般都是申明函式。我們都知道c 具有函式過載的功能,比如說某個檔案包含下面這兩個函式 int foo int a int foo double a 它們的函式名都長得一樣,但是引數型別不一樣。如果該檔案是....