这段代码的运行结果
大家的CPU和显卡现在都是怎么样的?
2.0+G Hz 吧?
你们的呢?测试完下面的代码,把运行结果贴出来看看吧。
- C/C++ code
#include <Windows.h>#include <stdio.h>BITMAPINFO bi = {0};char *Bits;char *BitsFull;HWND Desk;HDC DeskDC;RECT r;HBITMAP Bmp;HBITMAP FullBmp;HBITMAP MemBmp;HBITMAP MemFullBmp;HDC DC;HDC FullDC;HDC MemDC;HDC MemFullDC;#define BIT_COUNT 24#define SIZE_PER_LINE(Width) ((Width*BIT_COUNT + 31)/32*4)#define PIXEL_ADDR(Base, x, y, Width) ((unsigned char*)(((char *)(Base)) + y*SIZE_PER_LINE(Width) + x*BIT_COUNT/8))void Test2();void Test();int main(){ bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bi.bmiHeader.biWidth = 1024; bi.bmiHeader.biHeight = 768; bi.bmiHeader.biBitCount = BIT_COUNT; bi.bmiHeader.biCompression = BI_RGB; bi.bmiHeader.biPlanes = 1; Desk = GetDesktopWindow (); DeskDC = GetWindowDC (Desk); GetWindowRect (Desk, &r); Bmp = CreateDIBSection (0, &bi, DIB_RGB_COLORS, (LPVOID *)&Bits, 0, 0); bi.bmiHeader.biWidth = r.right; bi.bmiHeader.biHeight = r.bottom; FullBmp = CreateDIBSection (0, &bi, DIB_RGB_COLORS, (LPVOID *)&BitsFull, 0, 0); MemBmp = CreateCompatibleBitmap (DeskDC, 1024, 768); MemFullBmp = CreateCompatibleBitmap (DeskDC, r.right, r.bottom); DC = CreateCompatibleDC (DeskDC); FullDC = CreateCompatibleDC (DeskDC); MemDC = CreateCompatibleDC (DeskDC); MemFullDC= CreateCompatibleDC (DeskDC); SelectObject (DC, Bmp); SelectObject (FullDC, FullBmp); SelectObject (MemDC, MemBmp); SelectObject (MemFullDC, MemFullBmp); printf ("Disable GDI Batching : \n"); GdiSetBatchLimit (1); Test(); printf ("\n\nEnable GDI Batching : \n"); GdiSetBatchLimit (20); Test(); printf ("\n\nMamual : \n"); Test2(); printf ("\npress any key to exit\n"); getchar ();}void Test (){ { int Tick = GetTickCount (); for (int i = 0; i < 3 ; i++) { BitBlt (DC, 0, 0, 1024, 768, DeskDC, 0, 0, SRCCOPY); } printf("1024 * 768 Desk to DIB 3 times : %u\n", GetTickCount () - Tick); } { int Tick = GetTickCount (); for (int i = 0; i < 3 ; i++) { BitBlt (FullDC, 0, 0, r.right, r.bottom, DeskDC, 0, 0, SRCCOPY); } printf("%u * %u Desk to DIB 3 times : %u\n", r.right, r.bottom, GetTickCount () - Tick); } { int Tick = GetTickCount (); for (int i = 0; i < 3 ; i++) { BitBlt (FullDC, 0, 0, r.right, r.bottom, DC, 0, 0, SRCCOPY); } printf("1024 * 768 DIB to DIB 3 times :%u\n", r.right, r.bottom, GetTickCount () - Tick); } { int Tick = GetTickCount (); for (int i = 0; i < 3 ; i++) { BitBlt (MemFullDC, 0, 0, r.right, r.bottom, DeskDC, 0, 0, SRCCOPY); } printf("%u * %u Desk to Memory 3 times :%u\n", r.right, r.bottom, GetTickCount () - Tick); } { int Tick = GetTickCount (); for (int i = 0; i < 3 ; i++) { BitBlt (MemFullDC, 0, 0, r.right, r.bottom, FullDC, 0, 0, SRCCOPY); } printf("%u * %u DIB to memory 3 times :%u\n", r.right, r.bottom, GetTickCount () - Tick); } { int Tick = GetTickCount (); for (int i = 0; i < 3 ; i++) { BitBlt (FullDC, 0, 0, r.right, r.bottom, MemFullDC, 0, 0, SRCCOPY); } printf("%u * %u memory to DIB 3 times :%u\n", r.right, r.bottom, GetTickCount () - Tick); }}void Test2 (){ { int Tick = GetTickCount (); for (int i = 0; i < 3 ; i++) { for (int y = 0; y < 768 ; y++) { memcpy (&Bits[y * SIZE_PER_LINE(1024)], &BitsFull[y * SIZE_PER_LINE(r.right)], SIZE_PER_LINE(1024)); } } printf("memcpy : %u\n", GetTickCount () - Tick); } { int Tick = GetTickCount (); for (int i = 0; i < 3 ; i++) { for (int y = 0; y < 768 ; y++) { for (int x = 0; x < 1024 ; x++) { PIXEL_ADDR(Bits, x, y, 1024)[0] = PIXEL_ADDR(BitsFull, x, y, r.right)[0]; PIXEL_ADDR(Bits, x, y, 1024)[1] = PIXEL_ADDR(BitsFull, x, y, r.right)[1]; PIXEL_ADDR(Bits, x, y, 1024)[2] = PIXEL_ADDR(BitsFull, x, y, r.right)[2]; } } } printf("1024 * 768 pixel char by pixel char : %u\n", GetTickCount () - Tick); } { int Tick = GetTickCount (); for (int i = 0; i < 3 ; i++) { for (int y = 0; y < 768 ; y++) { for (int x = 0; x < 1024 ; x++) { *(USHORT *)PIXEL_ADDR(Bits, x, y, 1024) = *(USHORT *)PIXEL_ADDR(BitsFull, x, y, r.right); PIXEL_ADDR(Bits, x, y, 1024)[2] = PIXEL_ADDR(BitsFull, x, y, r.right)[2]; } } } printf("1024 * 768 pixel 16bit by pixel 16bit : %u\n", GetTickCount () - Tick); }}
记得贴上你们的CPU主频^_^
[解决办法]
学习了
[解决办法]
Disable GDI Batching :
1024 * 768 Desk to DIB 3 times : 188
1440 * 900 Desk to DIB 3 times : 312
1024 * 768 DIB to DIB 3 times :1440
1440 * 900 Desk to Memory 3 times :94
1440 * 900 DIB to memory 3 times :0
1440 * 900 memory to DIB 3 times :15
Enable GDI Batching :
1024 * 768 Desk to DIB 3 times : 188
1440 * 900 Desk to DIB 3 times : 312
1024 * 768 DIB to DIB 3 times :1440
1440 * 900 Desk to Memory 3 times :78
1440 * 900 DIB to memory 3 times :16
1440 * 900 memory to DIB 3 times :15
Mamual :
memcpy : 0
1024 * 768 pixel char by pixel char : 31
1024 * 768 pixel 16bit by pixel 16bit : 32
CPU是E5400 2.7GHz
[解决办法]
学习了。。。。。