以前編寫gdi程式的時候沒有怎麼注意這一塊,dc隨便使用,也沒有什麼大問題,現在發現這樣做問題很大,首先就是記憶體洩露
乙個dc就相當於乙個畫家,但是他沒有畫筆、顏料、畫布就不能作畫,在gdi就類似於pen、brush、bitmap等等,乙個dc的建立要涉及到畫畫的各個方面,因而它是一塊很大的記憶體消耗,dc的bitmap,也就是我們把畫畫在什麼地方可以使顯示卡的視訊記憶體,頁可以是記憶體,就看你當時是如何建立,怎麼把自己的東西給畫家,現在你要換一把刷子,通過select物件把自己的刷子給畫家,這裡一定要儲存原來的刷子,因為如果你不儲存原來的東東,預設的是不會替你釋放的,dc這種東東,不想new 和 delet,通過new 和 delete得到的記憶體塊洩露了,在程式結束的時候一般會釋放掉,但是這個dc,一旦建立就不會釋放,除非你呼叫釋放函式,因而要謹慎使用。
有人可能在編寫gdi程式的時候使用的比較多,想一次性讀完儲存起來,後面使用的時候就直接往物理dc上面帖,這裡要注意兩個問題,首先我們為了速度快,可以把bitmap儲存起來,注意這裡不是儲存的是dc,什麼時候貼圖,就建立乙個臨時dc,帖完之後立刻釋放,注意這裡儲存的是bitmap,而不是dc,節省很大的空間,其次,當乙個記憶體中bitmap選給乙個dc的時候,其他的dc就不能選相同的,「兩個畫家搶一塊畫布」;注意的第二個地方就是乙個釋放的問題,很多人都喜歡用get rlease,這樣做沒有錯,但是注意這裡只是針對物理dc,這個rleasedc並沒有真正的釋放,只是類似於乙個計數器減一,因為這個dc是顯示卡的dc,想釋放掉也不可能,對於記憶體dc,就不要用releasedc,並沒有完成的釋放掉記憶體,最好使用deletedc,這裡在delete最好先釋放掉,當記憶體一副bitmap在dc的時候釋放是不成功,要釋放的時候就把old的bitmap選回來再釋放。
這裡,一般來說我們都不直接操作物理dc,對於乙個視窗我們先建乙個快取dc,所有的操作都是針對這個快取dc的,操作完成之後,一次性的拷貝到物理dc上面。
另外,如果想要做透明效果,注意這個問題,一般來說我們建立bitmap的時候建立的是24位,對於png,本身就由32位(包含aphla位),但是普通的bitble都是24位的拷貝,我們可以建立32位的bitmap,我們可以重新寫bitblt,讓他可以直接帖透明地圖。
deletedc(pdc)與releasedc(pdc)有何不同?
create- >delete
get- >release
注意對應關係
自己的一點學習體會
DC實戰問題彙總
這篇部落格主要記錄我在使用dc的過程 現的問題以及解決的辦法。1 在設計檔案中,可能將parameter單獨提取出來,放在乙個檔案中。然後其他verilog檔案就可以直接使用這些parameter。在dc的時候這些存放parameter的檔案不要read到dc環境中。因為這樣會報錯。解決辦法是將這些...
CvSeq 的記憶體釋放問題
key words opencv,cvseq,cvreleasememstorage cvseq 是opencv裡動態結構中的一種非常重要的型別,主要由sequence header和sequence data組成。cvcreateseq int seq flags,int header size,...
malloc釋放的想到的問題
原因是這樣的,在看我們的服務後台 時,發現如下段 有點意思 char s strdup xx 拷貝一堆字串 while char token strsep s,free s strsep中針的位置會做改變,如果釋放乙個非頭部的指標會怎樣呢,之前沒有考慮過,然後就做了個小測試,記錄一下免得以後又忘了。...