Me gustaría "enganchar" en un juego en ejecución, digamos Mario Bros, y capturar cada fotograma renderizado ... guardando ese fotograma en un archivo de imagen. Un buen ejemplo de algo similar es FRAPS. --Nota: no quiero capturar toda la pantalla / escritorio. Quiero capturar una ventana específica.
He echado un vistazo a OBS (Open Broadcasting Software) pero no es particularmente rápido. No me malinterpreten, es un gran software, pero desafortunadamente no hay / hay poca documentación, lo que hace que un proyecto masivo escrito en c y c ++ sea casi inaccesible para un programador nuevo en c ++.
También he echado un vistazo a GamingAnywhere , pero desafortunadamente, no puedo hacer que funcione, hay muy poca / ninguna documentación, solo se ejecuta en VS2010 y es desordenado (con una mala denominación variable). Sin embargo, es un proyecto de investigación, por lo que es comprensiblemente indocumentado y desordenado.
Sé que esto se puede hacer con OpenGL, GDI y con Direct3D, pero no puedo encontrar algunos buenos ejemplos en la red.
Leí que se puede usar glReadlPixels (usando OpenGL) y he leído la documentación , pero la publicación no mencionó nada sobre conectar a un juego / gráficos en ejecución.
Preguntas:
¿Puedo conectarme a los gráficos de un juego desarrollado con OpenGL, usando, por ejemplo, Direct3D? ¿La biblioteca utilizada para enganchar tiene que ser la misma que la utilizada por el juego?
¿Cómo me engancho a los cuadros renderizados del juego para poder enviar esos cuadros a archivos de imagen o de video? (Solo algunos enlaces o una breve explicación de lo que necesito hacer sería genial)
BackBuffer: leí que es muy rápido acceder a BackBuffer para recuperar los marcos. ¿Alguien tiene un ejemplo para mí sobre cómo hacer esto con las últimas bibliotecas? He descubierto que la mayoría de los ejemplos están desactualizados.
Para mis propósitos, ¿hay claramente "esto es más rápido que eso"? Lo que quiero decir es, ¿sería, por ejemplo, OpenGL, más rápido para mis propósitos?
Si alguien sabe de un proyecto de código abierto (que hace esencialmente lo que necesito) que está activamente desarrollado y bien documentado, me encantaría saberlo.
Respuestas:
Es posible hacer lo que usted describe, pero me temo que no es un proceso trivial. En realidad, esto estará muy vinculado a los sistemas operativos a los que se dirige y posiblemente también requiera ajustes específicos para el juego / aplicación en cuestión.
Comenzaría a buscar técnicas de inyección de DLL , que deberían permitir, por ejemplo, interceptar llamadas a las API de Direct3D (Windows) u OpenGL, que luego puede usar para copiar los framebuffers de la aplicación. Una búsqueda rápida en Internet muestra esto y esto con una explicación detallada.
Una vez escribí un interceptor OpenGL a pequeña escala en MacOS inyectando un módulo compartido personalizado, pero estaba bajo circunstancias muy controladas y hacía muchas suposiciones, como tener privilegios de root en el sistema, por lo que para una herramienta de producción, sería Mucho más complicado. Puede encontrar otro proyecto muy interesante aquí sobre la interceptación de la API D3D para instalar un robot de IA automatizado en Starcraft, que debe tocar conceptos muy similares a lo que está buscando.
Una vez que logre interceptar la API de representación subyacente, tal vez podría enganchar su código en cada
SwapBuffers
llamada o una llamada equivalente para copiar el framebuffer anterior antes del intercambio, y luego guardarlo (aquí es dondeglReadPixels
entraría en juego algo así ).Copiar y guardar el framebuffer de manera eficiente también es un desafío. La manera fácil es simplemente volcar cada cuadro como una imagen RGB sin comprimir, pero luego terminarás con cientos de gigabytes de datos por solo un par de minutos de juego, a menos que tengas una buena matriz de HDD en la esquina de en su mesa
;)
, tendrá que buscar comprimir los marcos de alguna manera.La desventaja de comprimir los cuadros ahora es que requiere mucho procesamiento, por lo que un enfoque ingenuo podría convertir la aplicación interactiva que intenta grabar en una presentación interactiva
:(
. Entonces, en esta etapa, tendría que comenzar a pensar en optimizaciones.No conozco ningún proyecto que ofrezca una biblioteca para capturar cuadros de manera eficiente para los juegos, ¡pero esto sería algo agradable de tener! Creo que una cosa que podría estar frenando dicho proyecto es, como mencioné al principio, que esto es muy dependiente del sistema, por lo que los casos de uso probablemente se limitarán a una sola plataforma o sistema operativo.
fuente