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

Aktuelle Zeit: Fr Jul 18, 2025 15:52

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



Ein neues Thema erstellen Auf das Thema antworten  [ 23 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: OpenGL "Laggt" bei 10 Dreiecken.
BeitragVerfasst: Mo Feb 25, 2008 21:24 
Offline
DGL Member

Registriert: Fr Feb 22, 2008 18:00
Beiträge: 10
so.
ich habe ein paar Dreiecke (10 an der Zahl) die mir über den Bildschirm befördert werden.
Da hab ich jetzt die verschiedensten Methoden ausprobiert:
alle nebeninanderzeichnen und davor immer n stückerl weiter mit translate verschieben, oder mit push und popp
es funktioniert zwar alles aber es "hakt" ode zuckt oder weiss ich was
es läuft nicht flüssig.

hier mal die render methode:
Code:
  1.  
  2. procedure TForm1.Render;
  3.   var
  4.     i: integer;
  5. begin
  6.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  7.  
  8.   glMatrixMode(GL_PROJECTION);
  9.   glLoadIdentity;
  10.   gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
  11.  
  12.   glMatrixMode(GL_MODELVIEW);
  13.   glLoadIdentity;
  14.  
  15.   glTranslated(0,0,-5);
  16.  
  17.   for i := 1 to 5 do begin
  18.     glPushMatrix();
  19.       glTranslatef(TerrainXPos[i],0,0);
  20.       glBegin(GL_TRIANGLES);
  21.         glColor3f(0,1,0);
  22.         glVertex3f(0,1.3,0);
  23.         glVertex3f(1.75,0.9,0);
  24.         glVertex3f(1.75,1.8,0);
  25.       glEnd();
  26.       glBegin(GL_TRIANGLES);
  27.         glColor3f(1,0,0);
  28.         glVertex3f(0,1.3,0);
  29.         glVertex3f(1.75,1.8,0);
  30.         glVertex3f(0,1.8,0);
  31.       glEnd();
  32.     glPopMatrix();          
  33.   end;
  34.  
  35.   SwapBuffers(DC);
  36. end;


die Idlehandler methode:
Code:
  1.  
  2. procedure TForm1.IdleHandler(Sender: TObject; var Done: Boolean);
  3.   var i: integer;
  4. begin
  5.   QueryPerformanceCounter(StartCount);
  6.   Render;
  7.     for i := 1 to 5 do begin
  8.       TerrainXPos[i] := TerrainXPos[i] + drawtime * (-2.5);
  9.     end;
  10.   QueryPerformanceCounter(EndCount); //Zeit0
  11.   drawtime := (EndCount - StartCount)/Frequency;
  12.   TimeCount := TimeCount + DrawTime;
  13.   Inc(FrameCount);
  14.  
  15.   if TimeCount >= 1 then begin
  16.     Frames:= FrameCount;
  17.     TimeCount:= TimeCount - 1000;
  18.     FrameCount:= 0;
  19.     Caption:= InttoStr(Frames) + 'FPS';
  20.     ErrorHandler;
  21.   end;
  22.   Done:= false;
  23. end;


im anhang die .exe die laggt....


kann mir jemand helfen??

lG


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Feb 25, 2008 21:36 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Da laggt doch nichts... bis ich die Maus über das Fenster bewege. Dann hängt es. Was macht du bitte bei Mausevents?

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Feb 25, 2008 22:00 
Offline
DGL Member

Registriert: Fr Feb 22, 2008 18:00
Beiträge: 10
Ich mache nichts an den Mouseevents, bei mir laggt es aber auch so, also unabhöngig von Maus.. bin ich da der einzige??? ich mein 2.8 Ghz sind wohl hoffetnlich genug....


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Feb 25, 2008 22:28 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
2.8 Ghz * 2? Also 2 Kerne?

Bei mir läuft es im übrigen 1A. Kein ruckeln oder zuckeln.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Feb 25, 2008 23:02 
Offline
DGL Member

Registriert: Fr Feb 22, 2008 18:00
Beiträge: 10
ne nur ein Kern, bzw. 1 physikalischer, aber zwei virtuelle, aber das is OT ^^


Bei mir laggt und zittert es...
nich extrem, aber es nervt... es sind so kleine Ruckler die das Spielgefühl zerstören...

hmm vllt. sollte ich mal rebooten...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Feb 25, 2008 23:29 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ne Ne du. Meine Frage mag vielleicht OT erscheinen hat aber durchaus seine Berechtigung. Ich weiß nicht wie das bei Hyperthreading ist aber bei Dual Cores hast du 2 CPUs. Windows verteilt den Prozess aber abwechselt auf die CPUs und da jeder Kern einen eigenen Performance Counter hat, kann es passieren, dass du beim Messen blödsinnige Werte bekommst. Weil die Counter nicht unbedingt wirklich gleich sein müssen. Dann kann es sein, dass die Werte mal kurzzeitig negativ sind und dann wieder überdimensional groß. Ich habe bei mir den AMD Dual Core Optimizer installiert der dafür sorgt, dass die Counter gleich sind und bei mir gehts. ;)

