Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: MA]Mestre en 03 de Octubre de 2006, 10:22:33 AM

Título: Mínimo 25 FPS
Publicado por: MA]Mestre en 03 de Octubre de 2006, 10:22:33 AM
Hola,

Me gustaría desde una aplicación D3D, que se mueve entre los 200-400FPS, poder obtener 25 FPS samples por segundo, sin que el rendimiendo general baje de los 60FPS.

Los Samples que tomo cada segundo deberian ir a HDD, o en su defecto para un mejor rendimiento a una zona de memoria, con un memcopy o similiar ( He leido q existen memcopy en asm q aprovechando extensiones de CPU aumentan hasta un 15% el rendimiento de copias grandes de memoria )

Me gustaria escuchar vuestras sugerencias  ( quizás sea una idea descabellada, decirlo ) Estoy acostumbrado a trabajar en OpenGL, en cambio no he tocado practicamente nada de DirectX, esta información es de cara a los tecnicimos q podais usar en las respuestas.

Un saludo.
Título: Mínimo 25 FPS
Publicado por: Prompt en 04 de Octubre de 2006, 08:40:16 AM
Coges del render 25 FPS por segundo y los vuelcas a disco no?

Yo sobre la copia de grandes cantidades de memoria te diré, que al iniciar el programa deberías reservar un bloque de memoria donde quepan esas 25 imagenes e ir reutilizando cada segundo.

Hacemos un bloque continuo en memoria de 25 "imgenes", eso te dará suficiente velocidad cuando escribas en ella, luego ya el volcado a disco es otra historia. podrias utilizar 2 bloques de 25, e ir consumiendo el 1º volcandolo a disco mientras rellenas el 2º.

Cuidado con los new y delete. Usalos bien que si nó será muy lento.

De todas formas, quieres que vuelque las imagenes sin que se resientan los frames por segundo?




void* buffer = operator new(50 * sizeof(char) ); // char por ejemplo...

...

operator delete(buffer);

// Luego puedes usar static_cast en fin, un FastHeap, puedes buscar info.

Título: Mínimo 25 FPS
Publicado por: synchrnzr en 04 de Octubre de 2006, 08:46:21 AM
No sé si le pasa a más gente, pero yo no entiendo la pregunta :roll:

sync
Título: Mínimo 25 FPS
Publicado por: Prompt en 04 de Octubre de 2006, 08:51:15 AM
Perdón he editado el post y habeis posteado :D

Bueno me voy a desayunarr!!!! andioo
Título: Mínimo 25 FPS
Publicado por: TheAzazel en 04 de Octubre de 2006, 10:15:02 AM
Creo que si te pones a escribir 25 images por segundo al disco duro... el requerimiento de que tu aplicacion no baje de los 60fps dependera de:

- la resolucion de pantalla, a mayor sea...mayor ocupara cada frame

- la velocidad de tu disco duro

Asi por poner un ejemplo, imaginemos que estas a 1024x768x32bits, cada frame ocupa 3MBytes, luego multiplica eso por 25 y obtendras 75MBytes por segundo... demasiado para la escritura de un disco duro normal y sobre todo , en modo sostenido. Si por ejemplo, te sobrara CPU, podrias probar a comprimir cada frame con algun algoritmo rapidito (lease UCL a muy bajo nivel de compresion). Pero lo mejor es, si andas sobrado de memoria... yo lo almacenaria todo alli, lo malo es que eso tiene su limite pero vamos, para usar 1GB de RAM podrias almacenar unos 13s, despues tendrias que volcar a disco parando la ejecucion de tu aplicacion y vuelta a empezar...

Vamos, todo esto son ideas generales, sabiendo que resolucion, cuanto tiempo necesitas, que procesador usaras, cuanta memoria, se podria afinar mas. Yo haria un sistema mixto entre memoria y disco duro pero hay que ver para que lo quieres porque esto tomaria su tiempo y quizas ya hay alguna aplicacion por ahi que hace lo mismo...

Saludos
Título: Mínimo 25 FPS
Publicado por: marcode en 04 de Octubre de 2006, 04:03:24 PM
Yo tampoco he entendido exactamente la pregunta, solo decirte que para copiar a memoria las imágenes deberías usar IDirect3DDevice9::GetRenderTargetData
Título: Mínimo 25 FPS
Publicado por: MA]Mestre en 04 de Octubre de 2006, 04:09:55 PM
Cita de: "synchrnzr"No sé si le pasa a más gente, pero yo no entiendo la pregunta :roll:

sync

Sintezando.

Puedo de una Aplicacion 3D con Dx9 (que funciona a 200FPS-400FPS)  obtener del FrameBuffer/Backbuffer 25 imagenes por segundo y copiarlas a una Zona de Memoria ?

Problematica.

Creo que leer del Frame/BackBuffer debe ser lentisimo, y tb mucho tener que copiar lo leido a una zona de memoria. Pensais que aguantará el rendimiento o bien q caerá en picado ? cual es la forma mas rapida de sacar el FrameBuffer ? cualquiera idea para mejorar el rendimiento sera agradecida ;-)

aprox.

new (x)

RenderLoop( )
   ...
   GetFrameBuffer()
   Lock()
   MemCopy( )
   Unlock ( )
   ...
EndRenderLoop ( )

