Questi passaggi citati sono probabilmente eseguiti in motori separati. È solo che i motori di gioco semplici di solito li hanno in un unico passaggio. La tua sequenza
for each object
do physics
do game logic
draw
diventa
call physics subsystem
call game logic subsystem
call drawing subsystem
Physics Engine si occupa di posizioni e dimensioni.
Game Logic Engine si occupa dell'interpretazione di ciò che Physics Engine ha cambiato (potrebbe ostruire alcuni waypoint ...), quali obiettivi hanno i personaggi e quale comportamento dovrebbero comportarsi , esegue script programmati (questa funzione pensa ).
Drawing Engine disegna quali oggetti sono visibili e sa quali oggetti sono visibili perché i motori di Quake in qualche modo imbrogliano qui (vedi la sezione Disegna).
Il mio consiglio è di studiare piuttosto come vengono fatte le simulazioni piuttosto che i motori di gioco. Esiste un'enorme cultura pop relativa allo sviluppo dei giochi e i motori di gioco sono realizzati in linguaggi imperativi (a causa della tradizione e della velocità); quindi è stato più illuminante per me ottenere buoni libri di testo (piuttosto teoria) e POI guardare i motori (pratica) piuttosto che guardare i motori e puzzle per ore come hanno fatto.
Fisica
L'intera nozione di iterare tutte le entità e {pensare, disegnare} probabilmente porterà a problemi. Ci saranno conflitti e così via. Credo che Valve abbia Havok e immagino che Havok si occupi di fisica abbastanza corretta.
Pensare
Pensa che la funzione venga eseguita quando un tempo in un gioco è uguale al tempo nel prossimo pensiero . Funziona in questo modo nel motore Quake e il motore Quake è la base per i motori Half Life. NON viene eseguito ogni volta.
Internamente dovrebbe essere una semplice iterazione attraverso un elenco di entità e verificare se è passato il tempo per chiamare la funzione think. La complessità temporale sarà O (N), dove N è il numero di entità.
Se c'è un numero molto grande di entità Dovresti misurare quanto migliorerà il fps. Si noti che a causa della legge di Amdahl si tratta di uno speedup potenzialmente invisibile. Voglio dire, devi solo scorrere tutti gli elementi e diminuire e controllare un numero.
Vorrei accelerare ordinando le entità in base al prossimo pensiero (creare un elenco di puntatori alle entità e ordinarlo ogni volta; non array di entità, perché le entità potrebbero cambiare il loro pensiero successivo in qualsiasi momento, quindi riordinarle in array richiede O (N) anziché O ( 1) in elenco).
Dovresti anche guardare lo scheduler O (1) in Linux .
Disegnare
Il motore disegna ciò che è approssimativamente visibile dall'area in cui si trova la telecamera. Il livello di gioco è la partizione in un albero e un'area è la foglia di quell'albero. Non ti darò fastidio con i dettagli a riguardo ... Quindi se un'entità è visibile viene inserita in un insieme di entità visibili e vengono disegnate.
Memorizzano quali aree sono aree potenzialmente visibili. Si chiama "potentialy visible set", abbreviato PVS . C'è la visualizzazione del PVS , la capsula verde è il giocatore e intorno a lui viene visualizzato ciò che contiene il suo PVS.
<some commercial engine>
funziona?