Schau dir auch mal folgendes Thema an.

PS: Wenn du den ProcessExplorer von SystemInternals hast, dann kann man damit auch eben die AffinityMask eines Prozesses einstellen. Dann sollte es auch gehen.

PPS: Falls das nicht hinhaut solltest du uns mal ein bisschen Codes deines Timebased Movements zeigen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Feb 26, 2008 17:07 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
Die threadaffinität kann man auch mit dem normalen taskman einstellen (allerdings nur auf Prozessebene)
Außerdem deaktiviert der kompatibilitätsmodus für Win9x mehrere kerne. Mehrkerner sind ein problem bei Timebasedmovement da die uhr die queryperformancecounter abfragt auf verschiedenen kernen verschieden gehen kann.

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mär 01, 2008 16:21 
Offline
DGL Member

Registriert: Fr Feb 22, 2008 18:00
Beiträge: 10
ok, das könnte schon sein das es an mehreren Kernen liegt,
aber 1. ich habe 2 virteuelle Kerne und hyperthreading.
Ein freund von mir hat 4 physikalische Kerne und auch Hyperthreading.

Bei mir laggt es praktisch gar nicht, ob mit oder ohne Maus auf dem Bild

Bei ihm läuft das Spiel bei Mouseover praktisch in Zeitlupe. Es geht irsinnig langsam.
Sobald die Maus nicht mehr auf dem Formular ist funktionierts top, ohne laggs.

Also wenn das mit den Kernen das problem wäre, wieso dann nur bei Mouseover?? oO
Und wie machen das andere Programme/Spiele? Wie berechnen die ihre FPS wohl auch so oder?
Code:
  1.  
  2.     QueryPerformanceCounter(StartCount);
  3.  
  4.     Render;
  5.    // TBM Start
  6.     TerrainXPos := TerrainXPos + (drawtime) * QuadXSpeed;
  7.     Block1.Move(drawtime);
  8.     Block2.Move(drawtime);
  9.     if LeerkeyDown then
  10.       Heli.MoveUp(drawtime)
  11.     else
  12.       Heli.MoveDown(drawtime);
  13.    // TBM End
  14.  
  15.     // ** Kollisions Berechnung und son Blödsinn **    
  16.  
  17.   Score := Score + (drawtime) * 10;
  18.  
  19.   QueryPerformanceCounter(EndCount);
  20.   drawtime := (EndCount - StartCount)/Frequency * Scalefactor;
  21.   TimeCount := TimeCount + DrawTime;
  22.   Inc(FrameCount);
  23.  
  24.   if TimeCount >= 1 then begin
  25.     Frames:= FrameCount;
  26.     TimeCount:= TimeCount - 1000;
  27.     FrameCount:= 0;
  28.     ErrorHandler;
  29.   end;
  30.  
  31.  


so das TBM is im Prinzip überall gleich...

Aber was mich halt so wundert is das es nur bei HOver so nen scheiss baut...

/windows sucks btw ;)/

lG Green


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mär 01, 2008 17:31 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Wie das in aktuellen Spielen gelöst ist habe ich keine Ahnung. "Alternativ" dazu kann man auch GetTickCount benutzen. Denn das ist kein Bestandteil der CPU. Allerdings ist GetTickCount teilweise viel zu ungenau.

Was mich allerdings jetzt etwas stutzig macht ist die Zeitlupe mit der Maus. Sah in deinem ersten Post etwas anders aus. Evtl sollte dein Kumpel mal testweise auf seinem System die Mausschatten deaktivieren. Unter Systemsteuerung -> Maus -> Zeiger -> Zeigerschatten Aktivieren. Denn der muss nachträglich von Windows auf dein Fenster geblendet werden und wenn zu viele Frames Pro Sekunde entstehen und die Hardware das nicht sonderlich gut beschleunigt kann es sein, dass der Schatten einen merklichen Teil der CPU benötigt.

Und ich glaube deine Messmethode begünstigt das ausbremsen noch etwas. Denn der Mausschatten wird außerhalb der OnIdle Methode gerendert. Benötigt aber trotzdem Zeit und Windows "blockiert" in der Zwischenzeit deine Anwendung. Du misst aber nur innerhalb von OnIdle. Somit bekommst du das was außerhalb passiert aber nicht mit in deine Rechnung. Was dann dazu führen kann, dass du laut deiner Rechnung 100 FPS pro Sekunde hast aber in Wirklichkeit nur 30 Bilder gezeichnet wurden. Um so schneller der Rechner deines Kumpels um so krasser müsste das Problem auftreten.

