Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Sa Jul 19, 2025 22:07

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Do Okt 25, 2007 18:47 
Offline
DGL Member

Registriert: So Okt 21, 2007 14:16
Beiträge: 123
Programmiersprache: Delphi
Hallo,

ich habe ein einfaches Programm geschrieben, das eine Heightmap in jedem Durchgang rendert, 80-90 FPS. Nun habe ich das Progamm umgeschrieben, es erstellt am Anfang eine Displaylist mit der Heightmap und die Displaylist wird in jedem Durchgang angezeigt, jedoch nur bei 50-60 FPS. Hat jemand eine Idee, woran das liegen könnte? Schonmal vielen Dank.

Gruß Joni.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 25, 2007 18:59 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Hallo.

Jain. Also Displaylisten müssen nicht schneller sein wenn die Grafikkarte es nicht unterstützt. Sollte aber sonst eigentlich zu mindest nicht langsamer werden. Was ich schon mal erlebt hatte waren extrem kleine DisplayListen. Da war es dann wirklich langsamer.

Allerdings solltest du uns mal etwas Code zeigen. Evtl machst du ja irgendwas in der Liste was extrem bremmst. Bzw was hast du für eine Grafikkarte?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 25, 2007 19:34 
Offline
DGL Member

Registriert: So Okt 21, 2007 14:16
Beiträge: 123
Programmiersprache: Delphi
Hallo,

ich hab ne NVidia GForce Go 7600 und mein quellcode sieht so aus (zu über 90% aus dem Heightmap-Tut hier):
Code:
  1. procedure TSkyBoxForm.PaintHeightMap;
  2. const
  3.   VertPos : Array[0..3] of Array[0..1] of Byte =
  4.     ((0,0),(0,1),(1,1),(1,0));
  5.  MapResolution = 100;
  6. var
  7.   X,Z,I : LongInt;
  8.   Vertieces : Array[0..3] of TVertex;
  9.   Triangles : LongInt;
  10.   procedure PaintTriangle(V1, V2, V3 : Integer);
  11.   var
  12.     Normale : TVertex;
  13.   begin
  14.     Inc(Triangles);
  15.     Normale := VectorCrossProduct(VectorSubtract(Vertieces[V1], Vertieces[V2]),
  16.                VectorSubtract(Vertieces[V2], Vertieces[V3]));
  17.     NormalizeVector(Normale);
  18.     glNormal3fv(@Normale[0]);
  19.     glBegin(GL_TRIANGLES);
  20.       glTexCoord2f(Vertieces[V1][0]/MapSize, 1-Vertieces[V1][2]/MapSize);
  21.       glVertex3fv(@Vertieces[V1][0]);
  22.       glTexCoord2f(Vertieces[V2][0]/MapSize, 1-Vertieces[V2][2]/MapSize);
  23.       glVertex3fv(@Vertieces[V2][0]);
  24.       glTexCoord2f(Vertieces[V3][0]/MapSize, 1-Vertieces[V3][2]/MapSize);
  25.       glVertex3fv(@Vertieces[V3][0]);
  26.     glEnd;
  27.   end; (*PaintTriangle*)
  28. begin
  29.   dp := glGenLists(1);
  30.   glNewList(dp, GL_COMPILE);
  31.   glBindTexture(GL_TEXTURE_2D, t);
  32.   for X := 0 to MapResolution - 1 do
  33.     for Z := 0 to MapResolution - 1 do
  34.     begin
  35.       //Alle Vertieces erzeugen
  36.       for I := 0 to 3 do
  37.       begin
  38.         Vertieces[I][0] := (X + VertPos[I][0])/MapResolution*MapSize;
  39.         Vertieces[I][2] := (Z + VertPos[I][1])/MapResolution*MapSize;
  40.         Vertieces[I][1] := MapDaten[X + VertPos[I][0],Z + VertPos[I][1]]
  41.       end;
  42.       PaintTriangle(0,1,3);
  43.       PaintTriangle(1,2,3)
  44.     end;
  45.   glEndList;
  46. end;


Also ich weiss nicht was daran bremsen soll?

Gruß Joni.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 25, 2007 20:59 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also eigentlich sollte die Karte so etwas schon ohne Probleme abkönnen. Also da ist nichts tragisches dran.

Wenn du die Flächen so zeichnest kannst du auch glBegin(GL_TRIANGLES); und glEnd; komplett außen rum packen. Da du immer drei Vertices hast kannst du das glBegin und glEnd komplett außerhalb machen. Du benutzt auch nichts innerhalb verboten wäre.

