|
안녕하세요 ?
경호입니다.
directdraw를 이용해서 화면에 동영상을 play하고 있습니다.
여기저기 최적화를 하다가 이쪽에 지식을 가지신 분들이 있으면 도움을 받을까 해서
간단하게 올려 봅니다
일단 Codec에서 YUV를 뽑아내고 있는 방식은
1. 버퍼 1개에 YUV데이터를 모두 붙여서 얻어온다.
(Y전체 쓰고 U쓰고 V쓰고 : 일반적으로 파일에 YUV데이터를 쌓는 형태)
2. YUV를 각각의 개별버퍼를 만들어 얻어 온다
(즉 3개의 버퍼에 개별적으로 Y와 U,V를 얻어 온다)
위쪽은 MMX 및 ASM으로 이미 최적화를 한상태 입니다.
제가 줄이고 싶은 부분은 Directdraw부분인대 즉 YUV데이터를 Surface에 쓸때 사용되는 for문을 줄일 수 있을까
하는 것입니다.
실제 사용되는 소스는
for (DWORD j=0 ; j<dwHeight/2; ++j)
{
memmove((BYTE*)m_ddsd.lpSurface + j*m_ddsd.lPitch, pSrcData + j*dwWidth, dwWidth);
memmove((BYTE*)m_ddsd.lpSurface + j*m_ddsd.lPitch + dwHeight/2*m_ddsd.lPitch, pSrcData + dwHeight/2*dwWidth + j*dwWidth, dwWidth);
memmove((BYTE*)m_ddsd.lpSurface + m_ddsd.lPitch*m_ddsd.dwHeight*5/4 + j*m_ddsd.lPitch/2, pSrcData + dwWidth*dwHeight + j*dwWidth/2, dwWidth/2);
memmove((BYTE*)m_ddsd.lpSurface + m_ddsd.lPitch*m_ddsd.dwHeight + j*m_ddsd.lPitch/2, pSrcData + dwWidth*dwHeight*5/4 + j*dwWidth/2, dwWidth/2);
}
입니다. 현재는 버퍼 하나에 쌓인 YUV데이터를 surface에 그리면서 위와 같이 처리하고 있는대
이 부분을 처리하면서 CPU부하를 적게 먹게 할 방법이 있을까요 ?
물론 위코드에서 for문 안에 있는 * / 부분은 전부 변수로 빼서 따로 계산하도록은 할것 입니다.
논리적으로나 또는 surface에 데이터를 쓸때 YUV를 따로 가지고 처리하면 부하를 적게 먹는다던지
이런 부분이 있을 수 있는지 도움을 받을 수 있으면 감사 드리겠습니다.
|