Game Dev/Article
Capture Screen
AKer
2008. 6. 16. 20:41
반응형
void CaptureScreen(LPDIRECT3DDEVICE9 pDevice, TCHAR szFileName)
{
if (!pDevice || !szFileName)
return;
DWORD tickStart = GetTickCount();
// There is 2 Methods
// 1. Capture Front Buffer
// 2. Capture Back Buffer (Faster)
bool isBackBuffer = true;
RECT rectWindow = {0};
RECT rectDesktop = {0};
GetClientRect(g_hMainWnd, &rectWindow);
GetClientRect(GetDesktopWindow(), &rectDesktop);
IDirect3DSurface9* pSurface = NULL;
HRESULT hResult = S_OK;
if (isBackBuffer)
{
hResult = pDevice->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &pSurface);
}
else
{
/*
For windowed mode, the size of the destination surface
should be the size of the desktop. For full-screen mode,
the size of the destination surface should be the screen size.
*/
bool isFullScreen = IsFullScreenMode();
int nWidth = isFullScreen ? rectWindow.right - rectWindow.left
: rectDesktop.right - rectDesktop.left;
int nHeight = isFullScreen ? rectWindow.bottom - rectWindow.top
: rectDesktop.bottom - rectDesktop.top;
hResult = pDevice->CreateOffscreenPlainSurface(nWidth, nHeight, D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &pSurface, NULL);
hResult = pDevice->GetFrontBufferData(0, pSurface);
}
if (pSurface)
{
hResult = D3DXSaveSurfaceToFile(szFileName, D3DXIFF_JPG, pSurface, NULL, &rectWindow);
pSurface->Release();
}
tickDiff = GetTickCount() - tickStart;
}
Back Buffer를 Capture하는 것이 더 빠르다.
- Back Buffer : 500~600ms
- Front Buffer : 1300~1400ms
Test 환경
- CPU : Core2 Duo E650 @ 2.33GHz
- RAM : 1024MB
- VGA : NVIDIA GeForce 8500 GT (512MB)
- Window 크기 : 1024 * 768
반응형