WINCE之绘图显示效率对比

文章来源:http://blog.csdn.net/zjh824/article/details/6128554

[cpp]  view plain copy
  1. #include <pkfuncs.h>  
  2. #define rgb565(r,g,b) (WORD)((((WORD)r&0xf8)<<8)|(((WORD)g&0xfc)<<3)|(((WORD)b&0xf8)>>3))  
  3.   
  4. void CTestDisplayDlg::OnBnClickedButton1()  
  5. {  
  6.     // TODO: 在此添加控件通知处理程序代码  
  7.     //char *gpLCDBuf;  
  8.     //gpLCDBuf = (char*)VirtualAlloc(NULL,0x100000,MEM_RESERVE,PAGE_NOACCESS);  
  9.     //VirtualCopy(gpLCDBuf, (void *)(0x30100000/256), 0x100000, PAGE_READWRITE | PAGE_PHYSICAL | PAGE_NOCACHE);  
  10. //  memset(gpLCDBuf,0xFF,0x100000);      
  11.   
  12.   
  13. //  HDC m_hdcBuffer = CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL);  
  14.   
  15. //  HDC hDisplayDC = ::CreateDC(_T("DISPLAY"), NULL, NULL, NULL);  
  16.     HDC hDisplayDC = ::GetDC(m_hWnd);  
  17.     HDC m_hdcBuffer = ::CreateCompatibleDC(hDisplayDC);  
  18.     //int a = ::GetDeviceCaps(hDisplayDC,BITSPIXEL);  
  19.     //int b = ::GetDeviceCaps(hdcTmp, BITSPIXEL);  
  20.     //int c = ::GetDeviceCaps(m_hdcBuffer, BITSPIXEL);  
  21.     HBITMAP m_hbmpBuffer;  
  22.   
  23.     m_hbmpBuffer = ::CreateCompatibleBitmap(hDisplayDC, 800, 480);  
  24.     HBITMAP hbmp = (HBITMAP)::SelectObject(m_hdcBuffer, m_hbmpBuffer);  
  25.     ::SetBkMode(m_hdcBuffer, TRANSPARENT);  
  26.     ::SetStretchBltMode(m_hdcBuffer, COLORONCOLOR);  
  27.     ::PatBlt(m_hdcBuffer, 0, 0, 800, 480,BLACKNESS);  
  28. //  ::Set  
  29.     for(int i=0; i<255; ++i)  
  30.     {  
  31.         HPEN hpen = ::CreatePen(PS_SOLID, 1, RGB(i,0, 0));  
  32.         HPEN hOldPen = (HPEN)::SelectObject(m_hdcBuffer, hpen);  
  33.   
  34.         ::MoveToEx(m_hdcBuffer,i,0,   NULL);  
  35.         ::LineTo(m_hdcBuffer, i,480 );  
  36.         ::DeleteObject(::SelectObject(m_hdcBuffer, hOldPen));  
  37.           
  38.     }  
  39.   
  40.     for(int i=0; i<=255; ++i)  
  41.     {  
  42.         HPEN hpen = ::CreatePen(0, 1, RGB(0,i, 0));  
  43.         HPEN hOldPen = (HPEN)::SelectObject(m_hdcBuffer, hpen);  
  44.   
  45.         ::MoveToEx(m_hdcBuffer, i+256,0,  NULL);  
  46.         ::LineTo(m_hdcBuffer, i+256,480 );  
  47.         ::DeleteObject(::SelectObject(m_hdcBuffer, hOldPen));  
  48.     }  
  49.   
  50.     for(int i=0; i<=255; ++i)  
  51.     {  
  52.         HPEN hpen = ::CreatePen(0, 1, RGB(0,0, i));  
  53.         HPEN hOldPen = (HPEN)::SelectObject(m_hdcBuffer, hpen);  
  54.   
  55.         ::MoveToEx(m_hdcBuffer,i+512, 0,  NULL);  
  56.         ::LineTo(m_hdcBuffer, i+512, 480);  
  57.         ::DeleteObject(::SelectObject(m_hdcBuffer, hOldPen));  
  58.     }  
  59.     //::SetPixel(m_hdcBuffer, 0, 0, RGB(200, 0, 0));  
  60.     //*((WORD*)m_lpBitmapBits + 1) = rgb565(200, 0, 0);  
  61.     //*((WORD*)m_lpBitmapBits + 2) = rgb565(200, 0, 0);  
  62.     //*((WORD*)m_lpBitmapBits + 3) = rgb565(200, 0, 0);  
  63.     DWORD dwTime = ::GetTickCount();  
  64.     BitBlt(hDisplayDC, 0, 0,800 ,480 , m_hdcBuffer, 0, 0, SRCCOPY);  
  65.     RETAILMSG(1, (TEXT("BitBlt use tickcount is %d /r/n"), ::GetTickCount() - dwTime));  
  66.   
  67.     DeleteObject(::SelectObject(m_hdcBuffer, hbmp));  
  68.     DeleteDC(m_hdcBuffer);  
  69. //  ::DeleteDC(hDisplayDC);  
  70.     ::ReleaseDC(m_hWnd, hDisplayDC);  
  71. }  
  72.   
  73. void CTestDisplayDlg::OnBnClickedButton2()  
  74. {  
  75.     // TODO: 在此添加控件通知处理程序代码  
  76.   
  77.     //  HDC hDisplayDC = ::CreateDC(_T("DISPLAY"), NULL, NULL, NULL);  
  78.     HDC hDisplayDC = ::GetDC(m_hWnd);  
  79.     HDC m_hdcBuffer = ::CreateCompatibleDC(hDisplayDC);  
  80.     HBITMAP m_hbmpBuffer;  
  81.     LPBYTE m_lpBitmapBits;  
  82.     BITMAPINFO bmpInfo;  
  83.     ZeroMemory(&bmpInfo, sizeof(bmpInfo));  
  84.     bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);  
  85.     bmpInfo.bmiHeader.biBitCount = 16;  
  86.     bmpInfo.bmiHeader.biWidth = 800;  
  87.     bmpInfo.bmiHeader.biHeight = -480;  
  88.     bmpInfo.bmiHeader.biPlanes = 1;  
  89.     //bmpInfo.bmiHeader.biCompression = BI_BITFIELDS;  
  90.     //*(DWORD *)(&bmpInfo.bmiColors[0]) = 0xF800;  
  91.     //*(DWORD *)(&bmpInfo.bmiColors[1]) = 0x07E0;  
  92.     //*(DWORD *)(&bmpInfo.bmiColors[2]) = 0x001F;  
  93.   
  94.     bmpInfo.bmiHeader.biSizeImage = 0;  
  95.     bmpInfo.bmiHeader.biXPelsPerMeter = 0;  
  96.     bmpInfo.bmiHeader.biYPelsPerMeter = 0;  
  97.     bmpInfo.bmiHeader.biClrUsed = 0;  
  98.     bmpInfo.bmiHeader.biClrImportant = 0;  
  99.   
  100.     m_hbmpBuffer = ::CreateDIBSection(m_hdcBuffer, (BITMAPINFO *)&bmpInfo,   
  101.         DIB_RGB_COLORS, (void **)&m_lpBitmapBits, NULL, 0);  
  102.   
  103.     HBITMAP hbmp = (HBITMAP)::SelectObject(m_hdcBuffer, m_hbmpBuffer);  
  104.     ::SetBkMode(m_hdcBuffer, TRANSPARENT);  
  105.     ::SetStretchBltMode(m_hdcBuffer, COLORONCOLOR);  
  106.   
  107.     ::PatBlt(hDisplayDC, 0, 0, 800, 480,BLACKNESS);  
  108. //  ::BitBlt(hDisplayDC, 0, 0, 800, 480, m_hdcBuffer, 0, 0, SRCCOPY);  
  109.   
  110.   
  111.     for(int i=0; i<=255; ++i)  
  112.     {  
  113.         HPEN hpen = ::CreatePen(0, 1, RGB(i,0, 0));  
  114.         HPEN hOldPen = (HPEN)::SelectObject(m_hdcBuffer, hpen);  
  115.   
  116.         ::MoveToEx(m_hdcBuffer,i, 0,  NULL);  
  117.         ::LineTo(m_hdcBuffer, i,480 );  
  118.         ::DeleteObject(::SelectObject(m_hdcBuffer, hOldPen));  
  119.     }  
  120.   
  121.     for(int i=0; i<=255; ++i)  
  122.     {  
  123.         HPEN hpen = ::CreatePen(0, 1, RGB(0,i, 0));  
  124.         HPEN hOldPen = (HPEN)::SelectObject(m_hdcBuffer, hpen);  
  125.   
  126.         ::MoveToEx(m_hdcBuffer, i+256,0,  NULL);  
  127.         ::LineTo(m_hdcBuffer, i+256,480 );  
  128.         ::DeleteObject(::SelectObject(m_hdcBuffer, hOldPen));  
  129.     }  
  130.   
  131.     for(int i=0; i<=255; ++i)  
  132.     {  
  133.         HPEN hpen = ::CreatePen(0, 1, RGB(0,0, i));  
  134.         HPEN hOldPen = (HPEN)::SelectObject(m_hdcBuffer, hpen);  
  135.   
  136.         ::MoveToEx(m_hdcBuffer,i+512, 0,  NULL);  
  137.         ::LineTo(m_hdcBuffer, i+512, 480);  
  138.         ::DeleteObject(::SelectObject(m_hdcBuffer, hOldPen));  
  139.     }  
  140.     //::SetPixel(m_hdcBuffer, 0, 0, RGB(200, 0, 0));  
  141.     //*((WORD*)m_lpBitmapBits + 1) = rgb565(200, 0, 0);  
  142.     //*((WORD*)m_lpBitmapBits + 2) = rgb565(200, 0, 0);  
  143.     //*((WORD*)m_lpBitmapBits + 3) = rgb565(200, 0, 0);  
  144.   
  145.     //  ::BitBlt(hDisplayDC, 0, 0, 800, 480, m_hdcBuffer, 0, 0, SRCCOPY);  
  146.     DWORD dwTime = ::GetTickCount();  
  147.   
  148.     ::StretchDIBits(hDisplayDC, 0, 0, 800, 480, 0, 0, 800, 480, m_lpBitmapBits, &bmpInfo, DIB_RGB_COLORS, SRCCOPY);  
  149.     RETAILMSG(1, (TEXT("StretchDIBits use tickcount is %d /r/n"), ::GetTickCount() - dwTime));  
  150.   
  151.     DeleteObject(::SelectObject(m_hdcBuffer, hbmp));  
  152.     DeleteDC(m_hdcBuffer);  
  153.     //  ::DeleteDC(hDisplayDC);  
  154.     ::ReleaseDC(m_hWnd, hDisplayDC);  
  155.   
  156.   
  157. }  
  158.   
  159. void CTestDisplayDlg::OnBnClickedButton4()  
  160. {  
  161.   
  162.   
  163.     //  HDC hDisplayDC = ::CreateDC(_T("DISPLAY"), NULL, NULL, NULL);  
  164.     HDC hDisplayDC = ::GetDC(m_hWnd);  
  165.     HDC m_hdcBuffer = ::CreateCompatibleDC(hDisplayDC);  
  166.     HBITMAP m_hbmpBuffer;  
  167.     LPBYTE m_lpBitmapBits;  
  168.     BITMAPINFO*  lpNewBmpInfo = (BITMAPINFO *) new BYTE[ ( sizeof(BITMAPINFOHEADER) + 3*sizeof(RGBQUAD) ) ];      
  169.   
  170.     ZeroMemory(lpNewBmpInfo, sizeof(BITMAPINFO));  
  171.     lpNewBmpInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);  
  172.     lpNewBmpInfo->bmiHeader.biBitCount = 16;  
  173.     lpNewBmpInfo->bmiHeader.biWidth = 800;  
  174.     lpNewBmpInfo->bmiHeader.biHeight = -480;  
  175.     lpNewBmpInfo->bmiHeader.biPlanes = 1;  
  176.   
  177.   
  178.     lpNewBmpInfo->bmiHeader.biSizeImage = 0;  
  179.     lpNewBmpInfo->bmiHeader.biXPelsPerMeter = 0;  
  180.     lpNewBmpInfo->bmiHeader.biYPelsPerMeter = 0;  
  181.     lpNewBmpInfo->bmiHeader.biClrUsed = 0;  
  182.     lpNewBmpInfo->bmiHeader.biClrImportant = 0;  
  183.   
  184.     lpNewBmpInfo->bmiHeader.biCompression = BI_BITFIELDS;  
  185.     *(DWORD *)(&(lpNewBmpInfo->bmiColors[0])) = 0xF800;  
  186.     *(DWORD *)(&(lpNewBmpInfo->bmiColors[1])) = 0x07E0;  
  187.     *(DWORD *)(&(lpNewBmpInfo->bmiColors[2])) = 0x001F;  
  188.   
  189.     m_hbmpBuffer = ::CreateDIBSection(m_hdcBuffer, (BITMAPINFO *)lpNewBmpInfo,   
  190.         DIB_RGB_COLORS, (void **)&m_lpBitmapBits, NULL, 0);  
  191.   
  192.     HBITMAP hbmp = (HBITMAP)::SelectObject(m_hdcBuffer, m_hbmpBuffer);  
  193.     ::SetBkMode(m_hdcBuffer, TRANSPARENT);  
  194.     ::SetStretchBltMode(m_hdcBuffer, COLORONCOLOR);  
  195.   
  196.     ::PatBlt(hDisplayDC, 0, 0, 800, 480,BLACKNESS);  
  197.   
  198.     for(int i=0; i<=255; ++i)  
  199.     {  
  200.         HPEN hpen = ::CreatePen(0, 1, RGB(i,0, 0));  
  201.         HPEN hOldPen = (HPEN)::SelectObject(m_hdcBuffer, hpen);  
  202.   
  203.         ::MoveToEx(m_hdcBuffer,i, 0,  NULL);  
  204.         ::LineTo(m_hdcBuffer, i,480 );  
  205.         ::DeleteObject(::SelectObject(m_hdcBuffer, hOldPen));  
  206.     }  
  207.   
  208.     for(int i=0; i<=255; ++i)  
  209.     {  
  210.         HPEN hpen = ::CreatePen(0, 1, RGB(0,i, 0));  
  211.         HPEN hOldPen = (HPEN)::SelectObject(m_hdcBuffer, hpen);  
  212.   
  213.         ::MoveToEx(m_hdcBuffer, i+256,0,  NULL);  
  214.         ::LineTo(m_hdcBuffer, i+256,480 );  
  215.         ::DeleteObject(::SelectObject(m_hdcBuffer, hOldPen));  
  216.     }  
  217.   
  218.     for(int i=0; i<=255; ++i)  
  219.     {  
  220.         HPEN hpen = ::CreatePen(0, 1, RGB(0,0, i));  
  221.         HPEN hOldPen = (HPEN)::SelectObject(m_hdcBuffer, hpen);  
  222.   
  223.         ::MoveToEx(m_hdcBuffer,i+512, 0,  NULL);  
  224.         ::LineTo(m_hdcBuffer, i+512, 480);  
  225.         ::DeleteObject(::SelectObject(m_hdcBuffer, hOldPen));  
  226.     }  
  227.     //::SetPixel(m_hdcBuffer, 0, 0, RGB(200, 0, 0));  
  228.     //*((WORD*)m_lpBitmapBits + 1) = rgb565(200, 0, 0);  
  229.     //*((WORD*)m_lpBitmapBits + 2) = rgb565(200, 0, 0);  
  230.     //*((WORD*)m_lpBitmapBits + 3) = rgb565(200, 0, 0);  
  231.   
  232.   
  233.     //  ::BitBlt(hDisplayDC, 0, 0, 800, 480, m_hdcBuffer, 0, 0, SRCCOPY);  
  234.     DWORD dwTime = ::GetTickCount();  
  235.   
  236.     ::StretchDIBits(hDisplayDC, 0, 0, 800, 480, 0, 0, 800, 480, m_lpBitmapBits,(BITMAPINFO*)lpNewBmpInfo, DIB_RGB_COLORS, SRCCOPY);  
  237.     RETAILMSG(1, (TEXT(" 16BPP StretchDIBits use tickcount is %d /r/n"), ::GetTickCount() - dwTime));  
  238.   
  239.     DeleteObject(::SelectObject(m_hdcBuffer, hbmp));  
  240.     DeleteDC(m_hdcBuffer);  
  241.     //  ::DeleteDC(hDisplayDC);  
  242.     ::ReleaseDC(m_hWnd, hDisplayDC);  
  243.     delete lpNewBmpInfo;  
  244.   
  245.   
  246. }  
  247.   
  248.   
  249. void CTestDisplayDlg::OnBnClickedButton5()  
  250. {  
  251.   
  252.     //  HDC hDisplayDC = ::CreateDC(_T("DISPLAY"), NULL, NULL, NULL);  
  253.     HDC hDisplayDC = ::GetDC(m_hWnd);  
  254.     HDC m_hdcBuffer = ::CreateCompatibleDC(hDisplayDC);  
  255.     HBITMAP m_hbmpBuffer;  
  256.     LPBYTE m_lpBitmapBits;  
  257.     BITMAPINFO*  lpNewBmpInfo = (BITMAPINFO *) new BYTE[ ( sizeof(BITMAPINFOHEADER) + 3*sizeof(RGBQUAD) ) ];      
  258.   
  259.     ZeroMemory(lpNewBmpInfo, sizeof(BITMAPINFO));  
  260.     lpNewBmpInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);  
  261.     lpNewBmpInfo->bmiHeader.biBitCount = 16;  
  262.     lpNewBmpInfo->bmiHeader.biWidth = 800;  
  263.     lpNewBmpInfo->bmiHeader.biHeight = -480;  
  264.     lpNewBmpInfo->bmiHeader.biPlanes = 1;  
  265.   
  266.   
  267.     lpNewBmpInfo->bmiHeader.biSizeImage = 0;  
  268.     lpNewBmpInfo->bmiHeader.biXPelsPerMeter = 0;  
  269.     lpNewBmpInfo->bmiHeader.biYPelsPerMeter = 0;  
  270.     lpNewBmpInfo->bmiHeader.biClrUsed = 0;  
  271.     lpNewBmpInfo->bmiHeader.biClrImportant = 0;  
  272.   
  273.     lpNewBmpInfo->bmiHeader.biCompression = BI_BITFIELDS;  
  274.     *(DWORD *)(&(lpNewBmpInfo->bmiColors[0])) = 0xF800;  
  275.     *(DWORD *)(&(lpNewBmpInfo->bmiColors[1])) = 0x07E0;  
  276.     *(DWORD *)(&(lpNewBmpInfo->bmiColors[2])) = 0x001F;  
  277.   
  278.     m_hbmpBuffer = ::CreateDIBSection(m_hdcBuffer, (BITMAPINFO *)lpNewBmpInfo,   
  279.         DIB_RGB_COLORS, (void **)&m_lpBitmapBits, NULL, 0);  
  280.   
  281.     HBITMAP hbmp = (HBITMAP)::SelectObject(m_hdcBuffer, m_hbmpBuffer);  
  282.     ::SetBkMode(m_hdcBuffer, TRANSPARENT);  
  283.     ::SetStretchBltMode(m_hdcBuffer, COLORONCOLOR);  
  284.   
  285.     ::PatBlt(hDisplayDC, 0, 0, 800, 480,BLACKNESS);  
  286.   
  287.     for(int i=0; i<=255; ++i)  
  288.     {  
  289.         HPEN hpen = ::CreatePen(0, 1, RGB(i,0, 0));  
  290.         HPEN hOldPen = (HPEN)::SelectObject(m_hdcBuffer, hpen);  
  291.   
  292.         ::MoveToEx(m_hdcBuffer,i, 0,  NULL);  
  293.         ::LineTo(m_hdcBuffer, i,480 );  
  294.         ::DeleteObject(::SelectObject(m_hdcBuffer, hOldPen));  
  295.     }  
  296.   
  297.     for(int i=0; i<=255; ++i)  
  298.     {  
  299.         HPEN hpen = ::CreatePen(0, 1, RGB(0,i, 0));  
  300.         HPEN hOldPen = (HPEN)::SelectObject(m_hdcBuffer, hpen);  
  301.   
  302.         ::MoveToEx(m_hdcBuffer, i+256,0,  NULL);  
  303.         ::LineTo(m_hdcBuffer, i+256,480 );  
  304.         ::DeleteObject(::SelectObject(m_hdcBuffer, hOldPen));  
  305.     }  
  306.   
  307.     for(int i=0; i<=255; ++i)  
  308.     {  
  309.         HPEN hpen = ::CreatePen(0, 1, RGB(0,0, i));  
  310.         HPEN hOldPen = (HPEN)::SelectObject(m_hdcBuffer, hpen);  
  311.   
  312.         ::MoveToEx(m_hdcBuffer,i+512, 0,  NULL);  
  313.         ::LineTo(m_hdcBuffer, i+512, 480);  
  314.         ::DeleteObject(::SelectObject(m_hdcBuffer, hOldPen));  
  315.     }  
  316.     //::SetPixel(m_hdcBuffer, 0, 0, RGB(200, 0, 0));  
  317.     //*((WORD*)m_lpBitmapBits + 1) = rgb565(200, 0, 0);  
  318.     //*((WORD*)m_lpBitmapBits + 2) = rgb565(200, 0, 0);  
  319.     //*((WORD*)m_lpBitmapBits + 3) = rgb565(200, 0, 0);  
  320.   
  321.   
  322.     DWORD dwTime = ::GetTickCount();  
  323.   
  324.     BitBlt(hDisplayDC, 0, 0,800 ,480 , m_hdcBuffer, 0, 0, SRCCOPY);  
  325.     RETAILMSG(1, (TEXT(" 16BPP BitBlt use tickcount is %d /r/n"), ::GetTickCount() - dwTime));  
  326.   
  327.     DeleteObject(::SelectObject(m_hdcBuffer, hbmp));  
  328.     DeleteDC(m_hdcBuffer);  
  329.     //  ::DeleteDC(hDisplayDC);  
  330.     ::ReleaseDC(m_hWnd, hDisplayDC);  
  331.     delete lpNewBmpInfo;  
  332.   
  333. }  
  334.   
  335.   
  336. void CTestDisplayDlg::OnBnClickedButton3()  
  337. {  
  338.     // TODO: 在此添加控件通知处理程序代码  
  339.   
  340.   
  341.     char *gpLCDBuf;  
  342.     gpLCDBuf = (char*)VirtualAlloc(NULL,0x100000,MEM_RESERVE,PAGE_NOACCESS);  
  343.     VirtualCopy(gpLCDBuf, (void *)(0x30100000/256), 0x100000, PAGE_READWRITE | PAGE_PHYSICAL | PAGE_NOCACHE);  
  344.     //  memset(gpLCDBuf,0xFF,0x100000);      
  345.   
  346.   
  347.     //  HDC m_hdcBuffer = CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL);  
  348.   
  349.     //  HDC hDisplayDC = ::CreateDC(_T("DISPLAY"), NULL, NULL, NULL);  
  350.     HDC hDisplayDC = ::GetDC(m_hWnd);  
  351.     HDC m_hdcBuffer = ::CreateCompatibleDC(hDisplayDC);  
  352.   
  353.     HBITMAP m_hbmpBuffer;  
  354.     LPBYTE m_lpBitmapBits;  
  355.     BITMAPINFO*  lpNewBmpInfo = (BITMAPINFO *) new BYTE[ ( sizeof(BITMAPINFOHEADER) + 3*sizeof(RGBQUAD) ) ];      
  356.   
  357.     //  BITMAPINFO bmpInfo;  
  358.     ZeroMemory(lpNewBmpInfo, sizeof(BITMAPINFO));  
  359.     lpNewBmpInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);  
  360.     lpNewBmpInfo->bmiHeader.biBitCount = 16;  
  361.     lpNewBmpInfo->bmiHeader.biWidth = 800;  
  362.     lpNewBmpInfo->bmiHeader.biHeight = -480;  
  363.     lpNewBmpInfo->bmiHeader.biPlanes = 1;  
  364.     lpNewBmpInfo->bmiHeader.biCompression = BI_BITFIELDS;  
  365.   
  366.   
  367.     lpNewBmpInfo->bmiHeader.biSizeImage = 0;  
  368.     lpNewBmpInfo->bmiHeader.biXPelsPerMeter = 0;  
  369.     lpNewBmpInfo->bmiHeader.biYPelsPerMeter = 0;  
  370.     lpNewBmpInfo->bmiHeader.biClrUsed = 0;  
  371.     lpNewBmpInfo->bmiHeader.biClrImportant = 0;  
  372.   
  373.     *(DWORD *)(&(lpNewBmpInfo->bmiColors[0])) = 0xF800;  
  374.     *(DWORD *)(&(lpNewBmpInfo->bmiColors[1])) = 0x07E0;  
  375.     *(DWORD *)(&(lpNewBmpInfo->bmiColors[2])) = 0x001F;  
  376.   
  377.     m_hbmpBuffer = ::CreateDIBSection(m_hdcBuffer, (BITMAPINFO *)lpNewBmpInfo,   
  378.         DIB_RGB_COLORS, (void **)&m_lpBitmapBits, NULL, 0);  
  379.   
  380.     HBITMAP hbmp = (HBITMAP)::SelectObject(m_hdcBuffer, m_hbmpBuffer);  
  381.     ::SetBkMode(m_hdcBuffer, TRANSPARENT);  
  382.     ::SetStretchBltMode(m_hdcBuffer, COLORONCOLOR);  
  383. //  ::PatBlt(hDisplayDC, 0, 0, 800, 480,BLACKNESS);  
  384.     memset(m_lpBitmapBits, 0, 800 * 480 * 2);  
  385.     CopyMemory(gpLCDBuf, m_lpBitmapBits, 800 * 480 * 2);  
  386.   
  387.   
  388.   
  389.   
  390.     for(int i=0; i<=255; ++i)  
  391.     {  
  392.         //HPEN hpen = ::CreatePen(0, 1, RGB(i,0, 0));  
  393.         //HPEN hOldPen = (HPEN)::SelectObject(m_hdcBuffer, hpen);  
  394.   
  395.         //::MoveToEx(m_hdcBuffer,i, 0,  NULL);  
  396.         //::LineTo(m_hdcBuffer, i,480 );  
  397.         //::DeleteObject(::SelectObject(m_hdcBuffer, hOldPen));  
  398.         LPWORD lpData = (LPWORD)m_lpBitmapBits;  
  399.         for(int j=0; j<480; ++j)  
  400.         {  
  401.             *(lpData + i + 800 * j ) = rgb565(i,0,0);  
  402.         }  
  403.     }  
  404.   
  405.     for(int i=0; i<=255; ++i)  
  406.     {  
  407.         LPWORD lpData = (LPWORD)m_lpBitmapBits;  
  408.         for(int j=0; j<480; ++j)  
  409.         {  
  410.             *(lpData + i+ 256 + 800 * j ) = rgb565(0,i,0);  
  411.         }  
  412.     /*  HPEN hpen = ::CreatePen(0, 1, RGB(0,i, 0));  
  413.         HPEN hOldPen = (HPEN)::SelectObject(m_hdcBuffer, hpen);  
  414.   
  415.         ::MoveToEx(m_hdcBuffer, i+256,0,  NULL);  
  416.         ::LineTo(m_hdcBuffer, i+256,480 );  
  417.         ::DeleteObject(::SelectObject(m_hdcBuffer, hOldPen));*/  
  418.     }  
  419.   
  420.     for(int i=0; i<=255; ++i)  
  421.     {  
  422.         LPWORD lpData = (LPWORD)m_lpBitmapBits;  
  423.         for(int j=0; j<480; ++j)  
  424.         {  
  425.             *(lpData + i+ 512 + 800 * j ) = rgb565(0,0,i);  
  426.         }  
  427.         //HPEN hpen = ::CreatePen(0, 1, RGB(0,0, i));  
  428.         //HPEN hOldPen = (HPEN)::SelectObject(m_hdcBuffer, hpen);  
  429.   
  430.         //::MoveToEx(m_hdcBuffer,i+512, 0,  NULL);  
  431.         //::LineTo(m_hdcBuffer, i+512, 480);  
  432.         //::DeleteObject(::SelectObject(m_hdcBuffer, hOldPen));  
  433.     }  
  434.     //::SetPixel(m_hdcBuffer, 0, 0, RGB(200, 0, 0));  
  435.     //*((WORD*)m_lpBitmapBits + 1) = rgb565(200, 0, 0);  
  436.     //*((WORD*)m_lpBitmapBits + 2) = rgb565(200, 0, 0);  
  437.     //*((WORD*)m_lpBitmapBits + 3) = rgb565(200, 0, 0);  
  438.   
  439.   
  440.   
  441.   
  442.     //for(int i = 0; i<800 * 240; ++i)  
  443.     //{  
  444.     //  *tmp++ = rgb565(255, 0, 0);  
  445.     //}  
  446.     DWORD dwTime = ::GetTickCount();  
  447.         CopyMemory(gpLCDBuf, m_lpBitmapBits, 800 * 480 * 2);  
  448.         RETAILMSG(1, (TEXT("FrameBuffer use tickcount is %d /r/n"), ::GetTickCount() - dwTime));  
  449.   
  450.   
  451. //  ::StretchDIBits(hDisplayDC, 0, 0, 800, 480, 0, 0, 800, 480, m_lpBitmapBits,(BITMAPINFO*)lpNewBmpInfo, DIB_RGB_COLORS, SRCCOPY);  
  452.   
  453.   
  454.     //  BitBlt(hdcTmp, 0, 0, rcWnd.Width(), rcWnd.Height(), m_hdcBuffer, 0, 0, SRCCOPY);  
  455.     //  InvalidateRect(NULL);  
  456.   
  457.   
  458.     VirtualFree(gpLCDBuf,0,MEM_RELEASE);  
  459.     DeleteObject(::SelectObject(m_hdcBuffer, hbmp));  
  460.     DeleteDC(m_hdcBuffer);  
  461.   
  462.     //  ::DeleteDC(hDisplayDC);  
  463.     ::ReleaseDC(m_hWnd, hDisplayDC);  
  464.   
  465.     delete lpNewBmpInfo;  
  466.   
  467. }  
  

 

