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

Kronos

Frischling

  • »Kronos« ist der Autor dieses Themas

Beiträge: 19

Beruf: Informatik Student

  • Private Nachricht senden

1

26.07.2015, 11:46

Wie verwaltet man eine große Menge zufälliger Spielelemente effizient?

Hallo,
ich frage mich schon seit längerer Zeit wie es Spiele, wie Minecraft oder Don't Starve schaffen eine so große Menge an Spielobjekten zu managen. Ich weiß, dass sie prozedural erzeugt wurden, aber wie halte ich meine Objekte gering, damit ich keine ArrayList von 1 Mio. Einträgen bei jedem Update durchlaufen muss?
Ich arbeite gerade an einem 2D Weltraum "Spiel" (s. anderer Thread) bei dem man in die linke und rechte Richtung jeweil endlos laufen kann. Dabei sollen im Hintergrund Sterne angezeigt werden, die von einem Seed zufällig erzeugt werden. Wenn sie nicht mehr in Sichtweite sind, sollen sie gelöscht werden, damit die Liste klein bleibt. Doch wenn ich wieder zurück fliege, möchte ich diesselben Sterne an dieser Stelle wiederfinden.
Ich sehe da einen großen zusammenhang, deshalb die Frage.
Freue mich auf eure Antworten.
Liebe Grüße, Kronos

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

2

26.07.2015, 11:56

Na die Grundidee ist relativ simpel: Stelle nur dar und berechne, was du siehst. Den Rest muss man dann einfach im RAM halten, aber in separaten Listen pflegen und für die Anzeige "bereithalten". Wenn du allerdings so viele Daten hast, dass die nicht mehr in den RAM passen (wie bei Minecraft), dann musst du anfangen die Daten auf die Festplatte auszulagern. Also hast du dann drei Stufen: Sichtbare Daten, vorgehaltene Daten, Persistente Daten. Wenn du dich durch den Raum bewegst, werden diese drei Bereiche jeweils aktualisiert. Das ist dann auch nicht mehr ganz so einfach zu berechnen.
Zusätzlich spielt das Rendering noch eine Rolle, da ist das Zauberwort "Dynamic Batching" ;)

edge

Frischling

  • Private Nachricht senden

3

26.07.2015, 11:58

Hi,

schau Dir mal das Flyweight-Design-Pattern an. Hier zum Beispiel:
http://gameprogrammingpatterns.com/flyweight.html

Grüße

Superwayne

Treue Seele

Beiträge: 242

Beruf: Student & App Entwickler (Xamarin)

  • Private Nachricht senden

4

26.07.2015, 13:50

In deinem Spezialfall wäre vielleicht ein deterministischer Zufallsgenerator angebracht. D.h. du hast einen Seed und anhand dessen wird an Stelle x/y immer ein bestimmtes Objekt erzeugt. Damit brauchst du überhaupt keine Objekte verwalten, da diese bei jedem Aufruf an der selben Stelle neu erzeugt werden. Das macht natürlich nur bei Objekten Sinn, die nicht ewig initialisiert werden müssen.

m3xx

Alter Hase

Beiträge: 434

Beruf: Student

  • Private Nachricht senden

5

26.07.2015, 13:55

In deinem Spezialfall wäre vielleicht ein deterministischer Zufallsgenerator angebracht. D.h. du hast einen Seed und anhand dessen wird an Stelle x/y immer ein bestimmtes Objekt erzeugt. Damit brauchst du überhaupt keine Objekte verwalten, da diese bei jedem Aufruf an der selben Stelle neu erzeugt werden. Das macht natürlich nur bei Objekten Sinn, die nicht ewig initialisiert werden müssen.

Hat aber eine Problematik. Beispiel Minecraft: Was ist, wenn du Blöcke platzierst/abbaust etc.? Dann funktioniert das Ganze nicht mehr so schön und du musst ein Management für das Ganze einpflegen

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

6

26.07.2015, 14:25

Pooling mit zwei Listen wäre eine Möglichkeit.
Wenn ein Objekt nicht mehr sichtbar ist (evt. + festgelegter Abstand) wird es in eine andere Liste verschoben. Das spart dann Zeit beim updaten der anderen sichtbaren Objekte.
Um zu prüfen ob ein Objekt wieder sichtbar wird kann man dann festlegen wie oft dies geprüft wird, z.B. 1x die Sekunde. Oder man durchläuft nicht die ganze Liste in jedem Frame sondern nur einen Teil und macht beim nächsten Frame an der Stelle weiter.
Ich denke für dein Spiel ist das aber recht irrelevant, so viele Objekte wirst du nicht im Speicher haben. Lediglich den Sichtbarkeitstest solltest du durchführen.

Superwayne

Treue Seele

Beiträge: 242

Beruf: Student & App Entwickler (Xamarin)

  • Private Nachricht senden

7

26.07.2015, 14:59

In deinem Spezialfall wäre vielleicht ein deterministischer Zufallsgenerator angebracht. D.h. du hast einen Seed und anhand dessen wird an Stelle x/y immer ein bestimmtes Objekt erzeugt. Damit brauchst du überhaupt keine Objekte verwalten, da diese bei jedem Aufruf an der selben Stelle neu erzeugt werden. Das macht natürlich nur bei Objekten Sinn, die nicht ewig initialisiert werden müssen.

Hat aber eine Problematik. Beispiel Minecraft: Was ist, wenn du Blöcke platzierst/abbaust etc.? Dann funktioniert das Ganze nicht mehr so schön und du musst ein Management für das Ganze einpflegen


Deshalb sage ich ja in seinem Spezielfall. Er wollte nur Sterne als Hintergrund, nichts zum Abbauen/Platzieren.

Werbeanzeige