Saco de la equación el tema del HDD. Puedo prescindir de el.
Título: Mínimo 25 FPS
Publicado por: MA]Mestre en 04 de Octubre de 2006, 04:16:58 PM
Cita de: "marcode"Yo tampoco he entendido exactamente la pregunta, solo decirte que para copiar a memoria las imágenes deberías usar IDirect3DDevice9::GetRenderTargetData


HRESULT GetRenderTargetData(
 IDirect3DSurface9* pRenderTarget,
 IDirect3DSurface9* pDestSurface
);


Suena más rápido que un memcopy  :wink:.
Título: Mínimo 25 FPS
Publicado por: Pogacha en 04 de Octubre de 2006, 05:56:11 PM
Ya lo he mensionado antes pero un truco cuando las condiciones se dan es:

unsigned int dt = 1000 / 25;  // GetTime();

Creo que se entiende verdad?
Título: Mínimo 25 FPS
Publicado por: Prompt en 05 de Octubre de 2006, 08:00:34 AM
Yo optaria por renderizar al menos 1 frame por delante. Con un framebuffer el "problema" esta resuelto, lo malo será cuando te quedes sin memoria o la escritura a disco sea lentisima :/
Título: Mínimo 25 FPS
Publicado por: MA]Mestre en 05 de Octubre de 2006, 09:11:26 AM
Cita de: "Prompt"Yo optaria por renderizar al menos 1 frame por delante. Con un framebuffer el "problema" esta resuelto, lo malo será cuando te quedes sin memoria o la escritura a disco sea lentisima :/

No me quedare sin memoria, pues la ire reescribiendo. Como mucho haé un doblebuffer con ella.

Como nadie dice q es una idea descabellada, es decir que será factible obtener 25Frames + memcopy sin que decaiga el rendimiento, lo voy a probar. Ya os diré algo.

Gracias.
Título: Mínimo 25 FPS
Publicado por: TheAzazel en 05 de Octubre de 2006, 10:12:02 AM
Vaya, yo debo ser como el del anuncio:

"No soy nadie doctor, no soy nadie  :cry: "

Solo resumo que como te pongas a capturar la pantalla a 1024x768x32bits eso no va a funcionar :)
Título: Mínimo 25 FPS
Publicado por: _Grey en 05 de Octubre de 2006, 04:53:59 PM
Creo por lo que dices que quieres hacer algo así como un vídeo de tu programa en ejecución.

Si no tienes una maquina para la ocasión, si no algo "normal", seguramente TheAzazel tenga razón, y sea demasiado para tiempo real.

Creo que, bajando a un nivel "normal" tienes algunas opciones, como tener otra maquina con entrada de vídeo y grabar desde ahí, lo cual puede parecer una opción cutre... o podrías hacer trabajar la aplicación a cámara lenta con un control del tiempo como el que pone Pogacha, así daría igual el tiempo que consuma la grabación al HD.

Eso si, siempre puedes bajar la resolución, no se suelen ver vídeos de juegos y demás a grandes resoluciones, y seguro que a 800x600 o incluso 640x480 te valdría... aquí ya especulo, claro...

Saludos.
Título: Mínimo 25 FPS
Publicado por: MA]Mestre en 10 de Octubre de 2006, 07:49:31 AM
-Funciona fantástico combinado con el PCI-expres. 230 en una 7800GT.

-Funciona de pena con un AGP.  30 en una ATI ( No recuero el modelo que tengo en el curro, era gama media )

Un saludo.


if (!dest)
hr=g_pd3dDevice->CreateOffscreenPlainSurface (712,542,D3DFMT_X8R8G8B8,D3DPOOL_SYSTEMMEM,&dest,NULL);
   
   hr=g_pd3dDevice->GetBackBuffer (0,0,D3DBACKBUFFER_TYPE_MONO,&surf);
     
   hr=g_pd3dDevice->GetRenderTargetData(surf,dest);
   
   hr=dest->LockRect (&pLock,NULL,D3DLOCK_DISCARD);
   
   CopyMemory (buff[n],pLock.pBits,712*542*4);
   
   n=1-n;
   
   hr=dest->UnlockRect();
Título: Mínimo 25 FPS
Publicado por: Prompt en 11 de Octubre de 2006, 08:25:10 AM
A ver si nos cuentas que uso le das!
Título: Mínimo 25 FPS
Publicado por: MA]Mestre en 11 de Octubre de 2006, 10:19:45 AM
Envio el Backbuffer de una aplicación 3D a una tarjeta de video profesional. Esta hace un overlay entre una señal de video ( life cámara) y la que genero desde la aplicación D3DX.

Tenia miedo del rendimiento, por un lado, acerte. Por AGP es inviable. Por otro lado fallé, tengo muchos problemas de entrelazado de la imagen progresiva q envío.

Tb he mirar de voltear de la forma más óptima el surface dest ( del código de antes ), pues la imagen me sale invertida. Pero primero buscaré si la tarjeta de video pro lo puede hacer por mí, sería lo deseable.

Un saludo, y gracias a todos por las aportaciones anteriores.
Título: Mínimo 25 FPS
Publicado por: Prompt en 17 de Octubre de 2006, 11:23:15 AM
Existe una NVidia Quadro que tiene un alto rendimiento para salida de video, SDI. Busca sobre ella. Si esq puedes elegir la tarjeta de video que quieras claro.