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

Aktuelle Zeit: Fr Jul 18, 2025 21:06

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



Ein neues Thema erstellen Auf das Thema antworten  [ 43 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 13, 2006 22:17 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Ist zwar D3D aber beschreibt das Problem:

"Accurately Profiling Direct3D API Calls":
http://msdn.microsoft.com/library/defau ... _Calls.asp

Man kann nicht einfach die Zeit der Aufrufe messen.
Zumindest gibt es da eine Tabelle mit CPU Takten für jeden Befehl.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 14, 2006 13:23 
Offline
DGL Member

Registriert: Sa Jan 22, 2005 21:10
Beiträge: 225
Hab den Artikel mal überflogen und ich denke, dass es doch halbwegs möglich ist. Man muss nur viel mit schleifen und glFinish (oder NVFence) arbeiten, aber das hatten wir a auch schon gesagt. Das ganze über DLLs machen is jetzt auch kein Ding der Unmöglichkeit, aber ich wollte einfach nicht noch viel Zeit in eine GUI stecken (Lars hatte ja einen Baum angesprochen, in den alles eingefügt wird). Das reine Laden der DLLs is kein Aufwand.

_________________
[18:30] tomok: so wie ich das sehe : alles. was nich was anderes ist als nen Essay ist nen Essay

hi, i'm a signature viruz, plz set me as your signature and help me spread :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jul 15, 2006 09:15 
Offline
DGL Member

Registriert: So Jun 18, 2006 13:36
Beiträge: 12
Schwierigkeiten gibts, wenn Windows einem mitten im Rechnen die CPU-Zeit entzieht, was anderes macht und einem dann 500.000 CPU-Schritte später wieder in die Hand drückt, das versaut jede Messung.

Eine Alternative wäre wie oben angesprochen die Befehle so lange auszuführen, bis man eine repräsentative Menge hat, die man dann über eine Median-Mittelwertsbildung auswerten kann, um dann hoffentlich zu den echten Werten zu kommen. Median "filtert" dabei nämlich solche falschen Werte aus.
http://de.wikipedia.org/wiki/Median


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 17, 2006 03:48 
Offline
DGL Member

Registriert: So Sep 26, 2004 05:57
Beiträge: 190
Wohnort: Linz
@user68:
So ne .dll ist recht schnell gemacht, man nehme GLTrace, modifiziere es ein klein wenig so das die Zeitmessungen etwas genauer und an der richtigen Stelle sind und das wars auch schon. Der Source ist C, wennst das nicht kannst kann ich dir das schon machen.
Das größere Problem daran ist die Interpretation der Daten. Also von GLTrace erhältst du (wennst nicht allzu viel dazu programmieren willst) ein Logfile als Ausgabe, was dann etwa so ausschaut:
Code:
  1.  [00:00:00.078] wglGetCurrentContext() = 0x10000
  2.  [00:00:00.078] wglGetCurrentDC() = 0x67010A62
  3.  [00:00:00.078] glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT)
  4.  [00:00:00.078] glLoadIdentity()
  5.  [00:00:00.093] glTranslated(0.000000,0.000000,-10.000000)
  6.  [00:00:00.093] glPushMatrix()
  7. usw. und so fort

Wie gesagt Zeitmessung ist ungenau und auch nur ein Zeitpunkt nicht wie lange ein Befehl braucht.

Dafür bräuchtest dann halt eine Art Parser der dir meinetwegen die Anzahl der Befehle zählt.

Alternativ dazu könntest natürlich das Befehle zählen (und dergleichen) gleich in der .dll machen, würde halt einen Parser ersparen. Das wäre mir für meinen Teil allerdings doch ein klein wenig zu viel Aufwand da etwas ordentlich interpretierbares zu berechnen, also müsstest das wohl selbst machen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 17, 2006 09:50 
Offline
DGL Member

Registriert: Sa Jan 22, 2005 21:10
Beiträge: 225
Mir persöhnlich ging es eher darum kleinere Stückchen zu testen um zu sehen wo sich optimierungen lohnen.

Und genau da habe ich auch schon das erste Problem:

