화면 전체를 가득 메우는 픽셀연산은 느립니다.
마우스로 드래그하는 시스템을 구성하여 당겨 흔들어 보면
알 수 있습니다. 오늘 그것을 빠르게 구성해 봅시다.
1. 느린 이유
용량이 많은 작업인 것은 어쩔 수 없습니다.
그것을 제외하고 이유는 보통 3가지입니다.
(클리핑을 통해 더 빨리 만든다던지, 처음작업시 이미지를 구성해서
매번 뿌린다던지의 꽁수는 각 작업상의 상황에 따른 것이니 논외로 합니다.)
1) 픽셀함수호출시간 2) for의 조건문과 픽셀접근계산 3) RGB를 분리했다 결합하는 연산
1번은 픽셀처리의 for문안에 절대 다른 함수를 호출해서는 안됩니다.
GetPixel, SetPixel은 독약입니다. 이유는 매 픽셀 "함수호출시간 + 클리핑계산 + 비트수맞춤"입니다.
2번은 memcpy식의 루프로 바꿉니다.
// 보통의 코드
RGBQUID* offset = 시작주소;
INT width = 이미지가로길이, height = 이미지세로길이;
INT row = 4배수정렬된 가로점의 갯수; // 바이트수가 아님
///////////////////////////////////////////////
for(int y = CY, yend = CY + CH; y < yend; ++y)
for(int x = CX, xend = CX + CW; x < xend; ++x)
{
offset[x + row * (height - y - 1)] = 0x00BBGGRR;
}
// memcpy식 코드
RGBQUID* offset = 시작주소;
INT width = 이미지가로길이, height = 이미지세로길이;
INT row = 4배수정렬된 가로점의 갯수; // 바이트수가 아님
INT jump = width