Du musst jetzt zum Berechnen deines Frames die Zeit von einem OnIdle bis zum Nächsten messen. Also zu Begin des OnIdle weißt du EndCount den Wert von StartCount zu und misst StartCount danach neu. Schon solltest du arbeiten außerhalb auch berücksichtigen. Beachte aber, dass StartCount zu Begin nicht sinnvoll initialisiert ist und so dein erstes Frame rechnerisch mehrere Stunden gebraucht hat. Also StartCount ein mal auslesen. Also direkt bevor du mit Initialisieren fertig bist. OnShow oder OnCreate als letztes.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mär 01, 2008 19:25 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
Wenn du nur 1x pro frame die Zeit misst (was ich auch empfehle) musst du auf jeden fall eine Zeitbegrenzung einbauen. Da manche ereignisse OnIdle verhindern, kommt es sonst zu extremen Zeitsprüngen. Ich verwende üblicherweise 100ms=10fps als maximale zeitdifferenz.

Außerdem solltest du unbedingt probieren deinen Prozess an einen Kern zu binden geht testweise im Taskman und ansonsten mit SetThreadAffinityMask.

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mär 02, 2008 16:01 
Offline
DGL Member

Registriert: Fr Feb 22, 2008 18:00
Beiträge: 10
The-Winner hat geschrieben:
Wenn du nur 1x pro frame die Zeit misst (was ich auch empfehle) musst du auf jeden fall eine Zeitbegrenzung einbauen. Da manche ereignisse OnIdle verhindern, kommt es sonst zu extremen Zeitsprüngen. Ich verwende üblicherweise 100ms=10fps als maximale zeitdifferenz.

Außerdem solltest du unbedingt probieren deinen Prozess an einen Kern zu binden geht testweise im Taskman und ansonsten mit SetThreadAffinityMask.


"Was meinst du mit maximaler Zeitdifferenz? das kapier ich nicht ganz...
aber der Rest ist einleuchtend.
Werde das gleich mal versuchen.

Doch dazu wieder die gleiche Frage:
wie machen andere das? den mauszeigerschatten haben ja viele an, und trotzdem laggt es nicht wie mit nem Holzmodem. Also ich mein das is zwar irgendwo ne möglichkeit das Sinnvoll zu messen, ist aber trotzdem noch keine Lösung des Problems.

Und ausserdem: wie konkret binde ich meine Anwendung an einen Kern? Und wie ist das mit Virtuellen Kernen? Funktioniert das da genauso?

lG Green


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mär 02, 2008 16:32 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Das selbe Problem hatte ich auch als ich auf einen Doppelkern umgestiegen bin. Hier liegt der Ursprung im Idle-Event. Um das Problem zu umgehen reicht es also i.d.R. einen eigenen Renderloop zu straten und auf den Idlehandler zu verzichten. Also ganz einfach nach Anwendungsstart nen Timer anstossen, der dann beim ersten Aufruf den Renderloop startet (z.b. eine simple repeat...until Quit; - Schleife).

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mär 02, 2008 17:23 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
und wenn man solche Probleme bei anderen Anwendungen gibt es für AMD-Prozessoren auch noch dieses Tool (erster Eintrag).

Das merzt das aus, aber fragt mich nicht nach technischen Details :wink:

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 Mär 02, 2008 22:36 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
Es gibt eine funktion die wenn ich mich richig erinnere SetThreadAffinityMask hieß die einen thread an einen kern bindet. Näheres findest du sicher in der MSDN. Testweise kannst du das auch im Taskman erledigen. (Im kontextmenü eines Prozessen kannst du die erlaubten CPUs einstellen).
Mit maximalerer zeitdifferenz meine ich, dass wenn deine berechnete Zeitdifferenz größer ist als ein bestimmter Schwellenwert, z.B. 0.1s du ihn auf den Schwellenwert herabsetzt. Das ist natürlich nur in singleplayerspieler empfehlenswert.

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mär 04, 2008 10:43 
Offline
DGL Member

Registriert: Fr Feb 22, 2008 18:00
Beiträge: 10
Hmm, das is jetzt viel Information auf einmal.
Also ich will natürlich höchste Genauigkeit und Maximalen Usercomfort.
Also fällt die Methode "TaskMan" wohl eindeutig aus...

Das mit der AffinityMask sieht schon eher danach aus...

Allerdings hab ich bei dem Timer meine Bedenken:
Das soll wohl Performancemässig nicht so der hit sein. Ich mein Prinzipiell ist ja die "Idle Methode" schon sinnvoll und praktisch.
Könnte das Problem sich durch die Bindung an einen Kern lösen?

lG Green


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 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.021s | 16 Queries | GZIP : On ]