Es geht darum, wie viel es bringt, die Meshes nach Texturen zu sortieren, um weniger Texturwechsel zu haben.
Code:
  1.  
  2.      Clock.StartTick;
  3.      for j := 1 to 1000 do
  4.      begin
  5.           glEnable(GL_TEXTURE_2D);
  6.           glBindTexture(GL_TEXTURE_2D, Textures[j mod 4]);
  7.           glBegin(GL_QUADS);
  8.           for i := 1 to 1000 do
  9.           begin
  10.                glTexCoord2f(0.0, 0.0);
  11.                glVertex2f(0.25, 0.25);
  12.  
  13.                glTexCoord2f(1.0, 0.0);
  14.                glVertex2f(0.75, 0.25);
  15.  
  16.                glTexCoord2f(1.0, 1.0);
  17.                glVertex2f(0.75, 0.75);
  18.  
  19.                glTexCoord2f(0.0, 1.0);
  20.                glVertex2f(0.25, 0.75);
  21.           end;
  22.           glEnd();
  23.           glDisable(GL_TEXTURE_2D);
  24.      end;
  25.      glFinish;
  26.      Clock.EndTick;
  27.  


Versus

Code:
  1.  
  2.      Clock.StartTick;
  3.      for j := 0 to 3 do
  4.      begin
  5.           glEnable(GL_TEXTURE_2D);
  6.           glBindTexture(GL_TEXTURE_2D, Textures[j]);
  7.           for k := 1 to 250 do //*
  8.           begin
  9.                glBegin(GL_QUADS);
  10.                for i := 1 to 1000 do //**
  11.                begin
  12.                     glTexCoord2f(0.0, 0.0);
  13.                     glVertex2f(0.25, 0.25);
  14.  
  15.                     glTexCoord2f(1.0, 0.0);
  16.                     glVertex2f(0.75, 0.25);
  17.  
  18.                     glTexCoord2f(1.0, 1.0);
  19.                     glVertex2f(0.75, 0.75);
  20.  
  21.                     glTexCoord2f(0.0, 1.0);
  22.                     glVertex2f(0.25, 0.75);
  23.                end;
  24.                glEnd();
  25.           end; //*
  26.           glDisable(GL_TEXTURE_2D);
  27.      end;
  28.      glFinish;
  29.      Clock.EndTick;
  30.  


Ergebnis auf meiner NV GF4Ti mit AMD 2800+ 1 Gig Ram und WinXP:

Zitat:
1 000 000 quads texchange every 1 000------------------------- 4,435 sec
1 000 000 quads texchange only once per tex------------------- 4,426 sec


Den Zeitlichen unterschied kann man so gut wie vernachlässign. Ok nun kann man sagen, dass das daher kommt, dass die 2. Methode 3 Schleifen hat (also mehr Jumps, CPU muss öfter flushen, ...) aber meiner Meinung nach braucht man nunmal 3 Schleifen, wenn man das irgendwo implementiert.
Trotzdem habe ich es mal zusammengefasst, also die mit * gekennzeichneten Zeilen rausgenommen und bei ** noch den Faktor 250 dazu und das Ergebnis:

Zitat:
1 000 000 quads texchange every 1 000------------------------- 4,430 sec //Fast unverändert
1 000 000 quads texchange only once per tex------------------- 4,432 sec //im Grunde auch kein Unterschied


Die kleineren Schwankungen kommen durch Interrupts wie Two sie bereits beschrieben hat, aber wie kommt es, dass es praktisch keinen Geschwindigkeitsunterschied gibt?
Selbst wenn ich die Quads kleiner mache (paar Pixel), so dass die Fillrate keine Rolle mehr spielt, bleibt der Unterschied nach wie vor im 1% Rahmen.

Sind die Treiber mitlerweile so gut optimiert, dass Texturwechsel nicht mehr so schlimm sind, oder spielt es erst ne Rolle wenn man kompliziertere Wechsel (mehrere TextureUnits + Shader) hat?

_________________
[18:30] tomok: so wie ich das sehe : alles. was nich was anderes ist als nen Essay ist nen Essay

hi, i'm a signature viruz, plz set me as your signature and help me spread :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 17, 2006 11:47 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 13, 2004 11:00
Beiträge: 229
Wohnort: Steinhude
In diesem beispiel wird das vermutlich daran liegen, dass das zeichnen CPU- oder an der AGP Schnittstelle Bandbreitenlimitiert ist und dadurch die paar texturwechsel einfach untergehen. Bevor man sich allerdings den Aufwand macht seine Modelle nach Texturen zu sortieren wird man im Anwendungsfall vermutlich eh erstmal Displaylists oder VBOs verwenden um die CPU und Bandbreitenlast zu reduzieren. ( Füllratenlimitation rauszunehmen ist auch ne gute idee ;).


