2010-07-16 6 views
10

Voglio che il mio programma sia in grado di avviare qualsiasi gioco Windows, e mentre l'utente lo sta riproducendo, mostra in modo intermittente del testo o delle immagini in qualche parte della finestra di gioco. Il gioco può essere in modalità finestra o schermo intero. Da quello che sono stato in grado di ricavare dalle risorse online, questo potrebbe essere fatto usando una libreria grafica che supporta sovrapposizioni e usando Windows Hooks per tenere traccia della finestra dell'applicazione di destinazione. In questo contesto ho alcune domande.Come sovrapporre la grafica sui giochi Windows?

  1. Le sovrapposizioni influiscono sulle prestazioni del gioco?
  2. In che modo l'aggancio dell'applicazione influisce sulle prestazioni?
  3. C'è qualche altro modo per raggiungere questo obiettivo? Ad esempio, come pensi che lo PIX, lo strumento di debug e analisi DirectX, funzioni?

risposta

12

Fraps è l'esempio archetipo di questo tipo di cose per un'applicazione DirectX a schermo intero da un'app di terze parti. Funziona collegando alcune chiamate di sistema e inserendosi nella catena di chiamate tra un'app e DirectX. C'è qualche colpo di prestazioni, ma in generale è minimo.

This page sembra avere alcuni dettagli e codice di esempio su come collegare l'app in questo modo.

Se ricordo correttamente, da altre discussioni del forum (non riesco a trovare il link al momento. per caricare la sua DLL, quindi collega Present() chiama ed esegue una chiamata device-> Clear() prima di chiamare il reale Present(), con un elenco di piccoli rettangoli da impostare su un colore diverso, che può indicare il numero FPS che visualizza. Questo ha un impatto minimo sulle prestazioni ed è ampiamente compatibile con qualsiasi rendering che l'app stia facendo. La sovrapposizione di una bitmap sarebbe più complicata in quanto non sarebbe così facile da fare in tempo reale. Forse se potessi collegare EndScene, potresti fare di più, ma dovresti fare attenzione a non cambiare lo stato del dispositivo.

PIX ha accesso privilegiato al driver DirectX, quindi non mi aspetto di poterlo usare come modello da emulare.

Se un'app di destinazione è in esecuzione in modalità finestra, l'aggancio DirectX funziona ancora, ma è anche possibile utilizzare semplicemente GDI.

Modifica: Penso che this sia il collegamento a cui stavo originariamente pensando.