# Sprite (Computergrafik)

Ein Sprite (engl. unter anderem für ein Geistwesen, Kobold) ist ein Grafikobjekt, das von der Grafikhardware über das Hintergrundbild bzw. den restlichen Inhalt der Bildschirmanzeige eingeblendet wird. Die Positionierung wird dabei komplett von der Grafikhardware erledigt. Beispielsweise stellen die meisten Grafikkarten ein Hardware-Sprite für den Mauszeiger zur Verfügung.
Der Name rührt daher, dass ein Sprite sich auf dem Bildschirm bewegt, aber im Grafikspeicher nicht zu finden ist, also scheinbar „umherspukt“. Mit der Zeit hat sich der Begriff aber auch auf alle Objekte ausgedehnt, die so aussehen, auch wenn sie softwaremäßig erzeugt werden und im Grafikspeicher vorliegen.
Heute ist die echte Sprite-Technik überholt, vor allem, da Computer inzwischen schnell genug sind, ohne Probleme tausende spriteartige Objekte auf dem Bildschirm darzustellen und zugleich den Hintergrund in ursprünglicher Form wiederherzustellen. Auch der dafür nötige Speicherplatz ist weniger wichtig geworden.

## Verwandte Begriffe

Oft wird der Begriff Sprite auch verallgemeinernd für Objekte benutzt, die per Software (statt Grafikhardware) über den Hintergrund eingeblendet werden. Dies ist jedoch streng genommen ein Shape, der meistens auch als „Software-Sprite“ bezeichnet wird. Gleiches gilt für ein Objekt, das mit Hilfe von Hardware-Routinen in den Grafikspeicher einkopiert wird, ohne jedoch komplett autonom von der Hardware verwaltet zu werden; hier handelt es sich um ein BOB (Blitter Object) bzw. MOB (Movable Object Block).
In 3D-Spielen wird der Begriff Sprite manchmal für flache Objekte mit einer animierten Textur verwendet. Dabei handelt es sich fast um ein Software-Sprite im klassischen Sinne, allerdings wird dieser mittels 3D-Grafikroutinen als flaches 3D-Objekt in die 3D-Szenerie eingefügt.

## Funktionsweise

