读书人

这段代码的运作结果

发布时间: 2012-10-26 10:30:59 作者: rapoo

这段代码的运行结果
大家的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
[解决办法]
学习了。。。。。

读书人网 >C++

热点推荐