Ansonsten isses aber wirklich so, dass bei einigermaßen komplexen Modellen es kaum ins gewicht fällt, ob diese nach Texturen sortiert sind.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 17, 2006 13:10 
Offline
DGL Member

Registriert: So Jun 18, 2006 13:36
Beiträge: 12
Eine andere Idee wäre, dass die Grafikkartentreiber erstmal die gl-Befehle sammeln um sie dann optimiert und am Stück an die Grafikkarte zu senden. Denn eigentlich brauch die Grafikkarte vor dem SwapBuffers ja gar nichts erhalten, denn erst dann werden die Befehle relevant.

Ich hab mal ein paar Messungen gemacht indem ich die Anzahl der CPU-Schritte zwischen gl-Befehlen gemessen habe. Das ganze funktioniert mit dem Befehl DW $310F.

Hier erstmal die Messungen, Werte in CPU-Ticks (Mittelwert vom Minimalwert von je 10.000 Durchläufen, nach jedem Durchlauf glFlush), Erläuterungen gleich:
Code:
  1. getCPUCount = 59
  2.  
  3. glFlush = 12500
  4.  
  5. glTranslatef = 350
  6. v4 * M4x4 = 205
  7.  
  8. glLoadIdentity = 370
  9. glMultMatrix = 585
  10. glLoadMatrix, glMultMatrix = 730
  11. M4x4 * M4x4 = 320
  12.  
  13. pushMatrix, popMatrix = 630
  14. glGetFloatv, glLoadMatrix = 610
  15.  
  16. glMatrixMode = 260
  17.  
  18. cos(3.0) = 193
  19. sin(3.0) = 193
  20.  
  21. glEnable(GL_LIGHT0) = 365
  22. glDisable(GL_LIGHT0) = 365
  23. glEnable(GL_LIGHT0), glDisable(GL_LIGHT0) = 540
  24.  


Erläuterung zur Vorgehensweise

Angaben wie v4 bzw. M4x4 bedeutet das ich hier selber gerechnet habe, ohne das OpenGL verwendet wurde (Unit VectorGeometry.pas). Der verwendete CPU kann kein 3dNow, daher kann es durchaus sein das es auf modereneren CPUs noch deutlich schneller geht.

Erstmal wird sich wahrscheinlich die Frage stellen, warum ich den Mittelwert der Minimalwerte von 10.000 Durchläufen genommen habe. Bei meinem ersten Versuch habe ich einfach den Durchschnittswert berechnet, dann aber festgestellt, dass dieser extrem abhängig ist von Dingen wie Festplattenzugriff, Mausbewegung, Fenster die geöffnet sind usw. Ich konnte teilweise durch Mausbewegung den Durchschnittswert verdoppeln. Also habe ich den Minimalwert von 10.000 Durchläufen genommen, nach der Logik das eine Berechnung zwar durch äußere Einflüsse unterschiedlich lang dauern kann, aber niemals weniger als die eigentliche Rechenzeit. Daher muss die minimale Zeit die reine Rechenzeit der Berechnung sein. Mit dieser Methode bekam ich auch sehr stabile Werte, unabhängig davon was ich sonst noch gemacht habe.

Desweiteren sollte man beachten, dass CPU-Takt nicht 1 zu 1 auf Rechenzeit umgerechnet werden kann, da die CPU-Taktrate stark abhängig ist von der Optimierung des jeweiligen CPUs. Beispielsweise würde ein 120 P1 wesentlich mehr Takte brauchen als ein P4 mit paralleler Berechnung von 2 Befehlen. Man sollte die Werte oben als Schätzung +/-100 Takte interpretieren.


Interpretation der Ergebnisse

Interessant ist erstmal, dass Berechnungen von Hand (also ohne OpenGL) immer schneller sind als mit OpenGL. Daraus kann man schließen, dass man wann immer möglich Berechnungen selber durchführen sollte.

Dann ist interessant zu sehen, dass die Berechnung von sin/cos extrem flott geht, selbst auf so einem alten P2 wie der den ich benutzt habe. Und zwar in etwa so schnell wie einen Vektor mit einer Matrix zu multiplizieren. Hier kann man sich also ggf. einige Optimierungen um sin/cos rauszuwerfen sparen.