Allerdings denke ich nicht, dass es solche einen massiven Unterschied machen sollte. Du solltest aber in jedem Fall darauf achten, dass du diese DisplayListe nur ein mal generierst und ansonsten nur glCallList aufrufst. Ansonsten würste ich so spontan nicht woran es noch liegen könnte. Allerdings finde ich 80-90 FPS für ganz ohne Displayliste auf solch einer Karte eigentlich auch schon nicht gerade sonderlich viel.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 27, 2007 15:47 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Lossy eX hat geschrieben:
Allerdings denke ich nicht, dass es solche einen massiven Unterschied machen sollte. Du solltest aber in jedem Fall darauf achten, dass du diese DisplayListe nur ein mal generierst und ansonsten nur glCallList aufrufst. Ansonsten würste ich so spontan nicht woran es noch liegen könnte. Allerdings finde ich 80-90 FPS für ganz ohne Displayliste auf solch einer Karte eigentlich auch schon nicht gerade sonderlich viel.


Nu, die 80-90 können ja immernoch von einem VSync mit nem 90Hz-Bildschirm kommen.

Aber wie Lossy schon sagt, die Liste sollte wirklich nur einmal generiert werden, also nur einmal glNewList usw. und dann immer nur mit glCallList wieder aufgerufen werden, sonst ist der ganze schöne Vorteil dahin.

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 28, 2007 16:47 
Offline
DGL Member

Registriert: So Okt 21, 2007 14:16
Beiträge: 123
Programmiersprache: Delphi
Hallo nochmal,

V-Sync ist bei dem normalen Rendern deaktiviert, andere Programme zeigen bis zu 3500 FPS, aber die Variante mit der Displaylist hat exakt die Geschwindigkeit, die das normale Rendern bei aktiviertem V-Sync hat (wechselt zwischen 60 und 59 FPS). Sind Displaylists vllt. auf V-Sync eingestellt?

Gruß Joni.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 28, 2007 17:23 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ne Ne. Also entweder ist deine kompletter Renderkontext auf V-Sync eingestellt oder nicht. Dazwischen gibts nichts. Zum Ausprobieren solltest du evtl einfach nur mal ein simples quad zeichnen. Wenn es trotzdem nur 60 sind dann ist V-Sync an.

Und dann solltest du mal deine Treibereinstellungen untersuchen. Teilweise gibt es diese Einstellung sowohl für OpenGL als auch für DirectX. Oder aber du benutzt wglSwapInterval.

Ansonsten solltest du uns mal zeigen was du da eigentlich machst.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 02, 2007 15:50 
Offline
DGL Member

Registriert: So Okt 21, 2007 14:16
Beiträge: 123
Programmiersprache: Delphi
Hallo,

