OpenGL, Erwartungswert fps

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

OpenGL, Erwartungswert fps

Beitrag von Scotty »

Ich zeichne per OpenGL 21^3 Würfel. Unabhängig von Farben und Texturen bekomme ich nur rund 2 fps hin (GTX260, kompiliert für gtk2; win32/win64 ist angeblich ähnlich). Ich zähle mit 6 (Würfelseiten) x 2 Dreiecke x 21 x 21 x 21 insgesamt rund 100k Polygone. Ist das zu viel? Hat jemand eine Idee, wie sich das beschleunigen lässt?

Das Ergebnis soll weiterhin so aussehen: http://www.scrabble-blog.de/wp-content/ ... le2844.jpg" onclick="window.open(this.href);return false;

Code: Alles auswählen

glDisable(GL_TEXTURE_2D);
glDisable(GL_LIGHTING);
glDisable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glEnable(GL_BLEND);
 
fb2:=FBoardSize/2;
for x:=0 to FBoardSize-1 do
 for y:=0 to FBoardSize-1 do
  for z:=0 to FBoardSize-1 do
begin
  glPushMatrix;
  //position
  glTranslatef(x-fb2,y-fb2,z-fb2);
  //color
  if assigned(FOnGetFieldType) then
    ConvertColor(FOnGetFieldType(x,FBoardSize-y-1,FBoardSize-z-1,a),r,g,b);
  //add to list if letter or draw blended
  if assigned(FOnGetFieldLetter) then
    aLetter:=FOnGetFieldLetter(x,FBoardSize-y-1,FBoardSize-z-1);
  if aLetter<>nil then
    aList.Add(aLetter) else
  begin
    glColor4f(r,g,b,a*(FTransparency/MaxTransparency));
    glCallList(Cube);
  end;
  glPopMatrix;
end;
 
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glEnable(GL_TEXTURE_2D);
glEnable(GL_LIGHTING);
glCullFace(GL_BACK);
for x:=0 to aList.Count-1 do
begin
  glPushMatrix;
  glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,TextureSize,TextureSize,0,GL_RGB,GL_UNSIGNED_BYTE,GetTexture(TLetter(aList.Items[x])));
  glPopMatrix;
end;

Code: Alles auswählen

Cube:=glGenLists(1);
  glNewList(Cube, GL_COMPILE);
   glBegin(GL_QUADS);
    {Front Face}
    glNormal3f( 0.0, 0.0, 1.0);
    glTexCoord2f( 1.0, 0.0);glVertex3f( 0.5, 0.5, 0.5);
...

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: OpenGL, Erwartungswert fps

Beitrag von carli »

1. Statt Displayliste VBO benutzen
2. Matrix-Operationen rausschmeißen
3. Einen Vertex-Shader schreiben, dem du deine Würfelposition als Uniform übermittelst und der sich selbst die Transformation berechnet
4. Wenn du's ganz schnell haben willst, die Würfelposition mit ARB_draw_instanced übermitteln. Dann bekommst du alle Würfel mit einem Draw-Call hin

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: OpenGL, Erwartungswert fps

Beitrag von MAC »

zu viel ist das nicht.
Ich hab vor einem jahr schonmal ein programm geschrieben, welches 256*256*64 Würfel zeichnet (http://www.lazarusforum.de/viewtopic.ph ... =Freeminer" onclick="window.open(this.href);return false;)
Ich hab zum verbessern der Performance Tipp 4 Versucht da er sich eigentlich richtig gut anhört... ( bis jetzt hab ich es aber noch nicht wirklich zufriedenstellen schnell hinbekommen :D )
http://wiki.delphigl.com/index.php/Instancing" onclick="window.open(this.href);return false;

Code: Alles auswählen

Signatur := nil;

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: OpenGL, Erwartungswert fps

Beitrag von Scotty »

Wenn ich die Matrixoperation weglasse, ändert sich so gut wie nichts an der Framerate. Ich versuche mal die VBOs einzubauen, das andere klingt noch komplizierter ;-).

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: OpenGL, Erwartungswert fps

Beitrag von carli »