GDI操作过程:往窗口的DC上以红绿蓝三种颜色分别画255根渐变的竖线。如图

 

显示结果:

设备兼容位图DDB:BitBlt use tickcount is 13 
DIB位图(格式不兼容):StretchDIBits use tickcount is 184 
rgb565 DIB位图: 16BPP StretchDIBits use tickcount is 12 
RGB565 DIB位图: 16BPP BitBlt use tickcount is 13 
直接写屏:FrameBuffer use tickcount is 9

 

结论:创建DDB位图与DIB位图,在贴图时的速度是一样的。唯一区别就是如果创建的DIB位图必须要与驱动里的位图格式一样,包括BIT_MASK的格式一样,也就是驱动里为RGB565的格式,应用里创建的位图也应该是RGB565的DIB位图,否则在BITBLT时驱动里会做一个RGB的转换,导致画图速度很慢,而创建DDB位图是不存在这种问题的,在速度上是不会慢的。

 

全部GDI操作的时间统计结果(只包括GDI操作,创建画笔,MOVETOEX,LINETO,SelectObject,BitBlt等,不包括位图创建,DC创建等):

BitBlt use tickcount is 443 
StretchDIBits use tickcount is 610 
 16BPP StretchDIBits use tickcount is 438 
 16BPP BitBlt use tickcount is 439 
FrameBuffer use tickcount is 116

 

结论:使用GDI时,前四种情况下的速度是一样的,与位图的格式无关,只是使用BitBlt时会因为位图格式不兼容造成很大性能损失。

但是如果使用直接写屏的操作可以把简单的GDI函数调用转换为纯粹的内存赋值操作,这种操作可以省掉很多时间。实际上可以用DIB位图来进行这种操作,直接针对DIB位图的内存数据写值来实现GDI的操作。

把16BPP的BitBlt修改为直接内存写值的操作,时间结果为:

BitBlt use tickcount is 442 
StretchDIBits use tickcount is 611 
 16BPP StretchDIBits use tickcount is 441 
 16BPP BitBlt use tickcount is 106 
FrameBuffer use tickcount is 104

由此可见,这种情况下与直接写屏的效率是一样的,对于频繁的GDI操作绘图,重写GDI的API调用可以节省不少的时间,前提就是使用与显示驱动兼容的DIB位图,然后直接对位图数据写值。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值