Strutture di dati nei giochi più vecchi


10

Sono curioso delle strutture dati utilizzate durante la programmazione di giochi più vecchi come Super Mario Brothers per NES e Super Mario World per SNES. La mia comprensione è che i giochi di questo periodo sono stati scritti in assemblea. I programmatori hanno definito / utilizzato strutture di dati?

Ad esempio: quando un gruppo di monete appare sullo schermo come vengono archiviate? I programmatori hanno usato solo array? O forse avevano liste collegate?

Saluti!

Modifica : sono interessato a vari approcci ... non necessariamente un approccio universale.

Modifica 2 : In alcuni dei miei giochi utilizzo un approccio (potenzialmente negativo) nei confronti delle collezioni e voglio sapere se qualcuno dei giochi più vecchi ha usato un approccio simile. Mi piace fare quanto segue:

// statically allocated arrays (max number of coins is 4)
int coinsXs[4] = {0, 0, 0, 0};
int coinsYs[4] = {0, 0, 0, 0};

// bitset that keeps track of which coins are active
int coinsActive = 0;

// ...

// update the active coins in an update function
for(int i = 0; i < 4; i++){
    if(coinsActive & (1 << i)){
        // update ith coin
    }
 }

2
Non esiste una risposta universale; dipende da come un determinato programmatore ha implementato la soluzione per un determinato problema.
Ed S.

1
Anche se non penso che tutti questi giochi siano stati scritti in assembly, dirò che era abbastanza comune per i programmatori di assembly raccogliere i loro piccoli componenti per il riutilizzo di copia / incolla da un programma all'altro. Quante volte vorresti scrivere la funzione printf () dopo tutto? :)
James,

Buon punto. Sono davvero curioso di raccolte allocate dinamicamente rispetto a raccolte allocate staticamente
MrDatabase

1
Che problema specifico hai ? Perché ti interessa cosa fanno i vecchi giochi?
Tetrad

2
Quello che hai nella tua seconda modifica è un esempio di layout "struttura di matrici", che rimane comune anche nei giochi moderni in quanto ha vantaggi per il parallelismo e il funzionamento SIMD. Sony ha fatto una presentazione un paio d'anni fa su come il tradizionale modo C ++ di strutturare i dati può avere costi di perf nascosti gravi: research.scee.net/files/presentations/gcapaustralia09/…
Crashworks

Risposte:


13

Anche nei giorni a 16 bit, le console di gioco erano fondamentalmente solo piccoli computer incorporati che eseguivano software in tempo reale e le strutture di dati che usavamo erano le stesse che avresti trovato ovunque nell'informatica: array, matrici, cumuli, alberi. Non ci sono molte liste collegate perché sono così lente (le ricerche indirette hanno una lunga latenza).

La differenza è che prima dell'STL, e con prestazioni così critiche, di solito dovevamo scrivere noi stessi le strutture e gli algoritmi!

David Braben ha tenuto una divertente lezione al GDC del 2011 in cui ha parlato di tutti i trucchi folli che ha usato per montare Elite su un BBC Micro nel 1984. Puoi vederlo gratuitamente al GDC Vault .


Freddo. Hai usato array allocati dinamicamente? O la maggior parte aveva una dimensione statica? Sono curioso delle situazioni in cui, diciamo, cinque monete appariranno sullo schermo e rimarranno sullo schermo fino a quando il giocatore non le raccoglierà (o scorreranno fuori dallo schermo).
MrDatabase,

2
@MrDatabase: allocazioni statiche ove possibile. Per casi come quello che descrivi, avremmo spesso una matrice allocata staticamente di es. 32 possibili monete che potrebbero esistere. Quando le monete arrivavano nel mondo, riempivamo un punto dell'array. Quando se ne andavano, lo eliminavamo. L'allocazione dinamica non era disponibile, abbiamo semplicemente evitato di usarla perché quando hai solo 2 MB di RAM devi davvero garantire che il tuo programma venga eseguito in memoria costante!
Crashworks,

Freddo. Faccio qualcosa di simile (vedi modifica n. 2 alla domanda). Nella mia funzione di aggiornamento controllo il set di bit "coinsActive" if(coinsActive)prima di scorrere su maxNumCoins e aggiornare. In questo modo evito completamente il ciclo se sono attive zero monete.
MrDatabase,

+1 a causa del collegamento GDC Vault. Il discorso popolare post-mortem di Peter Molyneux deve essere il discorso più esilarante che io abbia mai visto.
TravisG,

MeDataBase: copi l'ultimo oggetto attivo nello slot occupato da una moneta che è diventata inattiva (ad esempio, se hai 10 monete, la moneta 5 diventa inattiva, copia la moneta 10 nello slot 5 e diminuisci le monete numeriche) puoi semplicemente iterare numCoins e aggiorna tutti quegli elementi. Non avresti bisogno del "se". Naturalmente questo funziona solo se le monete inattive non hanno bisogno di mantenere lo stato e se l'ordine di aggiornamento non è importante (lo stato potrebbe essere mantenuto se l'array memorizza i puntatori alle monete e non alle monete effettive, ma si ottiene un comportamento della cache sparsa che è probabilmente peggio del "se")
Kaj,

5

Ecco un'interessante discussione su GameDev.net per il codice sorgente di Super Mario Bros: il codice sorgente di Super Mario

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.