Sono interessato a valutare i diversi modi in cui il netcode può "agganciarsi" a un motore di gioco. Sto progettando un gioco multiplayer ora, e finora ho deciso che devo (per lo meno) avere un thread separato per gestire i socket di rete, distinto dal resto del motore che gestisce il loop grafico e gli script.
Avevo un modo potenziale per creare un gioco in rete interamente a thread singolo, ovvero quello di farlo controllare alla rete dopo aver eseguito il rendering di ogni fotogramma, utilizzando socket non bloccanti. Tuttavia, ciò non è chiaramente ottimale poiché il tempo impiegato per il rendering di un frame viene aggiunto al ritardo della rete: i messaggi che arrivano sulla rete devono attendere fino al completamento del rendering del frame corrente (e della logica di gioco). Ma, almeno in questo modo, il gameplay rimarrebbe comunque fluido, più o meno.
Avere un thread separato per la rete consente al gioco di essere completamente reattivo alla rete, ad esempio può inviare immediatamente un pacchetto ACK alla ricezione di un aggiornamento di stato dal server. Ma sono un po 'confuso sul modo migliore di comunicare tra il codice di gioco e il codice di rete. Il thread di rete spingerà il pacchetto ricevuto in una coda e il thread del gioco leggerà dalla coda al momento opportuno durante il suo ciclo, quindi non ci siamo liberati di questo ritardo massimo di un fotogramma.
Inoltre, sembra che vorrei che il thread che gestisce l'invio dei pacchetti fosse separato da quello che sta controllando la presenza di pacchetti che scendono dalla pipe, perché non sarebbe in grado di inviarne uno mentre è nel mezzo di controllando se ci sono messaggi in arrivo. Sto pensando alla funzionalità diselect
o simili.
Immagino che la mia domanda sia: qual è il modo migliore per progettare il gioco per la migliore reattività di rete? Chiaramente il client dovrebbe inviare al server l'input dell'utente il più presto possibile, in modo che il codice net-send arrivi immediatamente dopo il ciclo di elaborazione degli eventi, entrambi all'interno del loop di gioco. Questo ha senso?