Весь снимок экрана и рендеринг в DirectX [PERFORMANCE]
Мне нужен какой-то способ получить данные экрана и передать их в поверхность / текстуру DX9 в моем приложении и, по крайней мере, отобразить их25fps в1600 * 900 разрешение 30 будет лучше.
Я попробовал BitBliting, но даже после этого я на 20fps и после загрузки данных в текстуру и рендеринга я нахожусь на 11fps, что значительно отстает от того, что мне нужно.
GetFrontBufferData исключен.
Вот это что-то оиспользуя Windows Media API, но я не знаком с этим. Пример - сохранение данных прямо в файл, возможно, его можно настроить для предоставления отдельных кадров, но я не имеюЯ нашел достаточно хорошую документацию, чтобы попробовать ее самостоятельно.
Мой код:
m_memDC.BitBlt(0, 0, m_Rect.Width(),m_Rect.Height(), //m_Rect is area to be captured
&m_dc, m_Rect.left, m_Rect.top, SRCCOPY);
//at 20-25fps after this if I comment out the rest
//DC,HBITMAP setup and memory alloc is done once at the begining
GetDIBits( m_hDc, (HBITMAP)m_hBmp.GetSafeHandle(),
0L, // Start scan line
(DWORD)m_Rect.Height(), // # of scan lines
m_lpData, // LPBYTE
(LPBITMAPINFO)m_bi, // address of bitmapinfo
(DWORD)DIB_RGB_COLORS); // Use RGB for color table
//at 17-20fps
IDirect3DSurface9 *tmp;
m_pImageBuffer[0]->GetSurfaceLevel(0,&tmp); //m_pImageBuffer is Texture of same
//size as bitmap to prevent stretching
hr= D3DXLoadSurfaceFromMemory(tmp,NULL,NULL,
(LPVOID)m_lpData,
D3DFMT_X8R8G8B8,
m_Rect.Width()*4,
NULL,
&r, //SetRect(&r,0,0,m_Rect.Width(),m_Rect.Height();
D3DX_DEFAULT,0);
//12-14fps
IDirect3DSurface9 *frameS;
hr=m_pFrameTexture->GetSurfaceLevel(0,&frameS); // Texture of that is rendered
pd3dDevice->StretchRect(tmp,NULL,frameS,NULL,D3DTEXF_NONE);
//11fps
Я обнаружил, что для 512 * 512 квадратов он работает на 30 кадрах в секунду (для 490 * 450 при 20-25), поэтому я попытался разделить экран, но это не таккажется, хорошо работает.
Если в коде чего-то не хватает, напишите, пожалуйстане голосую. Спасибо