Knipperende sprites in NES spellen

Hier worden nieuwe KB-artikelen gepost door de Button Bashers Bot.

Knipperende sprites in NES spellen

Berichtdoor Apenheul » 04 jan 2015, 12:30

Knipperende sprites, oftewel sprite flickering, is een bekend fenomeen bij veel NES spellen en kan leiden tot veel irritatie wanneer het de prestatie van de speler in de weg zit. Hoewel vroeger wel eens gedacht werd dat het een bug was of dat de contacten van cartridges vuil waren betreft het hier simpelweg een hardwarematige limitatie van de NES; de PPU (picture processing unit) kan namelijk maar 8 sprites op 1 vertikale beeldlijn renderen.

AfbeeldingAfbeelding
Deze .gif animaties zijn afkomstig van Dwedit van het nesdev forum

Het probleem van deze hardwarelimiatie is bijzonder duidelijk in de eerste 15 seconden van het volgende fragment uit Mega Man 2, zodra het ei op de grond valt ontstaan er acht robot-vogeltjes die vrij chaotisch bewegen. Mega Man zelf heeft al 3 (of soms 4, afhankelijk van of hij staat, springt of schiet) sprites op 1 beeldlijn en de kans dat een paar vogeltjes en pea shooter kogeltjes op dezelfde lijn komen is in deze situatie groot. Wat er dan gebeurt is dat de PPU ervoor kiest alleen de eerste acht sprites te tekenen en blijkbaar werd Mega Man pas na de kogels en vogeltjes gerenderd.



Dat Mega Man tijdelijk onzichtbaar wordt is vervelend, maar de ontwikkelaars vonden dat een beter scenario dan dat kogels of vijanden onzichtbaar werden. Ik weet niet wat de officiële term voor deze aanpak is waarbij de ontwikkelaar aangeeft welke sprites voorrang krijgen bij renderen, maar ik noem het OAM priority. Wat OAM precies is kom ik later op terug.

Veel ontwikkelaars probeerden op een andere manier om deze hardwarelimitatie heen te werken. Als de game veel sprites moet renderen omdat er bijvoorbeeld grote geanimeerde karakters in zitten (b.v. beat 'em ups) of omdat het spel draait om een overmacht aan projectielen (b.v. bullet-hell shooters) dan is het geen optie om prioriteit aan slechts 8 sprites te geven. In plaats daarvan besloten sommige ontwikkelaars om elk frame een andere set sprites te renderen. De twee Turtles beat 'em ups van Konami hebben ook veel last van flickering maar laten een interessante implementatie van deze tactiek zien.



Wanneer meer dan twee karakters op dezelfde hoogte staan worden bepaalde sprites van een karakter wel gerenderd en andere niet. Hierbij verdwijnt een deel van het karakter tijdelijk (meestal maar 1 frame). Deze tactiek wordt vaak OAM cycling genoemd omdat er niet gekozen wordt om telkens dezelfde sprites te renderen maar om bij wijze van spreken elk frame langs verschillende sprites te fietsen.

Vaak wordt er dus een combinatie gebruikt tussen OAM priority en OAM cycling. Om het spel goed te kunnen spelen zonder dat de situatie oneerlijk overkomt moet de speler ten alle tijden dodelijke projectielen kunnen zien, dus kogels vallen meestal in de OAM priority categorie. Maar tegelijkertijd moeten karakters ook voldoende zichtbaar zijn waarvoor OAM cycling gebruikt wordt. Mega Man 2 gebruikt bijvoorbeeld OAM cycling in de twee gif animaties bovenaan dit artikel en OAM priority voor de projectielen in het gameplay-fragment.

Object Attribute Memory (OAM)

Hierboven heb ik al enkele keren de afkorting OAM gebruikt, deze staat voor Object Attribute Memory en dit deel van het geheugen dat bij de PPU hoort kan een lijst met maximaal 64 sprites bevatten. Elke sprite omvat 4 bytes wat OAM een totale omvang geeft van 4 x 64 = 256 bytes. De volgorde van de sprites in deze lijst bepaalt ook de prioriteit, sprites vooraan in de lijst worden over sprites achter in de lijst gerenderd. Wat heeft dit nou allemaal temaken met die limitatie van 8 sprites per beeldlijn? De beeldlijn waarop een sprite gerenderd moet worden is gespecificeerd in elke 1e byte van een sprite, en wanneer er meer dan 8 sprites in OAM staan met dezelfde waarde in de 1e byte dan worden alleen de eerste 8 sprites van de lijst uiteindelijk getekend. Wanneer een ontwikkelaar softwarematig die lijst sorteert, bijvoorbeeld door kogels altijd eerder in de lijst voor te laten komen dan de speler-avatar dan is er sprake van OAM priority. Wanneer de ontwikkelaars ervoor kiezen om elk frame de volgorde van sprites in de lijst te veranderen dan is er sprake van OAM cycling. Bij sommige soorten spellen is het mogelijk om bepaalde sprites gewoon 1 beeldlijn hoger of lager te renderen wanneer het de gameplay niet hindert en daarmee de limitatie te omzeilen.

Dus nu weet je dat het knipperen van sprites op de NES geen bug is of aanslag op de connectoren van de cartridge. Het is een hardwarelimitatie waar softwarematig oplossingen omheen te ontwikkelen zijn maar die niet compleet omzeild kan worden (iets wat op sommige andere platformen wel mogelijk is d.m.v. een techniek die multiplexing wordt genoemd). Deze limitatie maakte het voor ontwikkelaars moeilijk om bepaalde genres mogelijk te maken zoals bijvoorbeeld bullet-hell shooters, maar we mogen blij zijn dat het nog 8 sprites per beeldlijn zijn en niet slechts 2 zoals bij de Atari 2600 :)
Avatar gebruiker
Apenheul
Beheerder
 
Berichten: 13655
Geregistreerd: 16 dec 2013, 11:31
Woonplaats: Eindhoven

Wie is er online

Gebruikers op dit forum: Geen geregistreerde gebruikers. en 1 gast

Top