2012-04-29 8 views
7

Tengo una aplicación WPF que está destinada a superponer un HUD en una transmisión en vivo. La idea original era crear un complemento para xsplit (una aplicación popular para presentar transmisiones en vivo) para mostrar el contenido de la aplicación WPF. El problema con este enfoque es que renderizar un mapa de bits a la interfaz COM de xsplit es perjudicial para el rendimiento de la CPU para liberar la aplicación (ya que creo que hay problemas en la interfaz COM de xsplit y en RenderTargetBitmap que grava la CPU).Renderizado desde el interior de WPF a una aplicación de Directx

He estado viendo directamente la superposición en el juego (la aplicación de destino de DirectX) porque proporciona una serie de beneficios. Principalmente evita los problemas de rendimiento en xsplit, pero también abre la aplicación a una variedad de aplicaciones de transmisión y captura.


No soy un muy experimentado con DirectX pero creo que este es el esquema de la solución

  1. inicializar la aplicación WPF y capturar dispositivo Direct3d de WPF (via this method)

  2. Buscar y enganchar la aplicación EndScene de la aplicación de destino DirectX (using EasyHook+Slimdx)

  3. representar los contenidos de la superficie del dispositivo de aplicación de WPF sábana DirectX enganchado


La cuestión principal que tengo es cómo llevar a cabo el paso 3 usando SlimDX. Espero que una solución pueda reutilizar de alguna manera la superficie y no confiar en la copia ya que el objetivo es no afectar el rendimiento de la aplicación enganchada. También me gustaría poder limitar la región y apoyar la transparencia. También me pregunto si usar el dispositivo Direct3d de WPF en el dispositivo de la aplicación DirectX enganchado puede causar inestabilidades.

Cualquier idea sería apreciada, gracias.

+0

¿cómo hiciste para hacerlo? Estoy atrapado en una situación similar. – alDiablo

Respuesta

1

Estoy tratando de hacer lo mismo. Lo que he encontrado hasta ahora es que usted puede hacer que su wpfvisualtree a un mapa de bits y después escribes es mapa de bits para el dispositivo D3D capturado en el punto 2.

void render(Direct3D.Device device) 
{ 

wpfRenderTargetBitmap.Render(WpfVisualTree); 
wpfRenderTargetBitmap.CopyPixels(devicePtr); 

} 

Me dio prueba de esto todavía, pero creo que estoy en el camino correcto con esto. El único problema que tengo ahora es que pierdo toda la interactividad desde mi ventana. Los clics del botón y así sucesivamente ya no se capturarán ...

Cualquier ayuda sería agradable.

+0

¿Tuviste algún éxito con lo que estabas haciendo? – alDiablo

Cuestiones relacionadas