2012-04-29 11 views
7

Ho un'applicazione WPF che è intesa per la sovrapposizione di un HUD in un flusso live. L'idea originale era di creare un plugin per xsplit (una popolare applicazione per la presentazione di live streaming) per visualizzare il contenuto dell'applicazione WPF. Il problema con questo approccio è che il rendering di una bitmap all'interfaccia COM di xsplit è di gran lunga dannoso per le prestazioni della CPU per rilasciare l'applicazione (come credo ci siano problemi nell'interfaccia COM di xsplit e sull'uso di RenderTargetBitmap che impone la CPU).Rendering da interni di WPF a un'applicazione Directx

Ho cercato di rendere direttamente la sovrapposizione nel gioco (l'applicazione DirectX di destinazione) perché offre numerosi vantaggi. Principalmente aggira i problemi di prestazioni in xsplit, ma apre anche l'applicazione a una varietà di applicazioni di streaming e acquisizione.


Non sto molto sperimentato con DirectX, ma penso che questo è il contorno della soluzione

  1. inizializzare l'applicazione WPF e catturare dispositivo Direct3d di WPF (via this method)

  2. Trovare e agganciare la chiamata EndScene dell'applicazione DirectX di destinazione (using EasyHook+Slimdx)

  3. Render contenuto della superficie del dispositivo WPF ontop di applicazione DirectX agganciato


La domanda principale che ho è come eseguire passaggio 3 utilizzando SlimDX. Mi auguro che una soluzione possa in qualche modo riutilizzare la superficie e non fare affidamento sulla copia poiché l'obiettivo è di non influire sulle prestazioni dell'applicazione collegata. Mi piacerebbe anche essere in grado di limitare la regione e supportare la trasparenza. Mi sto anche chiedendo se l'utilizzo del dispositivo Direct3d di WPF nel dispositivo dell'applicazione DirectX collegata potrebbe causare instabilità.

Qualsiasi intuizione sarebbe apprezzata, grazie.

+0

come hai fatto a farlo allora? Sono bloccato in una situazione simile. – alDiablo

risposta

1

Sto provando a fare lo stesso. Quello che ho trovato finora è che si può rendere il vostro wpfvisualtree a una bitmap ed è poi scrivere bitmap al dispositivo D3D catturato nel punto 2.

void render(Direct3D.Device device) 
{ 

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

} 

I didnt test di questa ancora, ma penso di essere sulla la pista giusta con questo. L'unico problema che ho ora è che perdo tutta l'interattività dalla mia finestra. Clic sul pulsante e così via non saranno più catturati ...

Qualsiasi aiuto sarebbe bello.

+0

hai avuto successo con quello che stavi facendo? – alDiablo