Autor Beitrag
Florian H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 52

Win XP
D6 Pro
BeitragVerfasst: Sa 22.11.03 22:56 
Hi,

ich muss bei einem Spiel, welches ich gerade mache in DelphiX einen großen Teil (ca. 75%) des Bildes fast nie neu zeichnen.
Diese 75% bestehen zudem auch noch aus sehr vielen kleinen Quadraten, also überdurchschnittlich viel Aufwand für den Rechner...

Die 25% die dauernd neu gezeichnet werden sollen sind eigentlich der harmlose Teil.
Trotzdem zeichne ich bisher alles bei jedem Frame neu --> Framerate zu niedrig

Wie kann ich es jetzt anstellen, dass ich das optimiert bekomme?
Kann ich sowas wie 2 Ebenen machen?, wovon nur die 2. immer verändert wird, die 1 nur einmal gezeichnet werden muss??

Oder bringt es was wenn ich die 75% auf ein TImage oder so zeichne und das dann immer direkt an DelphiX übergebe, sodass nur 1 mal die kleinen Sachen gezeichnet werden und dann jedesmal halt alles zusammen?


Viele Grüße
Florian H
Da_Knuddelbaer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 485



BeitragVerfasst: So 23.11.03 11:28 
Hi,

zuerst muss ich dazu sagen, dass du aus DelphiX, auch wenn es nicht unbedingt so aussieht, noch seeeeehr seeehr viel Performance rausholen. Wenn ich da so an mein BOmberMan denke, hatte ich zu Anfang mit weniger Sprites 12fps, heute mit mehr als doppelt so vielen Sprites 100fps und höher.

Wenn du Kollisionen abfragst, würde ich versuchen diese als erstes einzudämmen. Versuche Kollisionsabfragen, die du auch bei anderen Sprites einbauen könntest, umzuschreiben und damit für diese anderen Sprites die Abfragen zu reduzieren. Je weniger Sprites DelphiX berechnen muss was die Kollisionen angeht, desto besser.

Wenn du absolut keine Kollisionen hast, dann müsstest du so an die (schätzungsweise) 300-500 Sprites haben?

Natürlich kannst du es auch mit deiner Ebenen-Theorie machen, sollte ganz gut klappen. Die SpriteEngine an sich bietet sowas nicht an. Hast du bereits eine Fläche von Sprites als Hintergrund deklariert (wird nie aktualisiert)?
Und versuche mal per Z-Angabe die Ebene zu wechseln. Wenn du 2 Sprites A und B hast, A hat ein Z von 1 und B ein Z von 2, dann liegt B über A. So kannst du Ebenen erstellen. Erst den Hintergrund, dann wahlfreie Ebenen.

Wie gesagt, wenn du nicht mehr als 300-500 Sprites hast, dann liegen die tiefen Frames net unbedingt daran... hast du denn überhaupt Kollisionsabfragen?

Gruß,
Knuddelbaer
Florian H Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 52

Win XP
D6 Pro
BeitragVerfasst: So 23.11.03 11:53 
Hi,

ich benutze die Spriteengine nicht, sondern zeichen direkt mit dxImageList1.items[x].draw oder sowas auf das Surface...

Das game ist ein Jump&Run, in dem die ebenen oder plattformen auf denen der spieler steht so 20x20pixel große kästchen sind, die immer gezeichnet werden.
das sind im schnitt so 70-80 pro level...

Kollisionsabfragen mache ich ohne delphiX direkt, ich habe die positionen von allen sachen in arrays gespeichert und vergleiche das dann...


Die niedrigen frames liegen auch definitiv an den vielen kleinen Kästchen, wenn ich die nicht zeichnen lasse, habe ich optimale Frameraten...

Wie kann ich das mit dem Z-Buffer wechseln?
Bzw. irgendwie halt den hintergrund...
habe schon vieles probiert, komme aber nicht weiter...
Da_Knuddelbaer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 485



BeitragVerfasst: So 23.11.03 12:11 
Hmm, wozu gibt es bei DelphiX denn extra die SpriteEngine und die Kollisionsabfrage? :lol: mit 70-80 Sprites kommt die ohne Probleme zurecht.

Jetzt verstehe ich dien Problem erst auch richtig:
Ohne die SpriteEngine ist es natürlich ein hübscher Aufwand das alles zu optimieren.

Hmm, ja, aber wenn du die SpriteEngine eh net verwendest, dann kannst du doch mit dem Timer angeben, welche Sprites nochmal gezeichnet werden sollen und welche nicht. Müsstest halt vllt in deinem Array oder sonst wo speichern welche es sind etc...
Florian H Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 52

Win XP
D6 Pro
BeitragVerfasst: So 23.11.03 12:36 
Hm, ich kann mir ja mal die Spriteengine angucken, villeicht wird es ja besser...
Aber es sind ja fixe Sachen, also nix was animiert oder bewegt wird...

Da ich aber z.B. über den Hintergrund etwas zeichne, muss ich den ja beim nächsten durchlauf wieder zeichnen, um das, was bisher drauf war, zu löschen, weil sich das bild verändert hat. Sonst würde das ja eine Spur nach sich ziehen, wenn nix mehr übermalt wird...

Deshalb dachte ich an 2. Ebene, die ich einfach lösche ohne den hintergrund (die 1. ebene) zu beeinflussen oder neu zeichnen zu müssen...
Da_Knuddelbaer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 485



BeitragVerfasst: So 23.11.03 12:39 
Eben dafür sorgt die SpriteEngine :lol:
Florian H Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 52

Win XP
D6 Pro
BeitragVerfasst: So 23.11.03 13:13 
Na gut, dann gucke ich mir das mal an :)
Danke!

Eine Frage noch: Wie kann ich, wenn ich viele versch. Sprites habe, die erzeugen und unterschiedliche Bilder zuweisen?
Florian H Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 52

Win XP
D6 Pro
BeitragVerfasst: So 23.11.03 13:20 
OK hat sicher erledigt :)

Ich lasse jetzt alles (!) von 1 Spriteengine zeichnen, macht die jetzt automatisch alles richtig?

grüße
flo
Da_Knuddelbaer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 485



BeitragVerfasst: So 23.11.03 20:34 
Normalerweise macht sie alles richtig. Du kannst noch ein bischen Feintuning machen, indem du per Source-code ein paar kleinere Einstellungen änderst, es wird aber im Spielverlauf selber nicht wirklich tolle oder merkbare Änderungen hervorrufen...

Und erm, ja nu, erstellste halt verschiedene Sprite-Klassen, dann flutscht das :wink: