2011-01-24 4 views
6

EDIT: Poiché il mio problema originale era dovuto al mio errore, riformulerò questa domanda.Copia contenuto del controllo Silverlight ospitato

Im hosting di Silverlight in una finestra all'interno dell'applicazione C++ basata sul codice trovato here.

Ora mi piacerebbe copiare il contenuto del controllo in memoria per utilizzare il contenuto all'interno del mio riproduttore. Il problema che ho è che quando imposto "EnableGPUAcceleration" su true, BitBlt smette di funzionare, tutto quello che ottengo è l'oscurità.

Ritengo che in teoria ci dovrebbe essere un modo per copiare il contenuto di un controllo Silverlight accelerato dalla GPU con il suo alfa, ad es. con qualcosa come glReadPixels.

Qualcuno ha idea di come copiare il contenuto con alfa di un controllo Silverlight con accelerazione gpu senza finestra?

Un altro problema è che la finestra deve essere visibile e nessun'altra finestra potrebbe sovrapporsi, altrimenti non otterrò il contenuto corretto. Vorrei che la finestra di hosting fosse invisibile.

codice di esempio di lavoro può essere trovato here (anche se senza il BitBlt vero e proprio "ting" che sto cercando di andare al lavoro).

+2

Avete un codice di esempio che dimostra effettivamente il vostro problema alfa? Perché il controllo Silverlight ospitato da CodeProject può essere copiato correttamente con BitBlt, giusto? O mi sta sfuggendo qualcosa? –

+0

@Simon: hai ragione. Il mio codice di test non era corretto. – ronag

risposta

2

Inizierò a cercare questo, ho un'idea di OpenCL o forse visto che stai usando Silverlight, DirectCompute potrebbe essere in grado di configurare un contesto in cui puoi avere più flessibilità.

Un modo sarebbe semplicemente fare tutta l'accelerazione GPU in una di quelle lingue. Nel frattempo cercherò di scoprire se è possibile utilizzare uno di questi per afferrare le informazioni necessarie o altre tecniche.

This link sembra verificare che sarà necessario l'accelerazione GPU abilitata tra tutti i membri interattivi.

EDIT:

penso che l'articolo può fornire qualche altro aiuto per il problema. Essenzialmente si tratta di accedere alla cache e assicurarsi di utilizzare la cache. Qualsiasi elemento impostato in modalità cache verrà temporaneamente memorizzato sulla scheda grafica.

This article getta luce sui problemi. Dove parla sul rendering hardware, è importante notare quali operazioni potrebbero causare problemi con la cache.

Devo ammettere che non sono affatto fluente in Silverlight, ma questi tipi di problemi sono familiari. Fare quello che posso per capire la situazione del tuo codice.

-1

Purtroppo non è possibile (IMHO).

Se si abilita l'accelerazione, tutta l'elaborazione video viene eseguita nella gpu e visualizzata sullo schermo utilizzando un buffer di sovrapposizione dell'hardware. quindi non è accessibile.

Lo stesso vale per la funzione di schermo di stampa su Windows. a meno che tu non possa accedere alla gpu ed estrarre i pixel in cui ti trovi nei guai.

Dai un'occhiata alla sezione degli screenshot qui ...http://en.wikipedia.org/wiki/Hardware_overlay

Sono un novizio su silverlight e quindi non so cosa è disponibile, ma puoi estrarre i dati prima che siano renderizzati. Questo potrebbe rallentare drasticamente l'applicazione. accelerazione gpu è progettato per rimuovere le restrizioni della cpu e della larghezza di banda, quindi tutto ciò che entra nel percorso lo rallenterà. puoi anche attivare il bit di inclinazione (DRM) disabilitando tutto.

DC