2009-02-24 16 views
19

Saluti!Mac OS X: un processo può eseguire il rendering nella finestra di un altro processo?

Attualmente sto eseguendo il porting di un plug-in del browser Web da Win32 a MacOSX. Una delle caratteristiche del plugin è che quando il plugin viene caricato, genera un processo separato che funge da "motore" del plugin ed esegue operazioni di disegno nella finestra del plugin (in particolare, allegando un contesto OpenGL al finestra del processo genitore ed esecuzione dei comandi di rendering OpenGL in quel contesto). Lo facciamo perché il plugin è in genere caricato come un thread all'interno del processo del browser, quindi crash nel plug-in eliminerebbe l'intero browser. Partizionando il 'sollevamento pesante' in un processo separato e mantenendo il codice del plugin molto sottile, possiamo proteggere gli utenti da tali arresti anomali.

Vorrei conservare questa architettura di rendering child-processer su MacOSX, ma ho sentito una brutta voce (relativa al browser web Google Chrome) che MacOSX non consente a un processo di accedere a Windows ad un altro processo. La mia ricerca in questo spazio è stata inconcludente; se qualcuno ha qualche conoscenza di questo problema e potrebbe fornire qualche consiglio su come raggiungere questo obiettivo o un "non può essere fatto" più decisivo, sarebbe estremamente utile.

Grazie per il vostro aiuto!

+0

Questo potrebbe essere di vostro interesse. http://developer.apple.com/DOCUMENTATION/CoreFoundation/Conceptual/CFPlugIns/CFPlugIns.html – Jonathan

+2

Che in realtà non ha nulla a che fare con ciò che il poster originale stava chiedendo. –

+0

ciao - dov'è la documentazione su questo per win32? Mi piacerebbe imparare i limiti della proprietà della finestra multi-processo. – drudru

risposta

9

Stavo indagando su una soluzione a questo quasi un anno fa. Ho iniziato un paio di discussioni sulla mela mailing lists:

http://www.mail-archive.com/[email protected]/msg08056.html

http: // www. mail-archive.com/[email protected]/msg01878.html

http://lists.apple.com/archives/mac-opengl/2008/May/msg00099.html

Ho dovuto tornare a una soluzione che utilizzava CGWindowListCreateImage che prendeva una schermata della finestra del processo opengl e la convertiva in una bitmap per la visualizzazione nella finestra del processo principale. Questo è tutt'altro che efficiente poiché i dati dei pixel vengono trasferiti dalla ram del video alla ram del sistema.

Ho anche provato una soluzione per finestre mobili. La finestra del processo opengl galleggiava sopra la finestra del processo principale e rispondeva ai movimenti del mouse dalla finestra principale. Ma ho avuto problemi con il trascinamento del lag e l'ordine della finestra z.

Si potrebbe pensare che NSWindowSharingReadWrite farebbe ciò che si richiede, ma la duplicazione/gli esempi erano allora praticamente inesistenti.

Ma forse le cose sono cambiate nell'ultimo anno. Tienimi aggiornato se trovi qualcosa di nuovo!

Buona fortuna

JC

+0

Dopo aver esaminato questo problema per circa una settimana, sono arrivato più o meno qui. Ho delle richieste in sospeso per Apple sul problema, ma nessuno mi ha risposto su come sfruttare una finestra con NSWindowSharingType impostato su NSWindowSharingReadWrite. A partire da Mac OS 10.5, dovrò chiamare write-to-windows "non esistente" o "troppo poco documentato per la cura". La soluzione che ho usato è stata quella di creare un buffer di memoria condiviso con shm_open e mmap, glReadPixels in quello del processo A, e quindi glTexImage2D e renderizzare in un quad nel processo B. È abbastanza veloce. – fixermark

+0

Ho anche provato l'approccio in cui la finestra del processo opengl galleggia sopra il processo principale. Gestire gli spazi richiede l'utilizzo di un'API privata che ti dà notifiche quando l'utente cambia schermo o usa expose. La parte peggiore riguarda i clic, che fanno sì che la posizione z della finestra principale passi davanti alla finestra di opengl, ma ho trovato una funzione privata in [NSWindow sendEvent] che lo ha parzialmente risolto. Questo è brutto e sto cercando una soluzione migliore. – neoneye

3

Una finestra in un processo può essere scritta da un altro processo, apparentemente se lo NSWindowSharingType è impostato su NSWindowSharingReadWrite. Questo è stato aggiunto in Leopard. Nota che non l'ho usato io stesso, ma direi che rimuove almeno l'ostacolo "non può essere fatto" per te ;-)

5

Ecco la risposta complessiva ricevuto dal team di sviluppo di Apple.

Non c'è praticamente alcun modo per farlo in MacOSX 10.5 e precedenti che sia pulito come collegare un contesto di rendering OpenGL alla finestra di un altro processo. Gli hacker che le persone hanno sviluppato potrebbero essere le migliori soluzioni in questi casi.

La cosa più vicina che abbiamo in MacOS 10.6 è the IOSurface system; usando quello in 10.6 sembra essere la soluzione più pulita. Se desideri che i clic nel processo di rendering vengano intercettati dal processo di rendering, dovrai raggruppare gli eventi tu stesso e trasferirli al processo di rendering utilizzando il metodo che ritieni più appropriato.

Maggiori informazioni sul IOSurface potrebbe essere trovato in this StackOverflow entry

Problemi correlati