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

Aktuelle Zeit: Di Jul 08, 2025 23:51

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
BeitragVerfasst: So Jun 14, 2009 11:38 
Offline
DGL Member

Registriert: Fr Mai 29, 2009 19:44
Beiträge: 12
Wohnort: Saarland
Hallo,
ich habe mir ein Sonnensystem (wie es im Tutorial Lektion 3 vorgeschlagen war) gebastelt. Allerdings nicht mit Dreiecken, sondern mit texturierten Kugeln. Insgesamt habe ich 4 glSpheres verwendet: Sonne, Erde, Mond & eine als Hintergrund. Soweit klappt auch alles.
Die FPS liegt bei 70 mit
Code:
  1.  
  2. sleep(15);
  3.  


Nun habe ich das ganze auf meinem alten Rechner laufen gelassen. Hier liegt die FPS bei ~70. Sobald ich aber in die Render-Prozedur ein
Code:
  1.  
  2. sleep(15);
  3.  

am ende schreibe, bricht die FPS um die hälfte zusammen. Das gleiche passiert wenn ich das Fenster vergössere.

Würde halt gerne wissen wieso das so ist. Hoffe jemand kann es mir erklären :)

PS: Die CPU auslastung beim alten Rechner liegt mit sleep bei 40%.

Edit:
Hier noch die Daten von meinem alten Rechner:
CPU: 900MHZ (wie der Prozessor heißt, weiß ich jetzt nicht mehr :) )
Arbeitsspeicher: 198
Grafikkarte: GiForce 2 MX

glSphere wird mit Radius 1 und 32 x 32 für die letzten zwei Parameter gezeichnet.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 14, 2009 12:18 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Sleep(15) bedeutet, dass dein Programm 15ms (wahrscheinlich sogar mehr) wartet. Dass dann die FPS einbrechen ist doch klar, da in dieser Zeit nichts gerechnet wird. Wenn du das Fenster vergrößerst erhöht sich dementsprechend die Auflösung. Wenn die Grafikkarte limitiert gehen dann auch die FPS runter, das sollte aber nicht so dramatisch sein.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 14, 2009 12:57 
Offline
DGL Member

Registriert: Fr Mai 29, 2009 19:44
Beiträge: 12
Wohnort: Saarland
Naja, dass mit sleep bedeutet ja, dass der PC 15 ms wartet bis er weiter macht. Auf dem neueren Rechner bleiben die FPS bei 60.

Und dass mit dem Fenster vergrössern... die FPS wird fast um die hälfte reduziert (von 60 auf 32 [ohne den sleep befähl])


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 14, 2009 13:13 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Kami-Oni hat geschrieben:
Naja, dass mit sleep bedeutet ja, dass der PC 15 ms wartet bis er weiter macht. Auf dem neueren Rechner bleiben die FPS bei 60.

Allerdings zusätzlich zu der Zeit die dein Rechner bereits zum Rendern braucht, was beim alten System ja länger dauert. Aber sleep sollte man in einer 3D-Anwendung nie verwenden. Auf einem Desktop rendert man i.d.R. eh so schnell wie möglich, alternativ kann man z.B. für Laptops dann die Frames cappen.

Kami-Oni hat geschrieben:
Und dass mit dem Fenster vergrössern... die FPS wird fast um die hälfte reduziert (von 60 auf 32 [ohne den sleep befähl])

Liegt wohl an der geringen Füllrate der Geforce 2 MX. Das ist wirklich eine extrem alte Karte und war schon bei ihrer Veröffentlichung hoffnungslos langsam, da kann man nicht viel von erwarten. Wenn du das Fenster also größer machst wird mehr Füllrate verbrannt (du schreibst ja nicht genau was bzw. wie du renderst), und das reicht schon um diese Karte in die Knie zu zwingen. Aber pack die Kugel mal in eine Displayliste und schau obs was bringt. Der Datenbus der Karte ist ja auch sehr schmal, evtl. ist die mit der Polygonzahl auch schon fast überfordert.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 14, 2009 13:38 
Offline
DGL Member

Registriert: Fr Mai 29, 2009 19:44
Beiträge: 12
Wohnort: Saarland
Aso ist das ^^
Danke für die Erklärung, dachte schon ich hätte irgend einen Mist zusammen programiert :) Das mit den Display Listen werde ich noch ausprobieren.

Danke :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 14, 2009 13:42 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 20, 2005 13:18
Beiträge: 1054
Wohnort: Dresden
Programmiersprache: C, C++, Pascal, OPL
Schau am besten mal im wiki bezüglich time based movement. In deinem Fall wäre wohl die einfachste Methode die Zeit zu messen, die du für das Zeichnen und berechnen gebraucht hast und dann sleep(15-time) zu machen, wobei time die Zeit ist, die du gebraucht hast. Bedenke aber zweierlei:
1. time sollte hierbei nicht unter 15 fallen (sleep einer negativen Zahl? Klingt nicht wohl definiert), also entweder time dann auf 15 setzen oder
2. "richtiges" time-based-movement, wo Berechnung und Zeichnen getrennt sind. In Pseudocode sieht das (ungefähr) so aus:
Code:
  1.  
  2. newtime = jetzige Zeit;
  3. Hauptschleife:
  4.   time=newtime;
  5.   newtime = jetzige Zeit;
  6.   timedif = time-newtime;
  7.   Berechnungen für "timedif" Zeiteinheiten (meist Millisekunden) durchführen
  8.   Zeichnen (wenn timedif=0 ist u.U. NICHT, weil sich ja eh nichts getan hat)
  9. Hauptschleife ende;
  10.  

Das ist das ganz grobe Vorgehen. Mit wenig Modifikationen lassen sich die FPS begrenzen. Und die jetzige Zeit bekommst du mit dem Queraperformancecounter (oder so) oder mit SDL. SDL ist toll! Aber das führt jetzt zu weit. ^^

LG Ziz

_________________
Denn wer nur schweigt, weil er Konflikte scheut, der macht Sachen, die er hinterher bereut.
Und das ist verkehrt, denn es ist nicht so schwer, jeden Tag zu tun als ob's der letzte wär’.
Und du schaust mich an und fragst ob ich das kann.
Und ich denk, ich werd' mich ändern irgendwann.

_________________Farin Urlaub - Bewegungslos


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 15, 2009 06:58 
Offline
DGL Member

Registriert: Fr Mai 29, 2009 19:44
Beiträge: 12
Wohnort: Saarland
Danke.
Timebased Movement ist dann wirklich eine Alternative. Werde dann sleep rausnähmen und Timebased einfügen :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 15, 2009 14:58 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Was ich bei mir mache ist, ich prüfe die zeit vom beginn des letzten frames bis zum beginn des aktuellen (also grundlage des TBM). Wenn diese < 10ms ist, rufe ich eine Methode auf, wo die Anwendung nebenbei noch etwas abarbeiten oder bspw. einem sekundärthread eine höhere Priorität geben kann und sleepe danach um einen von der Anwendung definierten Wert. So halte ich die CPU-Auslastung in Grenzen und habe immer eine flüssige Darstellung - solange die Leistung insgesamt denn ausreicht.

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  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 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.015s | 17 Queries | GZIP : On ]