이전 질문글 링크 http://gall.dcinside.com/board/view/?id=programming&no=806476&page=1
class CView
{
Image m_img;
POINT m_DisplayRange;
float m_zoom;
}
void CView::OnPaint()
{
unsigned char * pBufferDisplay = (unsigned char *)malloc(4 * sizeof(unsigned char) * m_DisplayRange.x * m_DisplayRange.y);unsigned char * ptr;
unsigned char value;
for (int y = 0; y < m_DisplayRange.y; y++)
{
ptr = &pBufferDisplay[4 * m_DisplayRange.x * y];
for (int x = 0; x < m_DisplayRange.x; x++)
{
if ((int)(x / m_zoom) <= m_img->GetX() && (int)(y / m_zoom) < m_img->GetY())
value = m_img->pBuffer[m_img->GetX() * (int)(y / m_zoom) + (int)(x / m_zoom)];
else
value = 255;
//memset(ptr, value, 3);
//ptr += 4;*ptr++ = value; // r
*ptr++ = value; // g
}
}
}
대충 요런 코드인데...
주석표시한건 저렇게 하면 SIMD 적용돼서 좀 빨라진다는거 같더라구?
어느 정도 성능을 원하냐고 했는데, 당연히 다다익선....
당면한 과제는 FHD 기준으로 초당 10회 반복?
가능하면 UHD 이상에서 30 FPS 수준?
아모거나 가능성있는 것들 많이 좀 알려조.... 총총
메모리 누수 없음?
뒤에 delete 같은건 생략했어... 개인적인 용도의 코드가 아니라서 전문 공개는 힘들어서.... 혹시 진짜 저부분이 문제인건지 검증해주고 싶은거면 clock() 심어가면서 코드블럭 단위로 확인해본거라 이부분이 오버헤드인건 맞아!
ptr 부터 1byte 말고 4byte 단위로 바꿔서 해바 내생각에는 if ((int)(x / m_zoom) <= m_img->GetX() && (int)(y / m_zoom) < m_img->GetY()) 부분이 점유율이 높을거 같아
ptr dword* 로해서
*ptr++ = ((value<<16) | (value<<8) | value);
음 알았어 해봐야겠다... 나도 float 연산이 좀 문제같은데 저건 뭐 방법이 없을까?
float을 (x * int / int) 같은걸로 나눠보는걸 생각해봤는데, 정확도랑 정수 표현범위에서 트레이드오프 걸릴거같아서 아직 안해봤거든
요즘은 IDE에 프로파일링 기능 있지 않아? 사용자 통계 구할거 아니면 프로파일링 코드 심지 않아도 되는데~
float 보다는 if문 자체가 비싸~
렌더링 할때마다 malloc, free 하는 것도 좋지않다고 생각해~
pBufferDisplay 도 함수내에서 임시로 할당/해제 할게 아니고 객체에서 관리하는게 어떨까 BufferDisplay Width , Height 정보도 두어서 크기가 모자르면 그때가서 재할당하고
어휴 팁이 많아서 소화력 딸린다ㅋㅋㅋ 고마워 일단 알려준 부분들부터 곱씹어봐야겠다
https://github.com/lastpenguin/test/blob/master/2/main.cpp
전에 장난으로 만든 건데 이것도 픽셀단위로 렌더링하는 거야
gc_ScreenSizeWidth gc_ScreenSizeHeight 로 해상도 조절