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

Toa

Alter Hase

Beiträge: 944

Beruf: Research associate

  • Private Nachricht senden

11

17.07.2009, 13:32

Kleinvieh macht auch mist^^

Das ist wie alle immer sagen nein inline bei Set und Get bringt erst was bei 30.000 Aufrufen was xD

Wenn man aber auf alles achtet kommt am Ende schon etwas mehr raus..

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

12

17.07.2009, 13:38

Zitat von »"Toa"«

Kleinvieh macht auch mist^^

Das ist wie alle immer sagen nein inline bei Set und Get bringt erst was bei 30.000 Aufrufen was xD

Wenn man aber auf alles achtet kommt am Ende schon etwas mehr raus..


Klar macht es was aus, aber man sollte das ganze relativieren. Während das batchen enorm viel bringt, ist diese Optimierung einfach unnötig. Mir würde nie einfallen weniger Funktionen zu machen aus Angst, dass sie zu viel Overhead erzeugen. Falls es wirklich an dem Funktionsaufruf liegt, dann passe ich das halt irgendwie an, aber nicht vorher.

Man implementiert lieber ein gescheites System, welches halt mehr Funktionsaufrufe hat, aber halt die API Aufrufe so gut, wie möglich macht. Das bringt enorm viel mehr.

kiba

Alter Hase

  • »kiba« ist der Autor dieses Themas

Beiträge: 327

Wohnort: NRW

Beruf: Azubi: Fach-Info. Anw.

  • Private Nachricht senden

13

19.07.2009, 18:55

Hi hab da noch eine frage da man ja bei jeden Sprite die Position neu setzen muss oder es Drehen muss muss man ja die immer wieder das aufrfen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
glLoadIdentity();
   glTranslated(this->x+(static_cast<double>(srect.width)*this->zoom_x/2.0f),
                  this->y+(static_cast<double>(srect.height)*this->zoom_y/2.0f),
                  this->z);
   glRotatef(this->angle_x,1.0f,0.0f,0.0f);
   glRotatef(this->angle_y,0.0f,1.0f,0.0f);
   glRotatef(this->angle_z,0.0f,0.0f,1.0f);
   glTranslated((static_cast<double>(srect.width)*this->zoom_x/2.0f)*-1.0f,
                  (static_cast<double>(srect.height)*this->zoom_y/2.0f)*-1.0f,
                  0.0f);
   glScaled(this->zoom_x,this->zoom_y,0.0f);

Wie kann ich das ganze den im gldrawarrays machen sonst lohnt sich die Optimierung ja nicht.
Man bräuchte doch nur irgetwie die Positionene so berechnene als würde man die vertex drehen und das mit den zoom kann man doch in die width und height der vertex berechnen.

ChrisJ

Alter Hase

Beiträge: 487

Wohnort: Schweich

Beruf: Schüler

  • Private Nachricht senden

14

20.07.2009, 19:59

Zitat von »"kiba"«


Wie kann ich das ganze den im gldrawarrays machen sonst lohnt sich die Optimierung ja nicht.

die ganzen opengl matrix operationen sind sehr schnell ...

Zitat von »"kiba"«


Man bräuchte doch nur irgetwie die Positionene so berechnene als würde man die vertex drehen und das mit den zoom kann man doch in die width und height der vertex berechnen.

... und gerade weil die so schnell sind, sollte man sie auch nutzen.
falls aber gerade die matrixoperationen der bottleneck deines programms sein sollten, kannst du die auch noch in eine displaylist packen. =)
"Don't trust your eyes: They are a hell of a lot smarter than you are"

xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

15

20.07.2009, 20:38

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

Ich glaube die Funktionsaufrufe machen dabei eher weniger aus. Man spart durch DrawArray eher dadurch, dass sich das ganze treibermäßig wesentlich effizienter implementieren lässt, und man mittels Buffer Objects die Geometriedaten direkt im Grafikkartenspeicher ablegen kann ohne sie jedes mal neu zu übertragen.

Werbeanzeige