Das Sprite wird von der Grafikhardware (Grafikprozessor) zum Anzeigezeitpunkt an der gewünschten Position im Bild eingefügt. Dabei wird der Inhalt des Grafikspeichers nicht verändert – im Gegensatz zum MOB bzw. BOB müssen in diesem nicht immer wieder neu Grafikdaten umkopiert werden. Durch diese Entlastung des Hauptprozessors beanspruchen Sprites kaum Systemressourcen und sind gleichzeitig einfach zu programmieren.
Die Grafikdaten für die Sprites werden nach den gleichen Verfahren wie die Grafikdaten für den normalen Bildaufbau zur Verfügung gestellt – als Beispiele seien der C64 sowie der Amiga genannt, wo dies durch DMA-Speicherzugriffe des Grafikprozessors auf spezielle Bereiche des Hauptspeichers geschieht.
Die Steuerdaten für die Sprite-Darstellung (vor allem die Bildschirmposition) werden entweder direkt in Registern der Grafikhardware vorgehalten (Beispiel: C64, Breite und Höhe der Sprites sind fest vorgegeben) oder in speziellen RAM-Bereichen, auf die diese Hardware genügend schnellen Zugriff hat. Ein Beispiel für die letztere Variante ist der Amiga, bei dem die Steuerdaten zusammen mit den Grafikdaten per DMA-Verfahren aus dem Speicher übermittelt werden. Im Gegensatz zum C64 ist die Höhe der Amiga-Sprites nicht begrenzt.
Zur Bewegung eines Sprites reicht es aus, lediglich dessen x- und y-Koordinaten in den Steuerregistern zu ändern. Die komplizierte Berechnung der Adresse im Grafikspeicher entfällt, was ebenfalls den Hauptprozessor entlastet. Der Grafikprozessor fügt selbständig an den vorgegebenen Koordinaten das Sprite beim Aufbau des nächsten Bildes ein. Auch animierte Sprites sind möglich. Dazu müssen nur die Daten der Sprite-Grafik im Speicher durch die des nächsten Einzelbildes ersetzt werden. Gegebenenfalls kann auch einfach ein anderer Speicherbereich für das nächste Einzelbild angegeben werden.
Ein Sprite ist prinzipiell rechteckig. Aber auch unregelmäßig geformte Sprites sind möglich, indem der Rand transparent dargestellt wird – entweder durch eine bestimmte Farbe, welche vom Grafikprozessor transparent dargestellt wird, oder durch eine Maske, die definiert, an welchen Stellen das Sprite deckend und an welchen es transparent dargestellt werden soll.
Sprites wurden ursprünglich erfunden, um mehrere Bilder in 2D-Videospielen mit spezieller Hardware schnell zusammenzusetzen. Als sich die Computerleistung verbesserte, wurde diese Optimierung unnötig und der Begriff entwickelte sich speziell zu den 2D-Bildern selbst, die in eine Szene integriert wurden. Das heißt, Objekte, die entweder mit benutzerdefinierter Hardware oder nur mit Software generiert wurden, wurden alle als Sprites bezeichnet. Mit zunehmender Verbreitung dreidimensionaler Grafiken wurde der Begriff verwendet, um eine Technik zu beschreiben, bei der flache Bilder nahtlos in komplizierte dreidimensionale Szenen integriert werden.
Ein genauerer Blick auf eine Grafik kann helfen, Unvollkommenheiten dieser Rendering-Technik aufzudecken. Obwohl das Originalbild, mit dem das Sprite erstellt wurde, eindeutig mit strukturierten Polygonen erstellt wurde, wird es dieser Szene als Sprite hinzugefügt. Diese Unvollkommenheiten entgehen den meisten Zuschauern, weil sie selten sind und oft nicht lange anhalten, solange sie und die Kamera sich bewegen. Sprite bezieht sich jetzt häufiger auf eine teilweise transparente zweidimensionale Animation, die in einer dreidimensionalen Szene auf eine spezielle Ebene abgebildet wird. Im Gegensatz zu einer Texturkarte ist die Sprite-Ebene immer senkrecht zur von der Kamera ausgehenden Achse. Das Bild kann skaliert werden, um die Perspektive zu simulieren, es kann zweidimensional gedreht werden, es kann andere Objekte überlappen und verdeckt werden, aber es kann immer nur aus demselben Winkel betrachtet werden. Diese Rendering-Methode wird auch als Billboarding bezeichnet.
Sprites erzeugen eine effektive Illusion, wenn
* das Bild im Sprite bereits ein dreidimensionales Objekt zeigt
* sich die Animation sich ständig ändert oder eine Rotation zeigt
* das Sprite nur für kurze Zeit existiert
* das abgebildete Objekt aus vielen Blickwinkeln ein ähnliches Aussehen hat
* der Betrachter akzeptiert, dass das abgebildete Objekt nur eine Perspektive hat, zum Beispiel kleine Pflanzen oder Blätter
Wenn die Illusion funktioniert, werden die Betrachter nicht bemerken, dass das Sprite flach ist und ihnen immer gegenübersteht. Oft werden Sprites verwendet, um Phänomene wie Feuer, Rauch, kleine Gegenstände, kleine Pflanzen oder spezielle Symbole darzustellen. Die Sprite-Illusion kann in Videospielen aufgedeckt werden, indem die Position der Kamera schnell geändert wird, während das Sprite in der Mitte der Ansicht bleibt. Gelegentlich wurden Sprites auch als Spezialeffektwerkzeug in Filmen verwendet.

## Bedeutung für Computerspiele