Berechnungen wie Matrizenmultiplikation sind stark abhängig von den verwendeten Matrizen. Berechne ich M*Mi (Mi = Identitätsmatrix) dann ist das wesentlich flotter als wenn ich 2 andere Matrizen multipliziere, ähnliches gilt für Vektoren. Ist auch logisch wenn man bedenkt das die CPU eine Multiplikation durch wiederholtes Addieren berechnet. Ich habe daher hier immer die Matrix zu Beginn mit zufälligen Werten gefüllt.

Wenn man sich die glEnable/glDisable-Zeiten anschaut, dann ist auffällig, dass die Kombination der beiden Befehle nicht so lange dauert wie jeder einzeln. Allerdings ist hier das Problem von oben zu beachten, hier muss man +/-100 Takte Ungenauigkeit miteinberechnen. Denn erstmal braucht die reine CPU-Count-Abfrage jeweils 59 Ticks, also müsste man zu den 540 eigentlich noch 120 dazu rechnen, und zusätzlich braucht der Funktionsaufruf der gl-Befehle ja auch noch Rechenzeit, so dass letztendlich die Zeit ca. bei vielleicht 650 zu 700 liegt, was dann dank der Ungenauigkeit in etwa das selbe sein dürfte.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 17, 2006 16:45 
Offline
DGL Member

Registriert: Sa Jan 22, 2005 21:10
Beiträge: 225
Man muss bei den Minimalwerten sehr genau darauf achten, was man messen will. Wenn es wie bei dir einzelne Befehle oder sehr kurze Code-Stücke sind (z.B. Handgeschriebener 3DNow oder SSE Code), dann sollte man tatsächlich aus den von dir genannten Gründen die Minimalwerte nehmen, weil dass dan auch die tatsächlichen Zeiten sind.
Bei größeren Codeblöcken sollte man sich dann jedoch mal Gedanken machen, warum die Durchschnittszeiten höher sind. Wenn dann der Code so ist, dass er halt häufiger Collisionen (Cachemiss, Lock in einer critical region, ...) verursacht, dann sollte sich das in den Messwerten auch wiederspiegeln.


Zitat:
Eine andere Idee wäre, dass die Grafikkartentreiber erstmal die gl-Befehle sammeln um sie dann optimiert und am Stück an die Grafikkarte zu senden. Denn eigentlich brauch die Grafikkarte vor dem SwapBuffers ja gar nichts erhalten, denn erst dann werden die Befehle relevant.


Sowas wäre begrenzt möglich, jedoch kann sie auch nicht zu lange warten, weil sonst die Parallelverarbeitung in CPU und GPU nicht voll ausgenutzt wäre.


Ich werde die Tage mal noch ein paar Tests schreiben und mich dann nochmal mit User absprechen, um den Code zu säubern und zu posten. Vielleicht werde ich ja schlauer daraus...

_________________
[18:30] tomok: so wie ich das sehe : alles. was nich was anderes ist als nen Essay ist nen Essay

hi, i'm a signature viruz, plz set me as your signature and help me spread :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 17, 2006 17:08 
Offline
DGL Member

Registriert: So Sep 26, 2004 05:57
Beiträge: 190
Wohnort: Linz
AL hat geschrieben:
Sind die Treiber mitlerweile so gut optimiert, dass Texturwechsel nicht mehr so schlimm sind, oder spielt es erst ne Rolle wenn man kompliziertere Wechsel (mehrere TextureUnits + Shader) hat?


Mit solchen Aussagen muss man sehr sehr vorsichtig sein. Es war nie ein allzu großes Problem für Grafikkarten Texturen zu wechseln, ist ja (mehr oder weniger) nur ein State-Change. Die Probleme fangen erst dann an, wenn du mehr Texturen hast als in deinen Grafikkarten-Speicher rein passen. Wenn sie nicht mehr rein passen werden sie im Hauptspeicher ausgelagert wodurch im schlimmsten Fall bei jedem Texturwechsel die Textur über deinen Bus vom Hauptspeicher zur Grafikkarte gelangen muss. Wenn du heutzutage so deine 128MB Grafikkartenspeicher hast treten diese Probleme jedoch erst etwas später auf als früher.

Hab ich im Wiki auch kurz unter Bandbreitenlimitiert angeschnitten. Diesbezüglich möchte ich auch gleich auf die anderen Limitierungen verweisen: Füllrate, Vertexlimitiert und Shaderlimitiert. Vielleicht findet sich hier ja einer der diesen Listen für Ursachen und Problembehebung noch das ein oder andere hinzu fügen möchte :-).


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jul 18, 2006 10:29 
Offline
DGL Member

