CE6下相容和非相容位元影像的深入分析

來源:互聯網
上載者:User

 

相容位元影像即DDB,由CreateCompatibleBitmap建立;非相容位元影像即DIB,是由LoadImage、SHLoadBitmap、CreateDIBSection、CreateBitmap建立。

非相容位元影像和相容位元影像有兩個本質差別
第一個區別是相容位元影像的存放空間通常由GWES或顯示驅動分配,處於驅動層之中,可以擷取到存放資料的物理地址,而非相容位元影像的存放空間通常由應用程式分配,處於應用程式層中,不能擷取到物理地址。
第二個區別是相容位元影像與顯示驅動的位深和像素格式保持一致(WinCE顯示驅動的位深和格式是固定的),如顯示驅動採用的是16位RGB565的位深和像素格式,則相容位元影像的格式也一樣,而非相容位元影像通常不相同,即它內部可能是32位位深ARGB的格式,也有可能是24位RGB888的格式。

以上兩個區別意味著
第一個區別意味著非相容位元影像無法享受2D顯示模組的硬體加速,硬體加速的原理類似DMA,需要物理地址,而非相容位元影像擷取不到物理地址,自然無法進行硬體加速。
第二個區別意味著非相容位元影像拷貝到顯示介面上往往需要進行色彩轉換,因為它要符合顯示驅動的顏色格式才能正常地顯示出來,常用的位元影像格式是24位RGB888,而顯示驅動常用的格式是16位RGB565、32位ARGB8888,自然免不了轉換,這部分工作都是在顯示驅動中進行的,如果僅有一兩次轉換或少量像素的轉換可能不會有什麼,但如果是大量的繪圖操作,意味著每次拷貝都會進行轉換,這將把寶貴的系統資源消耗在位元影像的轉換上。
補充說明:
1、建立相容位元影像的時候,GDI會調用GPE的AllocSurface(純虛)方法建立GPESurf(主表面也就是LCD對應的顯存是第一時間創立的,剩下的也就用於GDI對象了),GPESurf建構函式是用new來分配記憶體的,也就是說從0xD0000000~0xDFFFFFFF地區分配的;如果系統定製的時候預留記憶體(也就是視頻記憶體),並重載GPESurf優先從視頻記憶體上分配則可以用於DMA實現加速,換句話說如果不重載GPESurf,為顯示預留記憶體是沒有意義的。
2、建立非相容位元影像的時候,GDI未調用GPE的AllocSurface方法
3、GDI的SurfaceHeap類可用於對預留的視頻記憶體進行管理

下面是一組測試可以證明兩者的差別,測試方法是迴圈建立800*480的16位HBITMAP直到返回失敗
CreateCompatibleBitmap
NK.exe的heap一直增加,直到耗盡實體記憶體。堆分配位址範圍0xD0000000~0xDFFFFFFF(核心空間地址,由所有被核心載入的服務和驅動共用)
CE6模擬器執行50次,實體記憶體由39063552降到503808,NK.exe的heap為40406591,應用的heap為2016
CE6裝置執行279次,實體記憶體由83456000降到815104,NK.exe的heap為83519444,應用的heap為19616
補充:CE5模擬器執行35次,實體記憶體由43204608降到16211968,這估計是因為CE5進程只有32MB空間

CreateDIBSection
應用的heap一直增加,直到耗盡實體記憶體。堆分配位址範圍0x00010000~0x3FFFFFFF(進程及使用者指派的虛擬位址)
CE6模擬器執行50次,實體記憶體由39059456降到442368,NK.exe的heap為2022079,應用的heap為38403616
CE6裝置執行107次,實體記憶體由83439616降到872448,NK.exe的heap為1207028,應用的heap為82199040

測試代碼如下

void* pucAddr;struct {BITMAPINFOHEADERbmiHeader;intBitMask[3];} bmi;bmi.bmiHeader.biWidth         = 800 ;bmi.bmiHeader.biHeight        = -480 ;bmi.bmiHeader.biPlanes        = 1 ;bmi.bmiHeader.biSizeImage     = 0 ;bmi.bmiHeader.biXPelsPerMeter = 0 ;bmi.bmiHeader.biYPelsPerMeter = 0 ;bmi.bmiHeader.biClrUsed       = 0 ;bmi.bmiHeader.biClrImportant  = 0 ;bmi.bmiHeader.biBitCount    = 16 ;bmi.bmiHeader.biSize = sizeof(bmi);bmi.bmiHeader.biCompression = BI_BITFIELDS;bmi.BitMask[0] = 0xF800;bmi.BitMask[1] = 0x07E0;bmi.BitMask[2] = 0x001F;HBITMAP hBitmap;for(int i = 0; ; i++){#if 1hBitmap = ::CreateCompatibleBitmap(::GetDC(NULL), 800, 480);#elsehBitmap = ::CreateDIBSection( NULL, (BITMAPINFO*)&bmi, DIB_RGB_COLORS, (void**)&pucAddr, NULL, 0) ;#endifDWORD dwRet = ::GetLastError();if(dwRet == 8) {DebugBreak();}}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.