2D - großen Hintergrund zeichnen / scrollen
-
Hi,
es geht um einen Hintergrund der scrollbar sein soll und aus einem schon größerem Panoramabild besteht. Man kann es sich so vorstellen, dass eine Figur einfach einen Weg lang läuft und im Hintergrund ist ein 8000x1000 Pixel großes Bild das vorbei"scrollt".Spontan sind mir 3 Wege eingefallen
-
man nimmt ein 8000x1000 Pixel großes Bild, schneidet sich den sichtbaren Bereich aus und stellt ihn dar.
- Wie groß darf eine Texture/ein Bild sein? Wie performant ist das? -
man nimmt das 8000x1000 Pixel große Bild, zerhackstückt es in kleine Tiles und puzzelt es beim rendern immer wieder zusammen.
- Wie performant ist das? Wie verwaltet man performant diese Bildstückchen? -
man "streamed" das Bild irgendwie auf den Bildschirm. Immer nur den Bereich, den man auch sichtbar machen will. Geht sowas?
Gibt es Techniken dies elegant umzusetzen? In der Praxis habe ich rumprobiert mit DirectX9, Sprites und Textures. Falls jemand praktische Beispiele hat, gerne mit DirectX.
Danke
-
-
weg 2 ist IMO der richtig und man verwalted die tiles in einem 2D array.
-
- man "streamed" das Bild irgendwie auf den Bildschirm. Immer nur den Bereich, den man auch sichtbar machen will. Geht sowas?
falls du aber irgendwann in die situation kommst, dass dein hintergrund groesser ist als dein grafikspeicher (das passiert sogar ziemlich schnell wenn man ueber mehrere ebenen scrollt) waere das die einzig sinnvolle alternative.
zb mit einem ringbuffer:
du teilst deinen bildschirm horizontal in "n+1" streifen von "x" pixeln.
du verschiebst die streifen in die richtung in die gescrollt werden soll.
wenn ein streifen ausserhalb des bildes ist, kommt er auf die andere seite und seine textur wird aktualisiert.
-
Danke für eure Antworten.
@raspo
Beispiel Directx: ist es dann einfach ein Array aus LPDIRECT3DTEXTURE9 Objekten, welches man sortiert und dann einfach rendert? Oder gibt es da spezielle Arten dies umzusetzen? Mein Lösungsweg klingt mir fast zu "einfach"..@hellihjb
klingt interessant, gibt es irgendwelche Dokumentationen zu?
-
personenkult schrieb:
Danke für eure Antworten.
@raspo
Beispiel Directx: ist es dann einfach ein Array aus LPDIRECT3DTEXTURE9 Objekten, welches man sortiert und dann einfach rendert? Oder gibt es da spezielle Arten dies umzusetzen? Mein Lösungsweg klingt mir fast zu "einfach"..kannst du machen. (wozu du sortieren willst und wie bzw wonach, entgeht mir irgendwie).
@hellihjb
klingt interessant, gibt es irgendwelche Dokumentationen zu?punkt 3 ist keine alternative zu 1 und 2, sondern eine andere technik die mit mit den anderen dingen zusammenarbeitet. Ich hab vor (etwa) nem jahrzehnt mal sowas implementieren muessen, dabei wurde eine 81926144 Langkarte gescrollt (hatte ca 192MB und sollte auf einem Win95 rechner mit 64MB Ram und 4MB graka laufen).
das hab ich dann entsprechend offline in 64*48 (128*128)texturen aufgeteilt.
Intern hatte ich 9*7 texturen im speicher (damit man 1024*768 unterstuetzen kann), die waren jenach system 8 oder 16 bit, also <2MB im schlimsten fall.
dann gab es entsprechend ein array mit 6448 eintraegen die erstmal alle ~0 waren. wenn ein tile gerendert werden sollte, dann wurde geprueft of eine gueltige ID drinnen steht, also !=~0, falls ja, konnte man mit ihr in dem array aus 63texturen indizieren, falls nicht, dann wurde die am laengsten nicht benutzte textur genommen und der eintrag im 2D array der auf sie zeigte auf ~0 gesetzt, dafuer hat dann der neue eintrag im 2D array den wir nun zeichnen wollten auf diese textur gesetzt und die textur wurde neu geladen.Damals gab es auch nicht wirklich photorealistische texturen in Spielen, sie waren also gezeichnet und somit nicht so farbenfroh, deswegen hab ich sie mit LZSS gepackt. das reinladen und entpacken lief dann schneller als wenn man sie ungepackt geladen hat. man hatte dann auch nicht soviel platz auf der CD verschwendet.
-
Ok, Punkt 3 klingt mir fast zu spektakulär.
Zu 2.
Mit sortieren meinte ich eigentlich nur "in der richtigen Reihenfolge darstellen". Wie groß sollten die Tiles sein? Ich könnte mir vorstellen, dass zu kleine Tiles das ganze unnötig langsamer machen..
-
Wenn es ein bild ist, ueberlapt doch nichts, oder? dann muss man ja eigentlich auch nicht sortieren.
Die Tilegroesse hab ich damals experimentell rausgefunden. einfachmal ein paar benchmarks machen mit 32*32 bis 512*512.
-
Ok wunderbar, danke für die schnellen Antworten.

-
in anbetracht der groesse deines hintergrundbildes (8000x1000 Pixel) gehe ich davon aus, dass primaer horizontal gescrollt wird. ein vertikales tiling waere daher nicht zwingend notwendig - was dann wieder meinen ausfuehrungen zu "3) man streamed das Bild irgendwie" entspraeche

es ist aber sicher sinnvoll, gleich einen allgemeingueltigen ansatz zu verfolgen.
-
Mir ging es nur darum etwas ordentliches zu nehmen, was größere Bilder zulässt. Ich habe mal irgendwo gelesen, dass es eine max. Größe für Texturen gibt, deshalb die Fragerei.