Hola necesito hacer un streaming de una aplicacion en directx.Para ello necesito capturar un screen shoot para enviarlo por red.Este tiene que ser rapido ya ke hay que conseguir 25 fps.Yo tengo el siguiente codigo:
bool bIsOk = SUCCEEDED(m_pDevice->GetRenderTarget(0, &m_pSurface));
if(bIsOk)
{
bIsOk = SUCCEEDED(D3DXSaveSurfaceToFileInMemory(&m_pBuffer,D3DXIFF_JPG,m_pSurface,NULL,NULL));
if( !bIsOk )
{
m_pBuffer = NULL;
}
}
Pero es demasiado lento,bloquea la aplicacion demasiado tiempo.Alguien me puede dar una forma mas rapida????
Esto tomalo como orientación para buscar información por ahí por que tampoco domino el tema. Hace siglos que lo mire pero creo recordar que para hacer streaming fluido de una aplicacion Direct3D tenias que usar la API de DirectShow. Se que habia una forma de volcar un video desde DirectShow a una textura de Direct3D (viene el ejemplo en el SDK que recuerde) por lo que entiendo deberia haber una forma de hacer lo contrario, conectar el render de Direct3D al sistema de DirectShow.
De todas formas, el volcado directo del BackBuffer de Direct3D a Textura y de ahí a archivo (aunque sea en memoria como haces, eso requiere un proceso de conversión) siempre es un proceso lento, la idea seria pasar directamente la información del backbuffer (el array de pixeles) a la señal de streaming y previamente aplicarle alguna compresión.
Salu2...
Piensa que tienes que pasar el fotograma que está en GPU a RAM y luego grabarlo, así que estás limitado por el PCI Express.
Una gran ventaja podría ser comprimir en GPU y eso grabarlo, con lo cual ya bajas muchísimo el nacho de banda. Sin embargo no tengo ni idea de cómo hacerlo :-\
También puedes bajar la resolución, todo eso te ayuda una barbaridad.
¿Cómo lo hará FRAPS?