Registriert: So Jun 18, 2006 13:36
Beiträge: 12
AL hat geschrieben:
Bei größeren Codeblöcken sollte man sich dann jedoch mal Gedanken machen, warum die Durchschnittszeiten höher sind. Wenn dann der Code so ist, dass er halt häufiger Collisionen (Cachemiss, Lock in einer critical region, ...) verursacht, dann sollte sich das in den Messwerten auch wiederspiegeln.

Ja, eigentlich sollte man Minimalwert und Mittelwert angeben bei solchen Messungen. Das Problem ist nur das dank Windows so viele weitere Faktoren in die Mittelwert-Messung mit einfließen, dass der Mittelwert kaum noch Aussage hat. Wenn sich die Rechenzeit im Schnitt verdoppelt, wenn der User bei der Rechnung die Maus bewegt, dann lässt sich daraus schlecht eine Schätzung für den durchschnittlichen Zeitverbrauch abgeben.

Hier stellt sich die Frage wie man einen Mittelwert für die verbrauchte Rechenzeit angibt bei der möglichst alle störenden Faktoren vermieden wurden. Oder ob es sinnvoll ist, bei bestimmten Anwendungen einfach gewisse Faktoren die immer auftreten mit einzuberechnen. Andererseits könnte man auch argumentieren, dass die Rechenzeit ja der minimalen Zeit entspricht, nur dass eben je nach Situation noch weitere Faktoren dazu gerechnet werden müssen. Nur wenn ja, dann welche?

Naja wie dem auch sei, ich denke man sieht das Problem das hier bereits die Definition von "Rechenzeit" extreme Schwierigkeiten bereitet, was das Messen dieser natürlich noch schwerer macht. Stellt sich hier also die Frage, was hier als Zeitmessung als Abschätzung für die allgemeine Verwendung der Funktionen überhaupt sinnvoll ist. Es bringt ja recht wenig wenn da ein Wert steht, der zwar richtig ist, aber in 99% der Anwendungsfällen nicht zutrifft. Genauso wenig hilft es aber, wenn ich von einer Tabelle mit 247283979723 Einträgen erschlagen werde, in der ich mir dann meinen speziellen Fall raussuchen muss, der sich dann aber bei winzigen Programmänderungen schon wieder komplett ändert.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 28, 2006 18:00 
Offline
DGL Member

Registriert: Sa Jan 22, 2005 21:10
Beiträge: 225
Sry, dass es so lange gedauert hat, aber User69 und ich hatten viel um die Ohren und ham irgendwie vergessen, dass wir das Prog ja Posten wollten. Wo sollte das denn am besten hin? Ins Wiki? Oder in die Projekte-Ecke? Es ist ja so entworfen, dass jeder über DLLs eigene Tests schreiben kann. Wenn also jemand solchen Code auch noch posten will, sollte es auch dafür eine Möglichkeit geben...

_________________
[18:30] tomok: so wie ich das sehe : alles. was nich was anderes ist als nen Essay ist nen Essay

hi, i'm a signature viruz, plz set me as your signature and help me spread :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 28, 2006 21:31 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Macht am besten folgendes:
Zuerst macht ihr hier einen Projektthread + Meinungsthread auf. Dann schreibt ihr in den Projektthread ne art Doku, in der beschrieben steht welche tests dabei sind, und wie man eigene schreibt. (Wenns in Java wär könnte man leicht ne schöne Pluginschnittstelle schreiben...aber egal)

Falls dann ein Paar Tests ("Plugins") zusammenkommen, könnt ihr wie Lossy ne Projektseite im Wiki aufmachen.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 29, 2006 10:27 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Ich weiß nicht ob es euch helfen wird aber ich hab in X-Dream neben Perfmon noch SysInfos entwickelt, welches sehr viele Systemdaten erfasst egal ob linux/windows. Mit unter ist auch SMBIOS,CPU,RAM und noch ein paar sachen.

Hier mal die Demo aus meinem Repo.