tut mir leid dass ich erst so spät antworte. Ich hab ein Tool um V-Sync für OpenGl und DirectX separat zu aktivieren und auch zu deaktivieren (RivaTuner), ich habe testweise V-Sync deaktiviert (Maximum war etwas über 4000 FPS bei einem Dreieck) und das ganze nochmal getstet (obwohl V-Sync beim ersten Mal auch deaktiviert war), die Raten sind aber auch etwas anders als beim ersten Mal, ohne dass ich etwas geändert habe (100 FPS ohne, 65 FPS mit Displaylist). Hier der Quellcode der Render-Routine:
Code:
  1. procedure TSkyBoxForm.glDraw;
  2. var
  3.   Error : LongInt;
  4. procedure PaintSkyBox;
  5. const
  6.   QuadPosition : Array[0..5] of Array[0..3] of Array[0..2] of Single =
  7.     (((2.005,2.005,-1.995),(2.005,-2.005,-1.995),(-2.005,-2.005,-1.995),(-2.005,2.005,-1.995)),     //Nordseite
  8.     ((1.995,2.005,2),(1.995,-2.005,2),(1.995,-2.005,-2),(1.995,2.005,-2)),         //Ostseite
  9.     ((-2.005,2.005,1.995),(-2.005,-2.005, 1.995),(2.005,-2.005,1.995),(2.005,2.005,1.995)),          //Südseite
  10.     ((-1.995,2.005,-2),(-1.995,-2.005,-2),(-1.995,-2.005,2),(-1.995,2.005,2)),      //Westseite
  11.     ((-2,2,-2),(-2,2,2),(2,2,2), (2,2,-2)),
  12.     ((2,-2,-2),(2,-2,2),(-2,-2,2),(-2,-2,-2)));
  13.   TexturePos : Array[0..3] of Array[0..1] of Single =
  14.     ((1,1),(1,0),(0, 0),(0, 1));
  15. var
  16.   Side, Vertex : Integer;
  17. begin
  18.   for Side := 0 to 5 do
  19.   begin
  20.     //Textur aktivieren
  21.     glBindTexture(GL_TEXTURE_2D, SkyBoxTexturen[Side]);
  22.     glBegin(GL_QUADS);
  23.     //Vertieces und Tex Coords übergeben
  24.     for Vertex := 3 downto 0 do
  25.     begin
  26.       glTexCoord2fv(@TexturePos[Vertex][0]);
  27.       glVertex3fv(@QuadPosition[Side][Vertex][0])
  28.     end;
  29.     glEnd()
  30.   end
  31. end;
  32. begin
  33.   glClear(GL_DEPTH_BUFFER_BIT or GL_COLOR_BUFFER_BIT);
  34.   glLoadIdentity;
  35.   glRotatef(turnvector.x, 1, 0,0);
  36.   glRotatef(turnvector.y, 0, 1,0);
  37.   PaintSkyBox;
  38.   glClear(GL_DEPTH_BUFFER_BIT);
  39.   glTranslatef(viewvector.x, viewvector.y, viewvector.z);
  40.   glCallList(dp);
  41.   //Error Handler
  42.   Error := glgetError;
  43.   if Error <> GL_NO_ERROR then
  44.   begin
  45.     Caption := gluErrorString(Error)
  46.   end;
  47. end;
  48.  
  49. procedure TSkyBoxForm.GetMouseAndKeys;
  50. const xdiff = 1;
  51. var mp: TPoint;
  52. begin
  53.   GetCursorPos(mp);
  54.   if mp.x < ClientToScreen(Point(Width div 2, Height div 2)).x then
  55.     Turnvector.y := Turnvector.y-1;
  56.   if mp.x > ClientToScreen(Point(Width div 2, Height div 2)).x then
  57.     Turnvector.y := Turnvector.y+1;
  58.   if mp.y < ClientToScreen(Point(Width div 2, Height div 2)).y then
  59.     Turnvector.x := Turnvector.x-1;;
  60.   if mp.y > ClientToScreen(Point(Width div 2, Height div 2)).y then
  61.     Turnvector.x := Turnvector.x+1;
  62.   SetCursorPos(ClientToScreen(Point(Width div 2, Height div 2)).x,
  63.                ClientToScreen(Point(Width div 2, Height div 2)).y);
  64.   if GetAsyncKeystate(VK_ESCAPE) < 0 then close;
  65.   if GetAsyncKeyState(VK_LEFT) < 0 then
  66.   begin
  67.     ViewVector.x := ViewVector.x + xDiff * cos(-TurnVector.y*piover180);
  68.     ViewVector.z := ViewVector.z - xDiff * sin(-TurnVector.y*piover180);
  69.   end;
  70.   if GetAsyncKeyState(VK_RIGHT) < 0 then
  71.   begin
  72.     ViewVector.x := ViewVector.x - xDiff * cos(-TurnVector.y*piover180);
  73.     ViewVector.z := ViewVector.z + xDiff * sin(-TurnVector.y*piover180);
  74.   end;
  75.   // Vor-Zurück-Bewegung
  76.   if GetAsyncKeyState(VK_UP) < 0 then
  77.   begin
  78.     ViewVector.x := ViewVector.x+sin(-TurnVector.y*piover180)*xdiff;
  79.     ViewVector.z := ViewVector.z+cos(-TurnVector.y*piover180)*xdiff;
  80.   end;
  81.   if GetAsyncKeyState(VK_DOWN) < 0 then
  82.   begin
  83.     ViewVector.x := ViewVector.x - xDiff * sin(-TurnVector.y*piover180);
  84.     ViewVector.z := ViewVector.z - xDiff * cos(-TurnVector.y*piover180);
  85.   end;
  86. end;
  87.  
  88. procedure TSkyBoxForm.ApplicationEventsIdle(Sender: TObject;
  89.   var Done: Boolean);
  90. begin
  91.   //Frame Counter
  92.   GetMouseAndKeys;
  93.   glDraw;
  94.   Inc(Frames);
  95.   if GetTickCount - StartTick >=1000 then
  96.   begin
  97.     Caption := 'FPS: '+IntToStr(Frames);
  98.     Frames := 0;
  99.     StartTick := GetTickCount;
  100.   end;
  101.   SwapBuffers(DC);
  102.   done := false;
  103. end;


Wie die Liste erstellt wird habe ich ja bereits gepostet.

Gruß Joni.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 9 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 17 Queries | GZIP : On ]