lunedì 24 luglio 2017

Perchè Super Mario Bros. pesa solo 32 Kb


Credo che in molti di voi possano conoscere questo meme, però la domanda che ci siamo fatti spesso è come diamine fa un gioco come Super Mario Bros, gioco del 1985 che è riuscito a rivoluzionare la storia del videoludico con soli 31 Kb? Come diamine faceva un gioco così completo per quell'epoca ad essere così leggero?
Dopo aver fatto varie ricerche ed essermi documentato, vi dirò insieme a voi i tanti motivi per cui un gioco di questo tipo pesa così poco.

Differenza tra un gioco intero ed un semplice screenshot del gioco

Cominciamo a partire con una differenziazione tra un gioco intero ed un semplice screenshot del gioco stampato con il tasto Stampa su Windows, copiato e incollato su Paint e salvato in diversi formati. A partire dalle vecchissime console come Atari 2600 e NES, alcuni dei loro giochi avevano un peso inferiore rispetto a degli screen. Poi andando avanti con gli anni, la differenza si è completamente ribaltata, dove questa volta erano i giochi ad essere più pesanti di una semplice immagine del gioco. Sì lo so, è una differenziazione abbastanza stupida, ma era per farvi capire come i giochi di una volta si siano evoluti con gli anni diventando più pesanti di prima.

Generazione di elementi grazie alle istruzioni di programmazione

Una tecnica che si utilizza spesso per risparmiare la memoria delle cartuccie è la generazione di molti elementi di un livello grazie alle istruzioni della programmazione, dove prima del caricamento, il livello è completamente vuoto (ma spesso non ci si fa caso) e dopo il generamento del livello, lo ritroveremmo con gli elementi che dovevano essere presenti.

Riciclaggio degli sprite

Un'altra tecnica per risparmiare memoria è il riciclo degli sprite, ovvero il riutilizzo di uno sprite già esistente il quale viene ricolorato cercando di differenziare da quello di prima. Per esempio, su Super Mario Bros, non è raro notare che le nuvole e i cespugli siano in realtà lo stesso sprite ma con colori differenti, stessa cosa vale per i funghi, i nemici ed altre cose... e anche Luigi. Le console vecchie insieme alle loro cartuccie che non erano così grandi di memoria, non potevano riuscire a permettersi moltissimi sprite differenti e quindi la maggior parte degli sprite erano delle semplici ricolorazioni.


Come potete vedere si tratta di uno SpriteSheet, ossia un insieme di sprite divisi di solito a piastrelle che erano grandi a 16x16 pixel e come potete ben vedere, la maggior parte degli sprite sono delle ricolorazioni di quelli già esistenti. Grazie alla masticazione di istruzioni, si poteva riuscire a creare un livello prendendo pezzo per pezzo di una specifica piastrella, ecco a voi un esempio del primo livello di Super Mario Bros.

 

Molti sappiamo benissimo che nei videogiochi moderni, c'è moltissima libertà nel creare un modello con un insieme di poligoni e di stilarlo a propria preferenza con tanto di texture, questo non vale per i vecchi videogiochi. Infatti, essi usavano una quantità massiccia di riutilizzo di sprite, per garantire appunto il risparmio estremo della memoria delle cartuccie.

Linguaggio di programmazione più vicino alla macchina

Quel che rendeva i giochi così ben fluidi e con delle ottime prestazioni lo si deve anche al linguaggio di programmazione che molte console di quel tempo utilizzavano di solito, l'Assembly.
Assembly era un linguaggio di bassissimo livello che si avvicinava moltissimo al linguaggio macchina, quindi era un linguaggio che era molto più orientato verso l'Hardware, al contrario del C che era spesso orientato di più per il Software. Qualcuno si chiederà perchè le console di una volta non facevano uso del C? Il motivo è molto semplice. Nei tempi d'oro delle console, non c'erano così tanti compilatori di linguaggio di alto livello che potevano essere buoni e moltissimi di quelli non erano ottimizzati come si deve per la maggior parte delle macchine in cui dovevano girare. Un altro motivo per cui si utilizzava di più l'Assembly era anche il più possibile sfruttamento della potenza dell'Hardware, visto che a causa dei costi troppo alti delle componenti dell'hardware, di solito nelle macchine erano presenti per esempio processori di bassa potenza e quindi alla fine l'Assembly veniva utilizzato principalmente per la velocità di esecuzione e prestazione dei giochi grazie alla potenza del hardware.

Le memorie di grandi dimensioni erano troppo costose
 

Uno degli ostacoli principali per moltissime le case di sviluppo era sempre stato la poca memoria il quale una cartuccia poteva riuscire ad immagazzinare, quindi per i programmatori era davvero una faticaccia nel cercare di non superare il limite della cartuccia, che di solito sul NES i giochi non superavano il limite di 1 MB, quindi grazie alle tecniche che avevo detto prima si riusciva a risparmiare molta memoria.

Utilizzo solo di musiche programmate

Prima dell'arrivo di console con il supporto dei dischi ottici (o CD per vostra preferenza) dove venivano accompagnati dal nuovo formato di quell'epoca, ossia l'MP3, tutti i giochi per le vecchie console utilizzavano di solito traccie audio con formato MIDI. Esso era due cose: un linguaggio informatico ed un'interfaccia hardware, che consentiva il collegamento fisico tra dispositivi. L'utilizzo del MIDI riusciva a garantire molti vantaggi: qualità e praticità del sistema, pesava pochissimo, aveva un'ottima qualità delle basi ed il costo era molto basso. Di solito queste musiche venivano riprodotte dalle schede audio che erano incorporate nel processore, quindi non era raro che ci poteva essere qualche interferenza e disturbo della musica in sottofondo a causa delle informazioni da leggere o degli effetti sonori direttamente dal gioco.


Immagini Raster vs Immagini vettoriali

Raster: utilizza una matrice di pixel e viene spesso utilizzato nelle foto e nei video digitali ed il loro vantaggio poteva riuscire a garantire una grafica ben dettagliata, con tanto di gradazioni, ombre, colorazione, linee non definite e la composizione era complessa.

La maggior parte dei giochi, ne fanno spesso uso per riuscire a facilitare il lavoro di grafica per riuscire a rappresentare ogni elemento pixel per pixel.

: esso si basa su formule matematiche che definiscono le primitive forme geometriche: come poligoni, linee definite, curve, cerchi e rettangoli. Poiché la grafica vettoriale è composta da veri e propri primitivi geometrici, viene utilizzato per rappresentare immagini più strutturate, come la grafica con linee definite con colori piatti e uniformi. Le immagini più create (in contrapposizione alle immagini naturali) soddisfano queste specifiche, inclusi loghi, intestazione e caratteri.

Ora, nella maggior parte dei casi i disegni vettoriali possono essere resi utilizzando una serie di comandi testuali; ad esempio, disegnare un rettangolo arrotondato di blu da (0,50) a (100,200) con arrotondamento 5. Questo sarebbe esponenzialmente ridurre i requisiti di spazio per memorizzare un'immagine. Inoltre, la gamma di colori soli 256 colori che significa che è possibile utilizzare un singolo byte per memorizzare un colore preferibilmente di 4 byte, come richiesto in un sistema di visualizzazione a 32 bit.

La prima console che ne fece totalmente uso era il Vectrex, dove tutti i giochi erano disegnati solamente ed esclusivamente con immagini vettoriali, garantendo pochissimo spazio nella memoria delle cartuccie.



Documento scritto nel 4 Luglio e pubblicato come riproposto e convertito da articolo ufficialmente nel 24 Luglio 2017.
Disqus Comments