Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

28.03.2011, 16:48

(SFML) Sprite/Image Verwaltung bei 10k x 10k Maps?

Hallo liebe Community,
Da ich mit Autoit(Scriptsprache) und GDI+ ein wenig vorbelastet bin, mach ich mir seeeeehr gründlich Gedanken wie ich am besten und schnellsten Die Sprites auf den Screen bekomme.
Das wird jeddoch erst bei rießigen Maps mit vielen Sprites (meiner Meinung nach) ein Problem.

Ein Beispiel wäre eine 10.000x10.000 Pixel große Map mit vielen unterschiedlich großen Sprites.

Meine Lösungsvorschläge wären:
  1. Ein Offscreen-Image mit der Größe der Map, auf das vor Spielbeginn alle Sprites gezeichnet werden und später über die Sprite-Methode "SetSubrect(sf::Rect)" immer angepasst und gezeichnet wird. (aber ob das viel Speicher frisst?)
  2. Die zu zeichnenden Sprites werden alle mit Image erzeugt und danach in einer 3D-Array gespeichert. Diese sieht so aus:

    C-/C++-Quelltext

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    sf::Sprite Map[9][9][50]
    // Die ersten 2 Dimensionen sind für die X u. Y-Position der "Quadranten" da, die die Map in 10x10 Quadrate teilt
    // Die letzte Dimmension ist für die Sprites vorgesehen, die in dem "Quadrant" sind
    Map[0][0][0].SetImage("sprite1") ; Map[0][0][0].SetPosition(20,500) ;
    Map[0][0][1].SetImage("sprite2") ; Map[0][0][0].SetPosition(900,900) 
    // Das Sprite ist von der Weite außerhalb des ersten Quadranten (1100 > 10.000/10), somit also im 2. Q.
    Map[1][0][0].SetImage("sprite3") ; Map[0][0][0].SetPosition(1100,300) ;
    
    Map[1][2][0].SetImage("sprite4") ; Map[0][0][0].SetPosition(1100,3400) ;
    Das würde mir eine Art "Tile"-Map ermöglichen und immer nur die Sprites zeichnen die sich in dem gerade zu sehenden "Quadranten=Tiles" befinden.
  3. Eine Array mit allen Sprites, die Durchgearbeitet wird und geschaut wird welches Sprite sichtbar ist (ist meiner Meinung nach dümmer als 2.)
  4. Euere Vorschläge!
Wird eigentlich beim Übergeben eines Images an ein Sprite (SetImage) das Image kopiert oder ist das nur ein Zeiger?
Ist es ratsam die Sprites und Images vor Spielbeginn alle zu laden und zu erzeugen oder ist es besser wärend dem Spiel nachzuladen?

Ich freue mich auf eure Hilfe
Grüße Faweyr

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

28.03.2011, 16:53

Derart große Maps würd ich in kleinere Teile hacken und immer nur den aktuellen und vielleicht alle daran grenzenden Bereiche (Nachbarn, Zielbereiche von Teleports, was auch immer) im Speicher halten. Wenn deine Tiles in einem regelmäßigen Gitter angeordnet sind ist es relativ einfach rauszufinden welche sichtbar sind und welche nicht und dann auch nur die zu zeichnen (alle 10kx10k Tiles werden wohl kaum immer sichtbar sein!?)...

3

28.03.2011, 17:03

Wie ich geschrieben habe, handelt es sich um unregelmäßige Abstände zwischen den Sprites, dies könnte ich ja mit meinen Vorschlägen lösen, nur ist die Frage, welche klüger ist, oder ob es noch weitere Ideen gibt.

Du meinst also, ich sollte immer nur die (bald) sichtbaren Sprites laden und erzeugen und danach wieder freigeben?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

28.03.2011, 17:55

Oh, 10kx10k Pixel groß, sry hab ich falsch verstanden. Grundsätzlich läufts eben einfach mal auf die Frage raus: Wieviele Sprites wirst du den so haben?

5

28.03.2011, 18:58

Naja, in dem aktuellen Spiel würde ich insgesamt mit 5000 Sprites aufwärts rechnen. Jeddoch möchte ich gleich ein gutes Mapsystem programmieren. Zum einen aus Interresse und zum anderen um es später auch verwenden zu können!

6

28.03.2011, 20:32

Sind denn deine 5000 Sprites alle beweglich?
Sonst könntest du sie sozusagen mit einer ID versehen, in welchem Feld sie liegen.
Du zeichnest dann eben immer nur die Sprites mit den IDs, die gerade im Blick sind.
Wie groß ein ID-Feld ist musst du ausprobieren, es sollte nicht zu groß sein, sonst zeichnest du zu viele überflüssige, aber zu kleine Felder sind auch schlecht.
Die einzelnen ID-Felder speicherst du dann z.B. in einem Vector aus den ID Feldern, welche einen Vector/Array/Liste der Sprites enthalten.

lg chaia

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

7

29.03.2011, 12:52

Ich denke auch Chaia*'s Idee ist gut geeignet. Große Maps sollte man möglichst in kleinere Partitionen einteilen. Diese haben dann alle Informationen über das, was passieren soll. Zum Beispiel irgendwelche Update Funktionen bzw. oder halt wie in diesem Fall Grafiken rendern.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Stazer

Alter Hase

Beiträge: 468

Wohnort: Berlin

Beruf: Student

  • Private Nachricht senden

8

29.03.2011, 18:01

Also endweder machst du das so wie bei den Pokemon RPG's oder du lässt nur die Bilder rendern ,
die im Blick sind.

MfG Stazer

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

9

30.03.2011, 16:13

Also endweder machst du das so wie bei den Pokemon RPG's

wie machen sie es in den Pokemon RPGs?
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

10

30.03.2011, 20:22

@ Chaia: Oho, das hat wohl Ähnlichkeit mit meinem 2. Vorschlag.
@ Stazer: Nein wirklich....Danke :D

Also gut, werd nun meinen 2. Lösungsvorschlag nehmen!
Den Sourcecode werde ich bald posten!

Werbeanzeige