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

06.02.2011, 12:36

SFML - Sprites in einem Rutsch rendern

Hallo,

ich hab mir ein Partikelsystem mit der SFML gebaut. Funktioniert auch alles wunderbar, allerdings dauert das Rendern der einzelnen Partikel (Sprites) am längsten. Bei wenigen tausend Partikeln ist das ja nicht so schlimm, aber ab 10.000 Partikeln zieht das doch ordentlich runter.
Also, gibt es eine Möglichkeit die Sprites der SFML irgendwie auf einmal zu rendern? Oder irgendeine andere Möglichkeit die Render Performance zu verbessern? Tausende einzelne Draw Calls können ja nicht die Lösung sein..
Im Moment benutze ich SFML 1.6.

lg chaia

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Chaia*« (06.02.2011, 12:42)


2

06.02.2011, 15:18

Für Optimierungsvorschläge solltest du mal einen Codeausschnitt posten. Hast du ein Sprite, dass du 10.000 mal mit unterschiedlichen Koordinaten zeichnest? Oder hast du eine Liste mit einer bestimmten Anzahl Sprites die du dann alle renderst? Mal überlegt ob das überhaupt Sprites sein müssen? Kann es keine Pixel-Manipulation an einem Sprite sein?

Du solltest (wenn du schon an sowas arbeitest) mal überlegen, ob du nich besser auf die SFML 2.0 umsteigst?! Da hast du RenderTargets und kannst erstmal die Sprites auf ein einziges RenderTarget zeichnen und dann nur dieses fertige Sprite auf den Bildschirm rendern.

Gruß
SaRu_

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

06.02.2011, 15:30

Ich kenn die SFML zwar nur grob aus der Doku aber ich denk mit einzelnen Sprite Objekten wird das in der aktuellen 1.6er SFML wohl nicht besser gehen. Afaik unterstützt die SFML 2.0 Batch Rendering und sonst bleibt natürlich noch die Option das z.B. in OpenGL selbst zu schreiben (OpenGL lässt sich afaik ja relativ einfach mit der SFML kombinieren) oder eine andere Library zu verwenden (HGE z.B. bringt offenbar schon Support für Partikelsysteme mit)...

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »dot« (06.02.2011, 15:59)


4

06.02.2011, 16:37

Okay, also hier etwas Code:

C-/C++-Quelltext

1
2
3
4
5
6
iParticle = vParticles.begin(); 
while (iParticle != vParticles.end())
{
     App->Draw ((*iParticle)->Sprite); 
     ++iParticle; 
}


Rendere also ganz einfach jeden Partikel (jeder hat ein Sprite).
Wenn ich auf SFML 2.0 umsteige und RenderTargets nutze, wie werden dann die anderen Dinge gerendert (Hintergrund, andere Objecte etc.)? ganz normal und am Ende dann das RenderTarget noch drauf oder muss ich für die anderen Objecte auch das RenderTarget nutzen?
Gibt es irgendwo ne Changelog von 1.6 -> 2.0? Damit ich weiß was ich ggf. anpassen muss. Ich habe im Moment keins gefunden.
Eine andere Library zu verwenden kommt eher nicht in Frage, da ich dann all die anderen Klassen ebenfalls neu schreiben müsste.
Direkt mit OpenGL habe ich noch keine Erfahrung, wäre es viel Aufwand das selbst zu schreiben?

lg chaia

5

07.02.2011, 17:42

Sry für Doppelpost, aber kann mir jemand seine SFML 2.0 Libs (dlls + stat. libs wenn möglich) + inlclude und doc für VC++ 2010 schicken?
Seit einigen Tagen erreiche ich einige Seiten von Sourceforge bzw. svn.sourceforge nicht -.-
Habe es bereits auf mehreren PCs und verschiedenen Browsern versucht, aber leider ohne Erfolg.
Wäre jemand so nett die Dateien irgendwo hochzuladen?

lg chaia

6

07.02.2011, 18:17

Wenn du den Link von der SFML Website zum SVN-Verzeichnis probiert hast, dann weiß ich was du meinst. Funktioniert anscheind nicht, der Link. Aber die Links drunter (Snapshots) fuktionieren.
Wenn du den Sourcecode aber aus dem SVN willst, dann hier der Link:

svn co https://sfml.svn.sourceforge.net/svnroot/sfml sfml

Funktioniert bei mir problemlos.

Gruß
SaRu_

7

08.02.2011, 20:29

Also ich habe jetzt endlich nach einer Stunde Mühen die SFML 2.0. :D
Beim svn download gabs andauernd unerwartete Fehler, bis ich mir letztendlich die letzten fehlenden Dateien einfach schnell per Copy&Paste geholt habe^^
Das rendern allgemein, also wenn ich jedes Sprite einzeln rendere war schon mal um ca. 100% schneller. Allerdings habe ich das ganze noch etwas verbessert, als ich sah, dass SFML 2.0 RenderImages unterstützt.
Mein PartikelSystem ist so aufgebaut:

unterste Stufe: ein einzelner Partikel
mitte: Emitter & Affectoren

Und das ganze habe ich zusammengefasst in ein ParticleSystem zu welchem Affectoren, Emitter etc. hinzugefügt werden können. Jede ParticleSystem Instanz läuft in einem eigenen Thread. Dieser Thread übernimmt das Updaten und Rendern der Partikel. Der main Thread gibt nur Events ab und rendert am Ende das fertige Image, welches vom Thread fertiggestellt wurde. Das ganze läuft bei 85 FPS & 40.000 Partikeln in 2 Systemen je 20k (also 3 Threads, 1 main, 2 mal ParticleSystem). Dabei haben die ParticleSystem Threads je eine Auslastung von 100% und der Main Thread ~ 30-40% (woher die kommen weiß ich noch nicht wirklich, ich rendere eigentlich nur die beiden fertigen Images (1280x720)). Die GPU hat dabei eine Auslastung von ~25-30% (Memory Controller ~5-15%).
TestSystem war mit PhenomIIX4@3,2GHz und GTX470.

Ich bin jetzt eigentlich zufrieden mit der Performance^^
Das einzig doofe ist jetzt nur noch, dass es dank WINAPI Threads nur auf Windows läuft :S
Wenn jemand will lad ich mal ne kleine Demo hoch.

lg chaia

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

08.02.2011, 20:50

Das einzig doofe ist jetzt nur noch, dass es dank WINAPI Threads nur auf Windows läuft

http://www.sfml-dev.org/documentation/2.…f_1_1Thread.htm ;)

Werbeanzeige