Parli di "difficoltà di multithreading" ma di quali difficoltà stai effettivamente parlando? In un certo senso stai citando un problema fantasma che potrebbe anche non esistere. La vera sfida è quella che fai per te stesso: se sei assolutamente determinato a ottenere ogni ultima goccia di energia da un pezzo di hardware, ciò comporta l'utilizzo dell'hardware per ottenere i migliori risultati, ma aumenta anche il divario tra la macchina più potente e il meno potente. Ciò implica che se hai un gioco che sfrutta al massimo una PS3 (ad esempio), non puoi comunque eseguirlo su un cellulare economico, quindi il tuo problema non è più "come posso ottenere 1 programma lavorare su hardware molto diverso "ma diventa" come posso implementare 1 idea di gioco in diversi modi in modo che funzioni su hardware alimentato diversamente ".
Mentre una libreria come SDL fornisce un'API wrapper multipiattaforma per il threading, penso che sarebbe ingenuo presumere che ciò porti direttamente a un facile sviluppo di giochi su piattaforme molto diverse (desktop / mobile).
Facile sviluppo di giochi - certo. Multithreading ottimale, no. Ma non è necessario il multithreading per creare giochi. Per rendere quelli ad alte prestazioni, sicuramente aiuta. Ma molti grandi giochi girano in un unico thread.
Qual è il modo migliore per affrontare lo sviluppo in questo modo (data qualsiasi API di threading multipiattaforma) considerando quanto segue:
- diversi numeri di core
- capacità di elaborazione molto diverse per core
- Un'architettura di sistema generalmente diversa con es. latenze diverse per l'accesso a cache, RAM e I / O
Invece di provare ad assegnare i sistemi ai thread, assegnare attività ai thread. Fornisci a ogni attività i dati necessari per l'esecuzione e trasferisci le attività su qualsiasi hardware disponibile. Di solito avrai una sorta di pool di thread per sottrarre i vari core o processori e un task manager che ha una coda di task e li consegna ai vari thread quando il thread segnala che è finito il compito precedente ed è pronto per uno nuovo. L'hardware con più core ovviamente completerà le attività più rapidamente e sarà in grado di renderizzare più rapidamente. Specializzare questo sistema in modo che funzioni in modo ottimale su sistemi con caratteristiche diverse diventa un problema di ottimizzazione avanzato, ma può basarsi su determinate euristiche (ad es. Un'attività che non
Tuttavia, la scomposizione delle caratteristiche del gioco in compiti discreti è una questione piuttosto complessa e spesso non vale la pena, a meno che non si sia molto sicuri di aver bisogno delle prestazioni, quindi la maggior parte non ci proverà nemmeno.
Qualche ulteriore lettura:
http://www.gamasutra.com/view/feature/1830/multithreaded_game_engine_.php - consultare la sezione "dati paralleli". Con questo modello i dati vengono suddivisi su più attività identiche e trasferiti su singoli thread.
http://software.intel.com/en-us/articles/designing-the-framework-of-a-parallel-game-engine/ - abbastanza denso, descrive le cose a livello di sistema operativo piuttosto che a livello di gioco.
http://drdobbs.com/high-performance-computing/216500409 - non specifico per il gioco, ma completamente pertinente in termini di spiegazione di come è necessario suddividere i compiti.
http://www.itfgaming.com/news/tech-focus-crysis-2-and-the-future-of-cryengine-3 - A metà di questa intervista c'è un aneddoto su come sono passati a un sistema basato su attività .