mfc_SetPixel - 8BitsCoding/RobotMentor GitHub Wiki

450 x 450 ์˜ ์‚ฌ๊ฐํ˜•์„ SetPixel์„ ํ†ตํ•ด์„œ ๊ทธ๋ ค๋ณด์ž.

CClientDC dc(this);

for(int y = 0; y < 400; y++) {
    for(int x = 0; x < 450; x++) {
        dc.SetPixel(x, y, RGB(0, 0, 255));
    }
}

์ด๋ฏธ์ง€

๊ทธ๋ ค๋ณด๋ฉด ์•Œ๊ฒ ์ง€๋งŒ ์†๋„๊ฐ€ ์—„์ฒญ๋‚˜๊ฒŒ ๋А๋ฆฌ๋‹ค.(๊ทธ๋ ค์ง€๋Š”๊ฒŒ ๋ณด์ผ์ •๋„)

์†๋„๋ฅผ ์ฒดํฌํ•ด๋ณด์ž.

CClientDC dc(this);

int start_tick = GetTickCount();

for(int y = 0; y < 400; y++) {
    for(int x = 0; x < 450; x++) {
        dc.SetPixel(x, y, RGB(0, 0, 255));
    }
}

AddTimeToList(L"SetPixel ์‚ฌ์šฉ", GetTickCount() - start_tick);
void AddTimeToList(const wchar_t *ap_msg, int a_time_value)
{
    CString str;
    str.Format(L"%s : %d", ap_msg, a_time_value);
    int index = m_msg_list.InsertString(-1, str);
    m_msg_list.SetCurSel(index);
}

์ฐธ๊ณ ํ•  ์ ์€ ํ•˜๋“œ์›จ์–ด ๊ฐ€์†์ด ๊ฐ€๋Šฅํ•œ Direct2D์™€ ๊ฐ™์€ API๋ฅผ ์“ฐ๋ฉด ์†๋„๊ฐ€ ํ›จ์”ฌ ๊ฐœ์„ ๋œ๋‹ค๋Š” ์ .

๋‹จ, ํ•˜๋“œ์›จ์–ด ๊ฐ€์†์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ์ƒํ™ฉ(์„œ๋ฒ„ PC)์™€ ๊ฐ™์€๊ฒฝ์šฐ๋Š” ๊ฒฐ๊ตญ GDI๋ฅผ ์จ์•ผํ•˜๊ณ  ๊ทธ๋Ÿด๋•Œ ์–ด๋–ป๊ฒŒ ์ตœ์ ํ™” ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๋ฌธ์ œ์ด๋‹ค.


SetPixelV ๋ผ๋Š” ํ•จ์ˆ˜๋„ ์žˆ๋‹ค๋˜๋ฐ??

CClientDC dc(this);

for(int y = 0; y < 400; y++) {
    for(int x = 0; x < 450; x++) {
        dc.SetPixelV(x, y, RGB(0, 0, 255));
    }
}

์†๋„๋Š” SetPixel๊ณผ ๊ฑฐ์˜ ์ฐจ์ด๊ฐ€ ์—†์Œ...

์–ด์งธ์•ผ ํ•˜๋‚˜????

๋ฉ”๋ชจ๋ฆฌDC๋ฅผ ์จ๋ณด์ž.


// Dlg.h
private:
    CImage m_my_image;
// Dlg.cpp
// OnInitDialog()
m_my_image.Create(450, 400, 32);
HDC h_dc = m_my_image.GetDC();
CDC *p_dc = CDC::FromHandle(h_dc);

m_my_image.Create(450, 400, 32); : 32๋น„ํŠธ ์ƒ‰์ƒ์˜ 450 x 400์˜ ๋น„ํŠธ๋งต ์ƒ์„ฑ