Das Aufkommen von Sprites in den 1980er Jahren revolutionierte die Möglichkeiten von Computerspielen, da damals die Prozessorleistung nicht ausreichte, um komplexe Computerspielegrafikdaten auf dem Bildschirm zu verschieben (siehe auch Heimcomputer, z. B. C64, Amiga). Die Sprites wurden durch Shapes (C16) abgelöst oder ergänzt (C128) bzw. um BOBs (Amiga) ergänzt.
Eine weitere Verbesserung für Computerspiele war die Sprite-Sprite-Kollisionserkennung. Sobald der Grafikprozessor beim Erstellen des Bildes erkennt, dass sich zwei Sprites überlappen, wird dies der Software per Interrupt, Flag oder Event mitgeteilt. Damit sind die meisten Computerspiele vergleichsweise einfach zu programmieren, weil sich das Programm nicht um die Kollisionserkennung kümmern muss und für diese keine Rechenleistung verbraucht. Eine vernünftige Kollisionserkennung ist in beinahe allen Grafikprozessoren vorhanden, welche auch BOBs oder Sprites beherrschen.
Sprites sind mit Tiles, welche auch Kachelgrafik genannt werden, verwandt. In sehr vielen 2D-Spielen wie Jump’ n’ Runs werden beide Techniken parallel eingesetzt. Tiles sind ebenfalls kleine Grafikelemente. Aus ihnen wird die Spielewelt zusammengesetzt und sie bilden Wände und Plattformen, verharren also immer auf dem gleichen Platz. Auf diese Weise wird Arbeitsspeicher gespart, da sich wiederholende Muster nur einmal in kleinen Tilegrafiken gespeichert werden müssen, welche entsprechend einer Tilemap angeordnet werden.
Einige Videospiele verwenden heute noch 2D-Sprites, aber die meisten Spiele verwenden stattdessen 3D-Polygone. Da Computer und Spielekonsolen jetzt über dedizierte 3D-Grafikkarten verfügen, können sie 3D-Objekte effizienter rendern als 2D-Sprites. Während Sprites in modernen Videospielen seltener geworden sind, werden sie von Softwareentwicklern immer noch für andere Zwecke verwendet.
Beispielsweise werden Sprites häufig verwendet, um Softwareprogrammen Schaltflächen, Symbole und andere Elemente der Benutzeroberfläche hinzuzufügen. Softwareentwickler können Sprites auf der Benutzeroberfläche Aktionen hinzufügen, z. B. das Abspielen einer Animation oder das Ändern der aktuellen Ansicht des Fensters, wenn auf das Sprite geklickt wird. Sprites sind besonders nützlich, um benutzerdefinierte Grafiken hinzuzufügen, die von der Programmierschnittstelle des Betriebssystems nicht nativ unterstützt werden. Sprites werden im World Wide Web auch für Navigationsschaltflächen und zur visuellen Attraktivität von Webseiten verwendet. In den letzten Jahren sind Sprite Sheets für Webentwickler zu einer beliebten Methode zum Laden von Website-Grafiken geworden. Durch Kombinieren einer großen Anzahl von Sprites in einem einzigen Bild können alle Sprites vom Browser eines Benutzers mit einer einzigen Anfrage an den Server heruntergeladen und zwischengespeichert werden. Die Bilder werden dann mithilfe von CSS-Eigenschaften angezeigt, die die Positionen einzelner Sprites im Bild definieren.

## Software-Sprites

Die „Software-Sprites“ oder „Shapes“, die keine echten Sprites sind, haben in der Regel nur zwei Dinge mit echten Sprites gemeinsam: Erstens sind es Rastergrafiken, die über den Bildschirm bewegt werden, zweitens besitzen sie nicht-rechteckige Umrisse, also eine Maske bzw. transparente Bereiche.
Die Vorteile echter Sprites, wie etwa die geringe Prozessorbelastung oder die automatische Kollisionserkennung, fallen weg. Dafür erhält man als Vorteil, dass die hardwaremäßigen Einschränkungen für die Zahl und die Größe der Sprites wegfallen, wobei diese Grenzen durch die verfügbare Rechenzeit für die Umsetzung in Software neu gesetzt werden.
Im Gegensatz zu echten Sprites muss der Hintergrund, auf dem die Shapes gezeichnet werden, immer wieder nachgezeichnet werden. Am schnellsten geht das, indem man den kompletten Hintergrund der Szene im Speicher zwischenspeichert und immer wieder über das letzte Bild kopiert, allerdings braucht das zusätzlichen Speicherplatz. Speicherplatzschonend wäre, wenn man den Hintergrund immer wieder für jedes Bild neu erstellt, dazu waren frühere Computer aber zu langsam. In Fällen, bei denen sich auch der Hintergrund für jedes Bild ändern kann, fallen diese Betrachtungen natürlich weg. Allenfalls gewisse Optimierungen bei rollenden Szenerien sind denkbar.
Es gibt verschiedene Verfahren für die Speicherung und Anzeige von Softwaresprites. Sie unterscheiden sich in der benötigten Rechenzeit für die Darstellung der Sprites sowie dem zusätzlichen Speicherbedarf für die Kennzeichnung von transparenten Bildpunkten:
* Beim ersten Verfahren wird neben dem Bild eine binäre Maske definiert. Mit dieser Maske verknüpft wird praktisch wie bei echten Sprites nur dann ein Pixel des Shapes gezeichnet, wenn an der entsprechenden Stelle in der Maske ein Bit gesetzt ist.
* Man kann aber auch mittels der Maske ein „Loch“ in dem Bild, das im Grafikspeicher liegt, erzeugen und kopiert dann transparent das Bild des Sprites hinein. „Transparent“ bedeutet hier, dass im Bildspeicher nur gelöschte Bits (0) durch gesetzte Bits (1) des Shapes ersetzt werden, bereits gesetzte Bits werden nicht gelöscht. Deshalb muss man ein „Loch“ erzeugen, in dem alle Bits im Grafikspeicher gelöscht (0) sind, wo später das Bild des Shapes hin soll. Andernfalls würden sich die gesetzten Bits von Hintergrund und Shape vermischen.
* Die „moderne“ Variante ist das Definieren einer transparenten Farbe (was allerdings spätestens bei den Hardware-Sprites des C64 verfügbar war). Beim Zeichnen ersetzt jedes Pixel des Shapes den Untergrund; nur wo in dem Shape die transparente Farbe benutzt wird, wird nichts gemacht, der Hintergrund bleibt also unverändert. Dieses Verfahren hat vor allem den Nachteil, dass man eine Farbe bei einem Shape nicht nutzen kann, was in den Zeiten, als man nur 16 Farben oder weniger gleichzeitig zur Verfügung hatte, eine gewisse Einschränkung darstellte. Außerdem war der dafür nötige Code aus Performance-Gründen am besten in Assembler zu programmieren. Bei den frühen PCs war entsprechende Hardware-Unterstützung für solche fortgeschrittenen Bit-Blit-Operationen (siehe Blitter) eher selten vorhanden.
* Für den 256-Farben-Modus, der bei PCs in den 1990er Jahren üblich war, wurde für Sprites meist eine komprimierte Speicherung der Bilddaten verwendet. Es folgen abwechselnd ein Zähler für die transparenten Punkte und anschließend die anzuzeigenden Bilddaten. Danach wieder der Transparenzzähler usw. Die Vorteile dieser Methode sind ein verringerter Speicherbedarf und eine beschleunigte Generierung der Anzeige, da keine zusätzliche Maske benötigt wird und transparente Bildpunkte einfach übersprungen werden können. Es geht auch keine Farbe „verloren“, da die Transparenz unabhängig von den Bilddaten gespeichert wird.
Alle Verfahren für Softwaresprites haben gemein, dass der Untergrund wiederhergestellt werden muss, da er durch die Softwaresprites zerstört wird.
Die einfachste Methode zur Lösung des Problems ist das Zwischenspeichern des kompletten Hintergrundes oder nur der Stelle, an die das Shape soll, sowie das nachfolgende Zurückkopieren, wenn eine neue Szene gezeichnet werden soll. Der Hintergrund darf sich während dieser Zeit nicht ändern. Für das Sichern und Wiederherstellen von mehreren Shapes über Ausschnitte muss beim Wiederherstellen die umgekehrte Reihenfolge des Sicherns benutzt werden. Würde man dies nicht tun, könnte es zu Artefakten kommen, wenn sich einzelne Shapes überschneiden. Derartige Artefakte sind unter anderem von Mauszeigern auf Fenster-basierten Plattformen bekannt, wenn diese nicht als echte Sprites realisiert wurden und eines der auf dem System laufenden Programme ein Problem hat.

