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

kiba

Alter Hase

  • »kiba« ist der Autor dieses Themas

Beiträge: 327

Wohnort: NRW

Beruf: Azubi: Fach-Info. Anw.

  • Private Nachricht senden

1

16.07.2009, 14:44

Performencetipps für 2D-OpenGL?

Hey könnte ihr mir paar Tipps geben wie man 2D Grafiken besser render kann.
Verwende noch das alte glVertex3f und es gibt bestimmt noch besseres.
Bei 2D ist das zwar nur eine Quadrat denn man da Render aber vll geht es noch etwas schneller, wenn man z.b. große oderviele kleine Grafiken hat.
Hab noch von glDrawArrays gehört weiß aber nicht ob das etwas schneller ist
wenn man nur eine Quadrat zeichen will.
Und wie sieht es den bei Qudratischen Grafiken aus,
wenn ich eine Grafik hat die 1000x500 groß ist aber optimal wäre eine Quadratische Grafik als noch was (tranperents Pixel)hinzufügen -> 1000x1000.
Dann könnte man den Rest wieder mit glTexCorrd abschneide und es wäre genauso schnell wie 1000x500?

ps. meine render Funktion besteht nicht nur aus glbegin-glEnd sonder da müssen ja noch z.b. die texcoord berechnet werden,glTranslated,glRotatef werden noch aufgerufen,überprüft ob die Grafik sich im Anzeige Bereich befindet...

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

2

16.07.2009, 15:06

zauberwort lautet batching:

möglichst viel in einem rutsch mit möglichst wenigen state-changes.^^ und wenn die textur etwas größer ist und dafür 2^n macht das nüscht^^

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

3

16.07.2009, 16:18

Zitat

tzetxuir

:shock: :roll: :lol:

Bist du mit dem Kopf auf die Tastatur geknallt? xD

@kiba
Wenn du keine Rotation brauchst, (oder nicht in alle Dimensionen), dann kannst du da auch etwas mit einem Shader machen so dass du keine Matrizen für die Transformationen brauchst, sondern vlt. nur einen Vektor für die Position. Das spart dann auch eine Menge Overhead.

4

16.07.2009, 17:12

Also am besten sind vertexBufferObjects, bei sehr dynamsichen Daten könnten aber VertexArrays evtl. ähnlich schnell sein.
Wie schon erwähnt es ist wichtig, möglichst viel zusammen zu zeichnen, wenn du also z.b. ne Tilemap machst, solltest du das komplette Raster in nem VertexBuffer haben und dann in einem Rutsch rendern.
Lieber dumm fragen, als dumm bleiben!

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

5

16.07.2009, 20:30

Zitat von »"drakon"«

Zitat

tzetxuir

:shock: :roll: :lol:

Bist du mit dem Kopf auf die Tastatur geknallt? xD


ne nennt man zwei-faust-tipp-methode da geht mal was daneben :D (habs korrigiert ;))

kiba

Alter Hase

  • »kiba« ist der Autor dieses Themas

Beiträge: 327

Wohnort: NRW

Beruf: Azubi: Fach-Info. Anw.

  • Private Nachricht senden

6

16.07.2009, 22:39

Naja da zu könnte man so was wie eine ArraySprite Klasse machen und darin dann sowas wie glDrawArrays benutzen(wenn man nur eine Textur benutzt z.b. eine Tileset mit einer Tilemap).
Aber wie sieht es mit einfachen Spritern aus.
Z.b. wie sieht es mit glCullFace aus, würde das den was bringen und was ist wenn man die Grafik auch um die x und y Achse drehen kann?

Wie kann man den C++ vector mit den glDrawArrays benutzen?

Ist den glDrawArrays wirklich schneller als wenn man jetzt glVertex benutz nur um eine Rechteck zu zeichnen?

7

16.07.2009, 23:53

Wenn du mit DrawArray nur ein einzelnes Dreieck zeichnest nicht. Der Witz dabei ist, dass man damit auf einen Schlag enorm viele Zeichnen kann, ohne zig Funktionen aufzurufen.
Lieber dumm fragen, als dumm bleiben!

xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

8

17.07.2009, 00:29

Wenn du viele kleine Sprites rendern möchtest dürftest du mehr performance raus kriegen indem du mehrere Sprites in einer Textur zusammen fasst und immer nur Ausschnitte dieser Textur renderst.

So kannst du mit einer Textur gleich mehrere verschiedene Sprites rendern, und dort wieder mit Batching über glDrawArray arbeiten.

Vermutlich ist es sinnvoll alle deine Sprites in einem Manager zu verwalten, die Sprites in Listen/Arrays nach verwendeter Textur getrennt speichert.

Sonderlich viel Erfahrung mit der Performance habe ich da jedoch nicht, wäre schön, wenn jemand Erfahreneres noch ein, zwei Sätze dazu sagen könnte.

PS: Hast du ein Performance Problem? Wenn dein Spiel auch auf betagteren Rechnern prima läuft würde ich mir da nicht allzuviel Energie reinstecken. Schneller und effizienter geht es irgendwo immer, aber oft braucht man das einfach nicht.

Toa

Alter Hase

Beiträge: 944

Beruf: Research associate

  • Private Nachricht senden

9

17.07.2009, 13:28

Zitat von »"Jonathan_Klein"«

Wenn du mit DrawArray nur ein einzelnes Dreieck zeichnest nicht. Der Witz dabei ist, dass man damit auf einen Schlag enorm viele Zeichnen kann, ohne zig Funktionen aufzurufen.


vorallem wenn man sich mal vor Augen führt was eigentlich bei einem Funktionsaufruf alles passiert.

1.Adresse im Befehlszeiger inkrementieren, wird auf Stack abgelegt
Platz für den Rückgabetyp schaffen
2.Funktionsbefehladresse aus Codebereich in Befehlszeiger laden
Spitze des Stack wird festgehalten und Platz für Argumente geschaffen
Funktion wird abgearbeitet
3.Lokale Variablen laden auf dem Stack
4.Bei Rückkehr Variable in den leeren Bereich schreiben und Stack auflösen
5.Punkt 1 Adresse ermitteln und in Befehlszeiger schreiben
6.Programmablauf fortsetzen

Also, da kann man schon performence mäßig was rausholen^^ Sollte nur so ein btw sein :D

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

10

17.07.2009, 13:30

Zitat von »"Toa"«

Zitat von »"Jonathan_Klein"«

Wenn du mit DrawArray nur ein einzelnes Dreieck zeichnest nicht. Der Witz dabei ist, dass man damit auf einen Schlag enorm viele Zeichnen kann, ohne zig Funktionen aufzurufen.


vorallem wenn man sich mal vor Augen führt was eigentlich bei einem Funktionsaufruf alles passiert.

1.Adresse im Befehlszeiger inkrementieren, wird auf Stack abgelegt
Platz für den Rückgabetyp schaffen
2.Funktionsbefehladresse aus Codebereich in Befehlszeiger laden
Spitze des Stack wird festgehalten und Platz für Argumente geschaffen
Funktion wird abgearbeitet
3.Lokale Variablen laden auf dem Stack
4.Bei Rückkehr Variable in den leeren Bereich schreiben und Stack auflösen
5.Punkt 1 Adresse ermitteln und in Befehlszeiger schreiben
6.Programmablauf fortsetzen

Also, da kann man schon performence mäßig was rausholen^^ Sollte nur so ein btw sein :D


Funktionsaufrufe machen dabei nur nicht wirklich was aus. ;)

Werbeanzeige