CDC *p_dc = CDC::FromHandle(h_dc); : h_dc์—์„œ ์ž„์‹œ ๊ฐ์ฒด๋ฅผ ๋ฐ›์•„์™€์„œ CDC๋ฅผ ๋งŒ๋“œ๋Š”๋ฐ ์ด๋Ÿฐ ๋ฐฉ์‹์€ ์œ„ํ—˜ํ•˜๋‹ค. ์–ธ์ œ main thread์—์„œ ์ž„์‹œ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ• ์ง€ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

// Dlg.cpp
// OnInitDialog()
m_my_image.Create(450, 400, 32);
HDC h_dc = m_my_image.GetDC();
CDC dc;
dc.Attach(h_dc);

์œ„์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์ด ๋” ์œ ๋ฆฌ๋‹ค.

๋‹จ, ๋‹ค์“ฐ๊ณ  ๋‚˜๋ฉด

// OnDestroy()
dc.Detach();
m_my_image.ReleaseDC();

๋ฅผ ๊ผญ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

DC๋กœ ๊ทธ๋ ค๋ณด์ž.

CClientDC dc(this);

for(int y = 0; y < 400; y++) {
    for(int x = 0; x < 450; x++) {
        m_my_dc.SetPixel(x, y, RGB(0, 0, 255));
    }
}

m_my_image.Draw(dc, 0, 0);

์†๋„๊ฐ€ ์—„์ฒญ๋‚˜๊ฒŒ ๋นจ๋ผ์ง„๋‹ค. ์ด์œ ๋Š”??

SetPixel์„ ์ง์ ‘ ๋ฌผ๋ฆฌ์žฅ์น˜์— ๊ทธ๋ฆฌ๋Š” ๊ฒƒ๊ณผ dc์— ๊ทธ๋ ค๋†“๊ณ  ํ•œ๋ฒˆ์— ๋ฟŒ๋ฆฌ๋Š” ๊ฒƒ์ด ์ฐจ์ด์ด๋‹ค.


๋” ๋น ๋ฅด๊ฒŒ ํ•ด๋ณด์ž!

// Dlg.h
private:
    unsigned int * mp_image_data;
// OnInitDlg
mp_image_data = (unsigned int *)m_my_image.GetBits();

(unsigned int *)m_my_image.GetBits(); : CImage์˜ ์‹œ์ž‘ ์ฃผ์†Œ๋ฅผ ๋ฐ˜ํ™˜

์ด๋Ÿฐ์‹์œผ๋กœ ํ•˜๋Š” ์ด์œ ๋Š” ๋น„ํŠธ๋งต์ด 32๋น„ํŠธ(a, r, g, b) ์ด๊ณ  ๊ฐ ์ƒ‰์ƒ์€ 8bits(1byte)๋ฅผ ๊ฐ–๊ธฐ ๋•Œ๋ฌธ

BITMAP์—์„œ ๋ฐ›์•„์™€ ๋ณด์ž

// OnInitDlg
GetObject((HBITMAP)m_my_image, sizeof(BITMAP), &m_bmp_info);
mp_image_data = (unsigned int *)m_my_image.GetBits();
mp_image_data += m_bmp_info.bmWidthBytes / sizeof(unsigned int);

GetObject((HBITMAP)m_my_image, sizeof(BITMAP), &m_bmp_info); : ๋น„ํŠธ๋งต ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

CClientDC dc(this);

unsigned int *p = mp_image_data;
int count = m_bmp_info.bmWidth * m_bmp_info.bmHeight;

for(int i = 0; i < count; i++) {
    // *p = 0xAARRGGBB
    // CImage์˜ ์ˆœ์„œ๋Š” ์•ŒํŒŒ, ๋ ˆ๋“œ, ๊ทธ๋ฆฐ, ๋ธ”๋ฃจ ์ˆœ
    *p = 0x00FF0000;
    p--;
    // ๋นจ๊ฐ„์ƒ‰์„ ๊ณ„์† ๋„ฃ๋Š”๋‹ค.
}

m_my_image.Draw(dc, 0, 0);

์—„์ฒญ๋‚œ ์†๋„์˜ ๊ฐœ์„ ์„ ๊ฐ€์ ธ์˜จ๋‹ค.(0ms!!!)