Code:
  1. program x_dream;
  2. {$APPTYPE CONSOLE}
  3. uses
  4.   XDream,
  5.   XD_Perfmon,
  6.   dglOpenGL,
  7.     System_Settings;
  8.  
  9. var
  10.   Quad:TXD_Perfmon_Indicator_Time;
  11.   RenderTime:TXD_Perfmon_Indicator_Time;
  12.   Events:TXD_Perfmon_Indicator_Time;
  13.   Ram:TXD_Perfmon_Indicator_Value;
  14.   i:integer;
  15.  
  16. procedure Draw();
  17. begin
  18.   Events.Stop;
  19.   Events.Clear;
  20.  
  21.   XD.Perfmon.Stop;
  22.   XD.Perfmon.Start;
  23.  
  24.   Rendertime.Start;
  25.  
  26.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  27.   glLoadIdentity;
  28.  
  29.   gltranslatef(0,0,-5);
  30.   Quad.Start;
  31.   for i:=0 to 999 do
  32.   begin
  33.   glbegin(GL_Quads);
  34.     glvertex3f(-1,1,0);
  35.     glvertex3f(0,1,0);
  36.     glvertex3f(0,0,0);
  37.     glvertex3f(-1,0,0);
  38.  
  39.     glvertex3f(0,1,0);
  40.     glvertex3f(1,1,0);
  41.     glvertex3f(1,0,0);
  42.     glvertex3f(0,0,0);
  43.  
  44.     glvertex3f(-1,0,0);
  45.     glvertex3f(0,0,0);
  46.     glvertex3f(0,-1,0);
  47.     glvertex3f(-1,-1,0);
  48.  
  49.     glvertex3f(0,0,0);
  50.     glvertex3f(1,0,0);
  51.     glvertex3f(1,-1,0);
  52.     glvertex3f(0,-1,0);
  53.   glend;
  54.   end;
  55.   Quad.Stop;
  56.   Quad.Clear;
  57.  
  58.   XD.System.SysInfo.Ram.DetectUsed;
  59.   Ram.valuef:=XD.System.SysInfo.Ram.Used/1048576;
  60.   XD.Perfmon.Draw;
  61.   XD.Render.SwapBuffers;
  62.  
  63.   RenderTime.Stop;
  64.   Rendertime.Clear;
  65.  
  66.   Events.Start;
  67. end;
  68.  
  69. begin
  70.     Default_UsePerfmon:=true;
  71.   XD:=TXDream.create;
  72.   XD.ScriptManager.executeFile('main.lua');
  73.   XD.ScriptManager.ExecuteFunction('main');
  74.  
  75.   Quad:=TXD_Perfmon_Indicator_Time.create;
  76.   Quad.name:='Quadloop';
  77.   XD.Perfmon.Indicator.add(Quad);
  78.  
  79.   RenderTime:=TXD_Perfmon_Indicator_Time.create;
  80.   RenderTime.name:='RenderTime';
  81.   XD.Perfmon.Indicator.add(RenderTime);
  82.  
  83.   Events:=TXD_Perfmon_Indicator_Time.create;
  84.   Events.name:='Events';
  85.   XD.Perfmon.Indicator.add(Events);
  86.  
  87.   Ram:=TXD_Perfmon_Indicator_Value.create;
  88.   Ram.name:='Ram';
  89.   Ram.valuef:=XD.System.SysInfo.Ram.Used/1048576;
  90.   Ram.maxvaluef:=XD.System.SysInfo.Ram.Size/1048576;
  91.   Ram.unitname:='MB';
  92.   Ram.Float:=true;
  93.   XD.Perfmon.Indicator.add(Ram);
  94.  
  95.   XD.Perfmon.view:=XD_Perfmon_View_time;//uncomment to switch in timemode
  96. //  XD.Perfmon.view:=XD_Perfmon_View_value;
  97.  
  98.   XD.Perfmon.Start;
  99.   Events.Start;
  100.  
  101.   XD.EventManager.AddIdle(@Draw);
  102.   XD.Start;
  103.   XD.destroy;
  104. end.
  105.  


Ergebnis ist dann folgendes Bild

Wie man gut sehen kann hab ich das zählen der Zeit vom Quad Rendern, vor der Übergabe des ersten Quads gestartet.
OpenGL gibt ja die Daten über den Bus und die Graka arbeitet dann auch sofort los und erst wenn der BufferSwap durch ist, ist sie fertig. Wenn man dann auf die Ansicht von Werten Switcht sieht es in meinem Beispiel dann wie folgt aus.
Bild

Mehr Infos findet man hier
http://www.linuxprofessionals.org/xdream/
und hier
http://www.linuxprofessionals.org/xdream/wiki/index.php/XD_Perfmon

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 43 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 15 Queries | GZIP : On ]