Le GPU sono ottime attività parallele. Il che è fantastico ... se stai eseguendo attività parallele.
I giochi riguardano il tipo di applicazione meno parallelizzabile. Pensa al loop di gioco principale. L'intelligenza artificiale (supponiamo che il giocatore sia gestito come un caso speciale dell'IA) deve rispondere alle collisioni rilevate dalla fisica. Pertanto, deve essere eseguito successivamente. O almeno, la fisica ha bisogno di chiamare routine di intelligenza artificiale entro i limiti del sistema fisico (che generalmente non è una buona idea per molte ragioni). La grafica non può essere eseguita fino a quando non viene eseguita la fisica, poiché la fisica è ciò che aggiorna la posizione degli oggetti. Naturalmente, anche l'IA deve essere eseguita prima del rendering, poiché l'IA può generare nuovi oggetti. I suoni devono essere eseguiti dopo i controlli AI e del lettore
In generale, i giochi possono infilarsi in pochissimi modi. La grafica può essere scartata in un thread; il loop di gioco può raccogliere un sacco di dati nel thread grafico e dire: renderlo. Può eseguire alcune interpolazioni di base, in modo che il ciclo di gioco principale non debba essere sincronizzato con la grafica. Il suono è un altro thread; il loop del gioco dice "gioca a questo" e viene riprodotto.
Dopodiché, tutto inizia a diventare doloroso. Se disponi di algoritmi di pathing complessi (come per gli RTS), puoi threadarli. Il completamento degli algoritmi potrebbe richiedere alcuni frame, ma almeno saranno simultanei. Oltre a ciò, è piuttosto difficile.
Quindi stai guardando 4 thread: gioco, grafica, suono e possibilmente elaborazione AI a lungo termine. Non è molto. E questo non è quasi sufficiente per le GPU, che può avere letteralmente centinaia di discussioni in volo in una sola volta. Questo è ciò che offre alle GPU le loro prestazioni: essere in grado di utilizzare tutti quei thread contemporaneamente. E i giochi semplicemente non possono farlo.
Ora, forse potresti essere in grado di andare "largo" per alcune operazioni. Gli IA, ad esempio, sono generalmente indipendenti l'uno dall'altro. Quindi potresti elaborare diverse dozzine di IA contemporaneamente. Fino a quando non è necessario renderli dipendenti l'uno dall'altro. Allora sei nei guai. Gli oggetti fisici sono ugualmente indipendenti ... a meno che non ci sia un vincolo tra loro e / o si scontrino con qualcosa. Quindi diventano molto dipendenti.
Inoltre, c'è il fatto che la GPU semplicemente non ha accesso all'input dell'utente, che a quanto ho capito è un po 'importante per i giochi. Quindi dovrebbe essere fornito. Inoltre non ha accesso diretto ai file o alcun metodo reale di parlare con il sistema operativo; così di nuovo, ci dovrebbe essere un modo per fornire questo. Oh, e tutta quella elaborazione del suono? Le GPU non emettono suoni. Quindi quelli devono tornare alla CPU e poi al chip audio.
Oh, e la codifica per le GPU è terribile. È difficile ottenere il giusto, e ciò che è "giusto" per un'architettura GPU può essere molto, molto sbagliato per un altro. E questo non è nemmeno solo il passaggio da AMD a NVIDIA; potrebbe passare da una GeForce 250 a una GeForce 450. Questo è un cambiamento nell'architettura di base. E potrebbe facilmente far sì che il codice non funzioni correttamente. C ++ e anche C non sono ammessi; il meglio che ottieni è OpenCL, che è un po 'come la C ma senza alcune delizie. Come la ricorsione . Esatto: nessuna ricorsione sulle GPU.
Debug? Oh, spero che non ti piacciano le funzionalità di debug del tuo IDE, perché quelle sicuramente non saranno disponibili. Anche se stai usando GDB, bacia quell'addio. Dovrai ricorrere al printf
debug ... aspetta, non ci sono printf
GPU. Quindi dovrai scrivere nelle posizioni di memoria e far rileggere il tuo programma di stub della CPU.
Esatto: debug manuale . Buona fortuna.
Inoltre, quelle utili librerie che usi in C / C ++? O forse sei più un tipo .NET, usa XNA e così via. O qualunque cosa. Non importa, dal momento che non è possibile utilizzare nessuno di essi sulla GPU. Devi codificare tutto da zero. E se hai già una base di codice esistente, difficile: è tempo di riscrivere tutto quel codice.
Quindi si È orribile da fare per qualsiasi tipo di gioco complesso. E non funzionerebbe nemmeno, perché i giochi non sono abbastanza paralleli per essere d'aiuto.