SDL Performence Probleme
-
Hi !
Ich bin gerade ein kleines Spielchen mit SDL am programmieren. Es soll ein einfaches Jump 'n Run werden mit Weltenkarte. Der Renderer für die Weltkarte bin ich gerade am schreiben. Leider leidet mein Programm an unglaublich niedriger Performence.
Ich erkläre mal kurz wie es funktioniert:
Ebene0: Hintergrundgrafik (1280 x 800 pixel)
Ebene1: Untere Animatinen ( transparent, erscheinen hinter der Spielfigur)
Ebene2: Spielfigur
Ebene3: obere Animatinen ( transparent)
Ebene4: Nebel/Regen ( transparent)Okay da Ebenen 1 bis 4 transparent sein können muss ich jedesmal die Hintergrundgrafik neu zeichnen. Was empfindlich viel Zeit kostet. Jedenfalls komme ich so auf keine ordentliche Framerate. Lasse ich nur die Hintergrundgrafik weg, steigert sich die Leistung erheblich.
Die Frage ist:
- Weiso so lahm ?
- besser mit Hardwarebeschleunigung ??
- andere Vorschläge ?
Afaik arbeitet SuperTux ( auch SDL ) ohne Hardwarebeschleunigung und da läuft alles ziemlich flüssig.
thx
Tom
-
hast du alle geladenen bitmaps mit SDL_DisplayFormat (SDL_DisplayFormatAlpha) konvertiert?
-
Okay da Ebenen 1 bis 4 transparent sein können muss ich jedesmal die Hintergrundgrafik neu zeichnen. Was empfindlich viel Zeit kostet. Jedenfalls komme ich so auf keine ordentliche Framerate...
Ich kenn mich zwar nicht mit SDL aus, aber erkläre mir mal warum du den Hintergrund immer neuzeichnen musst, nur weil die darüberliegenden Ebenen Transparent sind ?
Wenn du alles der Reihenfolge nach renderst dürfte das doch kein Problem darstellen
-
Okay ich habe die Funktion nun mal nur mit der Hintergundgrafik aufgerufen und dabei eine Verdopplung auf sage und schreibe 13 FpS hinbekommen, was immer noch zu langsam ist.
Apropos die Grafiken werden als PNG geladen (denke mal kaum, dass das irgendwas ausmacht).
Kann ich eine noch größere Steigerung erwarten wenn ich die Animationen auch konvertiere (bzw alle Grafiken) ??
@Cpp_Junky
Ich bin mir nicht sicher ob ich Deine Frage richtig verstanden habe. Aber wenn ich eine tranparente Animation habe, und diese neu zeichne dann ist die Vorgängergrafik noch zu sehen deshalb muss ich egal ob transparent oder nicht auf jeden Fall neu zeichnen, sonst sieht das nämlich ziemlich schlecht aus.
-
Du musst ja nicht immer den ganzen Bildschirm neuzeichen sondern kannst eben einfach nur bestimmte Bereiche neuzeichnenlassen wenn es nötig ist.
-
Ja, das weiß ich aber es soll auch so funktionieren.
-
tom07 schrieb:
Kann ich eine noch größere Steigerung erwarten wenn ich die Animationen auch konvertiere (bzw alle Grafiken) ??
machs doch einfach
und ja, mit _allen_ grafiken...
-
5 * 1280 * 800 * 4 Byte per CPU? Und das gibt keine ordentliche Framerate? Sowas aber auch.
Bye, TGGC (Ein Jahr Helden)
-
Hallo Tommy,
Also wenn du mal ansatzweise denen Code zeigen würdest, könnte man vielleicht etwas mehr sagen.Der normale SDL-DisplayMode bedeutet grafik über die WinAPI - egal was du machst, es ist langsam. Nutze nach Möglichkeit DirectX. Die Befehle bleiben gleich (das übernimmt die SDL) aber die Geschwindigkeit steigt..
Dann schreibe nicht in Surfaces, die müssen vom RAM über den BUS zur CPU ind die Grafikkarte geschrieben werden bis sie dargestellt werden können und bei 1280 * 800 mit 5 Ebenen und 5 Byte transportierst du 20.480.000 Byte pro Bild, also mal eben 20MB Daten.. Das ist in Ungefähr der Brockhaus komplett ohne Bilder..
-
DocJunioR schrieb:
Hallo Tommy,
1280 * 800 mit 5 Ebenen und 5 Byte transportierst du 20.480.000 Byte pro Bild, also mal eben 20MB Daten.. Das ist in Ungefähr der Brockhaus komplett ohne Bilder..ja, mehr als 100fps wirst du da nur schwer bekommen.
rapso->greets();
-
100 fps? naja, 10 würd ich noch gelten lassen.. Wie gesagt, mit Quellcode könnte man mehr dazu sagen..
-
DocJunioR schrieb:
100 fps? naja, 10 würd ich noch gelten lassen.. Wie gesagt, mit Quellcode könnte man mehr dazu sagen..
ich hingegen würde 100fps sagen, je nach system könnten es auch nur ca 50sein, aber dann dürfte man schon bei DDR266 speicher angelangt sein der dann nur 1.1GB effektiv rüberschauffeln kann.
rapso->greets();
-
Naaja, wenn denn das System nichts weiter tu würde, aber der BUS wird ständig von irgendwelchem Müll belagert..
-
DocJunioR schrieb:
Der normale SDL-DisplayMode bedeutet grafik über die WinAPI - egal was du machst, es ist langsam. Nutze nach Möglichkeit DirectX. Die Befehle bleiben gleich (das übernimmt die SDL) aber die Geschwindigkeit steigt..
Dann schreibe nicht in Surfaces, die müssen vom RAM über den BUS zur CPU ind die Grafikkarte geschrieben werden bis sie dargestellt werden können und bei 1280 * 800 mit 5 Ebenen und 5 Byte transportierst du 20.480.000 Byte pro Bild, also mal eben 20MB Daten.. Das ist in Ungefähr der Brockhaus komplett ohne Bilder..Also zunächst mal arbeite ich nicht mit Windows. Allerdings habe ich eine Frage: in was soll ich denn schreiben wenn nicht in Surfaces ?