È necessario pensare, quali sono i vantaggi effettivi dei thread? Ricorda che su una macchina single core, i thread non consentono effettivamente l'esecuzione simultanea, solo l'impressione di essa. Dietro le quinte, la CPU cambia il contesto tra i diversi thread, facendo un piccolo lavoro ogni volta. Pertanto, se ho diverse attività che non comportano l'attesa, eseguirle contemporaneamente (su un singolo core) non saranno più veloci di eseguirle linearmente. In effetti, sarà più lento, a causa del sovraccarico aggiunto della frequente commutazione di contesto.
Se è questo il caso, perché usare mai i thread su un singolo core? Innanzitutto, perché a volte le attività possono comportare lunghi periodi di attesa su alcune risorse esterne, come un disco o un altro dispositivo hardware, per essere disponibili. Mentre l'attività è in una fase di attesa, il threading consente ad altre attività di continuare, utilizzando in tal modo il tempo della CPU più efficiente.
In secondo luogo, le attività possono avere una scadenza di qualche tipo in cui completare, in particolare se rispondono a un evento. L'esempio classico è l'interfaccia utente di un'applicazione. Il computer dovrebbe rispondere agli eventi di azione dell'utente il più rapidamente possibile, anche se è occupato ad eseguire altre attività di lunga durata, altrimenti l'utente sarà agitato e potrebbe credere che l'applicazione si sia arrestata in modo anomalo. La filettatura consente che ciò accada.
Per quanto riguarda i giochi, non sono un programmatore di giochi, ma la mia comprensione della situazione è questa: i giochi 3D creano un modello programmatico del mondo di gioco; giocatori, nemici, oggetti, terreno, ecc. Questo mondo di gioco viene aggiornato in passaggi discreti, in base alla quantità di tempo trascorso dall'aggiornamento precedente. Quindi, se è passato 1ms dall'ultima volta del ciclo di gioco, la posizione di un oggetto viene aggiornata usando la sua velocità e il tempo trascorso per determinare il delta (ovviamente la fisica è un po 'più complicata di così, ma ottieni il idea). Altri fattori come l'intelligenza artificiale e i tasti di inserimento possono anche contribuire all'aggiornamento. Quando tutto è finito, il mondo di gioco aggiornato viene reso come un nuovo frame e il processo ricomincia. Questo processo di solito si verifica molte volte al secondo.
Quando pensiamo al circuito di gioco in questo modo, possiamo vedere che il motore sta infatti raggiungendo un obiettivo molto simile a quello del threading. Ha un numero di attività di lunga durata (aggiornamento della fisica del mondo, gestione dell'input dell'utente, ecc.) E dà l'impressione che stiano succedendo contemporaneamente suddividendoli in piccoli pezzi di lavoro e intrecciando questi pezzi, ma invece di fare affidamento su la CPU o il sistema operativo per gestire il tempo speso su ciascuno, lo fa da solo. Ciò significa che può mantenere sincronizzati tutti i diversi compiti ed evitare le complessità che derivano dal threading reale: lock, pre-emption, codice di rientro, ecc. Non c'è nessuna implicazione di prestazioni in questo approccio, perché, come abbiamo detto, la macchina single core può solo eseguire il codice in modo lineare in ogni caso.
Le cose cambiano quando si dispone di un sistema multi-core. Ora, i compiti possono essere eseguiti in modo sincrono contemporaneamente e potrebbe esserci un vantaggio nell'usare il threading per gestire diverse parti degli aggiornamenti del mondo di gioco, a patto che possiamo riuscire a sincronizzare i risultati per rendere i frame coerenti. Ci aspetteremmo quindi, che con l'avvento dei sistemi multi-core, gli sviluppatori di giochi dovrebbero lavorare su questo. E così risulta, lo sono. Valve, i creatori di Half Life, ha recentemente introdotto il supporto multiprocessore nel suo Source Engine, e immagino che molti altri sviluppatori di motori stiano seguendo la stessa cosa.
Bene, questo si è rivelato un po 'più lungo di quanto mi aspettassi. Non sono un esperto di threading o giochi, ma spero di non aver commesso errori particolarmente evidenti.Se sono sicuro che le persone mi correggeranno :)
Il parallelismo è difficile. Non solo "wow, questo è difficile", ma "teoricamente, molti problemi non sono parallelizzabili". –