2011-11-13 11 views
14

Ho sentito dire che i vecchi giochi di scorrimento a scorrimento in arcade utilizzavano uno specifico hack di programmazione per abilitare lo scorrimento laterale performante.Qual è il "trucco di scorrimento laterale" dei vecchi giochi?

Capisco che anni fa le macchine non erano abbastanza potenti da ridisegnare l'intero schermo ogni fotogramma come è fatto oggigiorno. Esistono tecniche, ad esempio rettangoli sporchi, che consentono di ridurre a icona l'area dello schermo necessaria per ridisegnare quando lo sfondo è stazionario e solo gli sprite si spostano.

L'approccio sopra riportato funziona solo quando lo sfondo non cambia (e quindi la maggior parte dei pixel dello schermo rimane fissa).

I giochi a scorrimento verticale, come i vecchi sparatutto, hanno la cosa un po 'più difficile con lo sfondo che cambia ogni fotogramma a causa della pergamena. Tuttavia, si potrebbe sfruttare il modo in cui i pixel vengono inviati al display (riga per riga). Immagino che si possa usare un buffer più grande e spostare il puntatore dei dati su alcune linee "in basso" ogni fotogramma, in modo che venga ridisegnato a partire da un'altra posizione, dando così l'impressione di una pergamena fluida. Ancora solo gli sprite (e un po 'di sfondo sul bordo dello schermo) dovrebbero essere ridisegnati, il che è una seria ottimizzazione.

Tuttavia, per i giochi a scorrimento laterale , la cosa non è così semplice e ovvia. Tuttavia, sono consapevole che qualcuno, da qualche parte nel passato, ha però un'ottimizzazione che (con alcune limitazioni) ha permesso alle vecchie macchine di scorrere lo sfondo in orizzontale senza ridisegnarlo ogni fotogramma.

IIRC è stato utilizzato in molti vecchi giochi, per lo più 80 up picchiaduro, così come nelle produzioni demoscene

Puoi descrivere questa tecnica e il nome del suo autore?

+1

Due eccellenti risposte non sovrapposte! Vorrei poter accettare entrambi :-) – Kos

risposta

10

Ho scritto giochi per il buon vecchio C64 facendo esattamente questo. E ci sono fondamentalmente due cose da tenere presenti:

  1. questi giochi non sono state utilizzando la grafica bitmap, ma invece usato "rimappata" serie di caratteri, il che significa che pezzi di 8x8 pixel sono stati effettivamente hurdled giro come solo un byte .

  2. La prossima cosa da notare è che c'era un supporto hardware per spostare l'intero schermo di sette pixel. Si noti che questo non ha in alcun modo influenzato la grafica - ha solo reso tutto spostato verso la TV un po 'spostato.

Quindi 2) ha reso possibile lo scorrimento davvero scorrevole di 7 pixel. Poi hai spostato tutti i personaggi - che per uno schermo intero erano esattamente 1000 byte, a cui il computer poteva far fronte, mentre allo stesso tempo hai spostato il registro a scorrimento di 7 pixel. 8 - 7 = 1 significa che sembra che tu abbia fatto scorrere ancora un altro pixel singolo ... e poi ha continuato in quel modo. Quindi 1) e 2) combinati hanno reso l'illusione di un vero scorrimento fluido!

Dopo che una terza cosa è entrata in gioco: interruzioni raster. Ciò significa che la CPU riceve un interrupt quando la TV/monitor sta per iniziare a disegnare una linea di scansione in una posizione specificata. Questa tecnica ha reso possibile la creazione di uno schermo diviso in modo che non fosse necessario scorrere lo schermo intero anziché la mia prima descrizione.

E per essere ancora più nei dettagli: anche se non volevi uno schermo diviso, l'interrupt raster era molto importante in ogni caso: perché è stato altrettanto importante, allora come lo è oggi (ma oggi il quadro si nasconde questo da tu) per aggiornare lo schermo al momento giusto. La modifica del "registro di scorrimento" quando il TV/monitor si stava aggiornando in qualsiasi punto dell'area visibile causerebbe un effetto chiamato "strappo" - in cui si nota chiaramente che le due parti dello schermo sono un pixel off sync l'una con l'altra.