Noch was: Blending möglichst vermeiden. Du kannst stattdessen das unbedingt-sichtbar-sein-müssende Hintergrundbild in eine Textur einlesen und dann per Pixel Shader zwischen Farbe und Hintergrund selber blenden.

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: OpenGL, Erwartungswert fps

Beitrag von Scotty »

Danke für die Tipps, auch wenn die momentan meine Fähigkeiten noch übersteigen.
Letzten Endes war eine die Ursache nicht OpenGL. Ich bin im OnIdle durch eine Liste mit rund 2000 unsortierten Einträgen gegangen und habe geprüft, ob ein Item ein Flag hat. Das dauert bei einigen tausend Aufrufen dauert das halt ein paar Millisekunden. :roll:

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: OpenGL, Erwartungswert fps

Beitrag von carli »

Einige Tausend?
Naja, meine Tipps bezogen sich auf Millionen.

Displaced
Beiträge: 83
Registriert: So 12. Jul 2009, 10:08

Re: OpenGL, Erwartungswert fps

Beitrag von Displaced »

Öhm.. Eine Liste mit 2,000 nach nem Flag durchsuchen kostet dich einige Millisekunden?!
Wenn ich das mal durchsimuliere komme ich gerade mal auf 63 Millisekunden (mit gettickcount) und zwar bei 10,000 fachen durchsuchen einer solchen liste... was bedeutet, dass das einmalige durchsuchen zeitlich gesehen nix kostet.
Warum dauert das also bei dir so lange?

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: OpenGL, Erwartungswert fps

Beitrag von Scotty »

Die Liste enthält alle Buchstaben (im aktuellen Fall ~2800). Jeder Buchstabe hat unter anderem x,y,z-Koordinaten, die mit 255 belegt sind, wenn der Buchstabe nicht gelegt ist. Eine Funktion GetBoardLetter(x,y,z):TLetter geht durch die Liste und prüft, ob ein Buchstabe mit den entsprechenden Koordinaten verfügbar ist. Bei einem Feld mit 21^3 Positionen wird also bis zu 25 Millionen mal getypecastet und verglichen. Und davon schafft mein PC pro Sekunde halt nur 2 bis 3.
Nachdem ich ein (vorerst zusätzliches) statisches Feld eingeführt habe, bekomme ich natürlich ausreichend Frames hin. Nützlich wäre eine Angabe, wie viele Polygone pro Sekunde gezeichnet werden können. Das sollte zur Standardbeschreibung einer GraKa gehören.

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: OpenGL, Erwartungswert fps

Beitrag von carli »

Scotty hat geschrieben:Die Liste enthält alle Buchstaben (im aktuellen Fall ~2800). Jeder Buchstabe hat unter anderem x,y,z-Koordinaten, die mit 255 belegt sind, wenn der Buchstabe nicht gelegt ist. Eine Funktion GetBoardLetter(x,y,z):TLetter geht durch die Liste und prüft, ob ein Buchstabe mit den entsprechenden Koordinaten verfügbar ist. Bei einem Feld mit 21^3 Positionen wird also bis zu 25 Millionen mal getypecastet und verglichen. Und davon schafft mein PC pro Sekunde halt nur 2 bis 3.
Nachdem ich ein (vorerst zusätzliches) statisches Feld eingeführt habe, bekomme ich natürlich ausreichend Frames hin. Nützlich wäre eine Angabe, wie viele Polygone pro Sekunde gezeichnet werden können. Das sollte zur Standardbeschreibung einer GraKa gehören.
eine "Polygonrate" gibt es nicht, es zählt die Pixelfüllrate und die ist bei jeder Grafikkarte angegeben.

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: OpenGL, Erwartungswert fps

Beitrag von Scotty »

Ich bin eben in Wikipedia über ein paar Zahlen gestolpert: http://de.wikipedia.org/wiki/Nvidia-Gef ... tungsdaten" onclick="window.open(this.href);return false; (nicht bei allen Geforce sind Polygonraten angegeben). Der Polygondurchsatz liegt also (je nach Hardware deutlich) über 1M Polygone/s.

Antworten