Tile Map mit pyglet

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
Ootmann

Hallo zusammen,

ich habe mir vor kurzem eine Tile Map für pygame gebaut. Grob gesagt wird dabei in jedem Frame das Fenster mit kleinen quadratischen Bildern gepflastert. So weit, so CPU-hungrig.

Inzwischen habe ich auf pyglet gewechselt. Unter Beibehaltung eines Großteils meines Programmcodes wird das Fenster jetzt mit pyglet-sprites gepflastert. Je nach Fenstergröße und Kachelgröße sind das zwischen 1000 und 2000 Tiles, die bei jedem Frame gedrawt werden. Tatsächlich habe ich von pygame zu pyglet auf diese Weise kaum einen Performanceunterschied. Daher frage ich mich, ob es der beste Weg ist, nur für die Map ständig hunderte Sprites darzustellen oder ob man mit pyglet hier einen grundsätzlich anderen (schnelleren) Weg gehen kann.

Kleine Zusatzfrage: Bei pyglet befindet sich, da opengl, die Koordinate 0/0 links unten statt wie bei pygame links oben. Kann man das umstellen, oder sollte ich mich besser damit abfinden?

Viele Grüße und Danke für's Durchlesen
Ootmann
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Du brauchst ein *sinnvolles* Datenmodell! Dieses sollte es *effizient* ermöglichen, diejenigen Map-Ausschnitte in der richtigen Reihenfolge zu liefern, die für den Kartenausschnitt relevant sind. Oder sind es wirklich immer 1000 Tiles, die Du auf den Monitor zauberst? (dann wäre die Tile-Größe ca 1 Pixel :-D )

Nehmen wir mal eine Tile-Größe von 32x32 Pixeln, von mir aus auch 64x64. Du stellst dann von einer Map ja immer nur einen kleinen sichtbaren Bereich dar. Also "blitte" auch nur die Tiles, die zu sehen sind! Dazu kommen dann ggf. noch Layer, so dass man auch noch überlegen muss, welche Tiles denn nun wirklich sichtbar sind. Bei einer isometrischen Engine ist das alles noch ein wenig komplizierter, als bei einer reinen Draufsicht.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Ootmann

Hi Hyperion, vielen Dank für deine Antwort.

Soweit war ich allerdings (glaube ich) schon. Die Gesamtgröße der Map ist z.B. 100x100 Tiles, d.h. 10000 Tiles insgesamt. Davon werden auch nur die gezeichnet, die sichtbar sind. Bei einer Auflösung von z.B. 1280x800 passen bei 32x32 großen Tiles 40x25 auf den Bilschirm. Das sind genau 1000. Wie kommst du auf 1 Pixel?

Viele Grüße, Ootmann
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Oops, ich dachte 1000 x 1000 :oops: Mein Denkfehler.

Tja, dann musst Du uns mal (möglichst lauffähigen) Code zeigen! Ohne das wird es schwer...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Ootmann

Oops, ich dachte 1000 x 1000 :oops: Mein Denkfehler.
Kein Problem :wink:

Hab mein Problem inzwischen auch selbst gelöst. Ein Großteil meiner Map besteht aus Wasser (soll was mit Schiffen werden). Die entsprechenden Kacheln werden jetzt einfach leer gelassen, stattdessen wird im Hintergrund eine Wasseroberfläche (TileableTexture) gezeichnet. Dabei ist mir übrigens auch aufgefallen, dass pyglet in Version 1.2 (leider noch alpha) noch 'ne Ecke schneller ist als die 1.1er. Jetzt bekomme ich an die 60 fps auf meiner Map :D

Viele Grüße, Ootmann
Antworten