Che altro c'è da dire? Bene, la tecnica con set di caratteri rimappati ha reso possibile fare alcune animazioni molto facilmente. Ad esempio i nastri trasportatori, le ruote dentate e le cose potrebbero essere animati cambiando costantemente l'aspetto dei "personaggi" che li rappresentano sullo schermo. Quindi un nastro trasportatore che copre l'intera larghezza dello schermo potrebbe sembrare come se girasse dappertutto cambiando solo un singolo byte nella mappa dei caratteri.

+0

Nizza. Ho provato qualcosa di simile su un PC, ma è stato ostacolato dal solo essere in grado di mettere 256 "caratteri" diversi in un set. –

+0

c'era anche una bandiera nel chip video del C64 per ridurre il display orizzontalmente di un carattere in modo da non notare il carattere in eccesso attualmente inserito. –

+0

@yi_H abbastanza. Ora sei davvero nei dettagli! :-) –

8

Ho fatto qualcosa di simile negli anni '90, usando due approcci diversi.

Il primo riguardava "windowing", supportato dallo standard SVGA VESA. Alcune schede sono state implementate correttamente. In sostanza, se si dispone di un frame buffer/RAM video più grande dell'area visualizzabile, è possibile disegnare una bitmap grande e fornire le coordinate di sistema per una finestra all'interno dell'area che si desidera visualizzare. Modificando tali coordinate, è possibile scorrere senza dover riempire nuovamente il frame buffer.

L'altro metodo si basava sulla manipolazione del metodo BLT utilizzato per ottenere un frame completato nel frame buffer. Bloccare una pagina nel buffer del fotogramma avente le stesse dimensioni dello schermo è facile ed efficiente.

Ho trovato questa vecchia 286 codice assembler (su un funzionamento 17enne floppy !) Che copiato uno schermo 64000 byte (320x200) da una pagina off-screen per il buffer video:

Procedure flip; assembler; 
    { This copies the entire screen at "source" to destination } 
    asm 
     push ds 
     mov  ax, [Dest] 
     mov  es, ax 
     mov  ax, [Source] 
     mov  ds, ax 
     xor  si, si 
     xor  di, di 
     mov  cx, 32000 
     rep  movsw 
     pop  ds 
    end; 

Il rep movsw ha spostato le parole CX (dove una parola è in questo caso due byte). Questo è stato molto efficiente poiché è fondamentalmente una singola istruzione che dice alla CPU di spostare l'intera cosa il più rapidamente possibile.

Tuttavia, se si dispone di un buffer più grande (ad esempio, 1024 * 200 per uno scroller laterale), si potrebbe facilmente utilizzare un ciclo annidato e copiare una singola riga di pixel per loop. Nella vasta buffer di 1024 pixel, per esempio, è possibile copiare byte:

start   count    
0+left   320 
1024+left  320 
... 
255*1024+left 320 

dove left è la coordinata x all'interno della grande immagine di sfondo che si desidera avviare al (lato sinistro dello schermo).

Naturalmente, in modalità a 16 bit, era necessario un po 'di magia e manipolazione dei puntatori di segmento (ES, DS) per ottenere un buffer superiore a 64 KB (in realtà, più buffer a 64k adiacenti), ma funzionava piuttosto bene.

Probabilmente c'erano soluzioni migliori a questo problema (e sicuramente migliori da usare oggi), ma ha funzionato per me.

2

I giochi Arcade presentano spesso chip video personalizzati o logica discreta per consentire lo scorrimento senza che la CPU debba fare (molto) lavoro. L'approccio sarebbe simile a quello che danbystrom stava descrivendo sul C-64.

Fondamentalmente l'hardware grafico si è occupato di caratteri a scorrimento (o tessere) e la CPU ha poi gestito la sostituzione di tutte le tessere una volta che i registri a scorrimento hanno raggiunto il limite.Attualmente sto esaminando la scheda Irem m-52 che si occupa di più sfondi a scorrimento nell'hardware. Schemi possono essere trovati online.

1

Per lo scorrimento a destra sul Commodore Amiga abbiamo utilizzato Copper per spostare a destra lo schermo fino a 16 pixel. Quando lo schermo è stato spostato, abbiamo aggiunto 2 byte all'indirizzo iniziale del buffer dello schermo mentre sul lato destro abbiamo utilizzato il Blitter per copiare elementi grafici dalla memoria principale al buffer dello schermo. Avremmo impostato il buffer dello schermo leggermente più grande della visualizzazione dello schermo in modo da poter copiare la grafica senza che si vedesse un effetto sfarfallio dalla copia sul lato destro della finestra.

Problemi correlati