## Spriteanimation

Seit Beginn der Benutzung von Sprites wurde aus Realismusgründen angestrebt, zumindest menschliche Spielfiguren und weitere Lebewesen wie Gegner, Monster etc. weiter zu animieren. Gerade bei der Darstellung eines menschlichen Helden ist es wichtig, dass sich bei der Fortbewegung nach rechts oder links auf einem zweidimensionalen Bildschirm die Beine bewegen. Deshalb besteht eine solche Figur in moderneren Spielen aus mehreren Sprites, die wie bei einem Zeichentrickfilm schnell hintereinander dargestellt werden, um einen fließenden Bewegungseindruck zu erzeugen. Zur Erzeugung dieser Animationssprites wurde in früheren Jahren gerne die Software Deluxe Paint (Amiga) verwendet. Heute gibt es für diesen Zweck Nachfolgeprogramme, wie z. B. Cosmigo Pro Motion. Zu Beginn der Computerspielezeit gab es daneben auch andere Techniken. So verwendete Atari Basketball Ende der 1970er Jahre den sehr grob dargestellten seitlichen Umriss einer gerade stehenden Person als Spielfigur. Beim „Laufen“ blinkte in regelmäßigen Abständen ein abgestrecktes Bein (Linie) auf, welches an den Figursprite kopiert wurde.

## CSS-Sprites

Im Webdesign wird der Begriff Sprites als Bezeichnung für Grafikdateien verwendet, welche aus mehreren kleinen Einzelgrafiken bestehen. Diese Sprites werden per CSS derart in Webseiten eingebunden, dass vom Webbrowser jeweils die benötigten entsprechend zugeschnittenen Teilgrafiken angezeigt werden. Zweck dieser Technik ist einerseits die Verringerung der Gesamtladezeit einer Webseite durch Reduzierung der Serveranfragen und andererseits das Verhindern von Verzögerungen, die durch Nachladen – beispielsweise bei Hover-Effekten – entstehen würden.