Come devo scrivere un loop di gioco principale? [chiuso]


130

Come devo scrivere un loop di gioco principale? Quali sono alcune cose che dovresti fare nel loop del gioco e quali sono alcune cose che non dovresti fare nel loop del gioco?

Ne ho scritti molti, ma non ho mai letto davvero sui circuiti di gioco. Sono sicuro di poterli migliorare considerevolmente, ma non sono sicuro di come.


4
Risposta diabolica: che dire dell'utilizzo del motore di qualcuno per creare questo loop per te? :)
user712092

puoi chiedere all'utente il numero totale di frame che vuole eseguire e usare un ciclo for per n volte la quantità di buffer.
Uğur Gümüşhan,

Risposte:


121

Il ciclo di gioco principale gestisce tre compiti principali:

  1. Ottieni l'input dell'utente
  2. Aggiorna lo stato del gioco
  3. Disegna il gioco

Un semplice ciclo di gioco raccoglie questi tre compiti in un ciclo continuo. Questo ha alcuni risultati indesiderati:

  1. Il gioco funziona a velocità diverse su computer diversi.
  2. CPU (può essere inutilmente) ancorata al 100% di utilizzo.
  3. "Stati di gioco" / menu mancanti o miscelati con il codice di gioco.
  4. Il ciclo di gioco principale è molto lungo e difficile da mantenere.
  5. Il codice è difficile da estendere / portare su altre piattaforme.

I loop di gioco avanzati risolvono i problemi sopra elencati. Ecco alcuni articoli utili:

Per un eccellente esempio di gioco, dai un'occhiata al gioco demo di Allegro skater:

  • Il codice del loop di gioco è in framework.c .
  • Sfoglia qui il codice sorgente completo .

I loop di gioco spesso fanno lo stesso tipo di lavoro per la maggior parte dei giochi, quindi ho pensato a un modo per creare un framework di gioco generalizzato. È meglio scrivere un'implementazione di un loop di gioco e condividerlo tra i giochi. Consente di risparmiare lavoro durante la creazione di un nuovo gioco e i miglioramenti al loop di gioco condiviso possono essere condivisi da tutti i giochi (ad esempio, l'aggiunta di un contatore FPS o la funzione di acquisizione dello schermo).


1
Sì, come sospetto, posso sicuramente apportare miglioramenti. Buone letture. Inoltre, grazie per aver pubblicato il codice. È bello vedere il codice di gioco reale con questa roba.
hokiecsgrad,

1
La CPU dovrebbe essere bloccata al 100% di utilizzo (o più come il 50% se si dispone di almeno 2 core). Pensaci. Come hai intenzione di ottenere una fisica all'avanguardia, una grafica killer, se sei seduto lì a dire a te stesso "Oh, ma non voglio usare tutta la CPU." Sì, dovresti usare il 100% della CPU se possibile (ciò significa che il multithreading sui computer di oggi, quindi è molto difficile usare effettivamente il 100% di 4 core per tutto il tempo). Ottieni il massimo dalla macchina su cui stai correndo che puoi.
bobobobo,

5
Consentitemi di aggiungere: per i programmi desktop . Su un dispositivo portatile, brucerai molta più batteria, quindi ti preoccuperesti del 100% di utilizzo.
Bobobobo,

1
@utente6003859: ho corretto il collegamento.
Leftium


51

Consiglierei l'articolo di Glenn Fiedler sulla solida indipendenza del framerate, " Fix Your Timestep! "

(Meno rilevante per l'argomento in questione, ma anche gli altri articoli della serie sono abbastanza buoni, come ogni cosa sul suo sito!)


Questi sono sicuramente alcuni articoli davvero interessanti. Grazie per la pubblicazione!
hokiecsgrad,

1
Secondo la raccomandazione di avere una solida implementazione indipendente framerate. Tutto nel tuo gioco dovrebbe essere implementato come valore delta che aggiorni periodicamente. E ciò non dovrebbe essere fatto necessariamente nello stesso momento in cui si passa al fotogramma successivo. In effetti, se hai saltato un frame, probabilmente non vorrai semplicemente chiamare i tuoi metodi di aggiornamento con un delta 2x. Sarebbe più coerente chiamare l'aggiornamento due volte con lo stesso delta. Dedica sicuramente del tempo per imparare i problemi con il tuo framerate e il tuo ciclo di aggiornamento. Ti farà risparmiare tempo in seguito.
Dennis Munsie,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.