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

Aktuelle Zeit: Mi Jul 16, 2025 20:14

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



Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Feedback: Tutorial Quickstart
BeitragVerfasst: Mi Jan 11, 2006 01:07 
Offline
DGL Member

Registriert: Mi Jan 11, 2006 00:37
Beiträge: 2
Wohnort: CH-6315 Alosen
Hi.

Zuerst einmal: vielen Dank, daß ihr mich an die Hand nehmt und schrittweise erklärt, was wann zu machen ist und wie etwas funktioniert; Klasse Leistung.

Das erste Tutorial (Quickstart) habe ich jetzt also gelesen und verstanden. Imho. ;-)
Das Beispiel funktioniert auch (die Grafik wird angezeigt), aber ...
... ein ganz klitzekleines Problemchen hab ich noch: Caption zeigt mir keine FPS-Werte an, da steht nach dem Programmstart einfach nur: "no error", auch, wenn ich die Fenstergröße verändere.
Die DGLOpenGL.pas ist eingebunden, gearbeitet wird in Delphi 7, OnCreate = FormCreate, OnDestroy = FormDestroy, OnResize = FormResize. Ansonsten sieht der Code genauso aus wie der Code von Deathball in viewtopic.php?t=4544&highlight=tutorial+quickstart, eingeschlossen der dort fehlenden "Application.OnIdle := IdleHandler;"-Zeile.
Woran kanns liegen?

Vielleicht gibts ja einen Zusammenhang mit folgender Erscheinung, in der Anmerkung zu obiger Idle-Zeile schreibt Flash:
"Wie ihr bald selbst feststellen werdet, sorgt diese Methode für eine hundertprozentige Prozessorauslastung. Umgehen könnt ihr dies mit einem kleinen Trick:
Fügt vor dem "Done := false" (Zeile 17 des IdleHandlers) noch ein sleep(1) oder sleep(5) ein. Dadurch sinkt die Prozessorlast auf ca. 80%, was schon ein Fortschritt ist. "
Hmmm, das ist bei mir nicht so, wenn ich sleep einfüge, habe ich eine Prozessorauslastung von maximal 1%; wenn ich sleep weglasse, schwankt sie bei Resize zwischen 3% und 8%. Wo mache ich den (Denk-)Fehler?

Cu, Honig.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 11, 2006 11:01 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Das Application.OnIdle kannst du auch mittels einer Komponente setzen lassen. Dann taucht es nicht im Code auf wird aber intern dennoch gesetzt. Zu finden ist diese Komponente auf der Komponentenleistenseite (geiles Wort. :-) ) "Zusätzlich" und dort die Komponente mit dem Blauen Kreis, der Fackel und den 3 Pfeilen. Als Event gibt es dort OnIdle. So ist es auch in dem VCL Template gemacht wurden.

Warum du keine FPS siehst kann ich dir Sagen. Du darft das auch nicht ganz so machen wie in dem Code aus dem Forum. Durch den ErrorHandler wird der Fehlerwert abgefragt und dieser wird IMMER als Caption gesetzt. Wenn du also vorher mal deine FPS in die Caption geschrieben hast dann wird diese sofort wieder überschrieben. Besser wäre es, wenn du den Wert von glGetError in eine Variable Schreibst und nur wenn diese dann <> 0 ist rufst du gluErrorString auf. Allerdings mit der Variable als Parameter, da glGetError den Fehler nach dem Abfragen löscht. Somit würde folgender Code immer No error liefern auch, wenn du fehler hättest.
Code:
  1.   if glGetError <> 0 then
  2.     Form1.Caption := gluErrorString(glGetError);


Zur CPU Leistung. Du musst alle Event bei dem Formular gesetzt haben. FormResize etc. OnIdle musst du auf dem ein oder andern Weg bei der Application gesetzt haben. Ich denke mal das da das Problem ist. Also wenn du mit deinem Fenster nichts machst dürftest du auch eine CPU Auslastung von gegen 0% haben, oder?

PS: Danke für die Blumen. Im Anschluss an meinen Beitrag werde ich das Thema auch ins Einsteigerforum verschieben. Ist ja gering mehr Frage als Beweihräucherung. ;-)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 11, 2006 20:17 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Also wenn du was siehst (-> es geht) und dein Prozessor mit OnIdle nicht 100% leistung hat, dann sag ich mal: Solche Prozessoren sollte man in Notebooks einbauen. Bei mir ist OnIdle gleichbedeutend mit 100 Leistung gleichbedeutend mit "Akku alle" ;)

Du kannst ja mal deinen Code hier posten. Mal gucken ob da irgendwas anders is als gedacht.

PS: Schön das der Quickstart gefällt. 8)

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 12, 2006 00:25 
Offline
DGL Member

Registriert: Mi Jan 11, 2006 00:37
Beiträge: 2
Wohnort: CH-6315 Alosen
Erst einmal vielen Dank für die beiden Antworten.
Leider hat sich vorhin ein Projektleiter mit seinem Auto überschlagen (aber keine Lebensgefahr) und ich muß jetzt erst einmal zusehen, wie ich bis morgen früh an Ersatz komme. Ich melde mich morgen wieder.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 12, 2006 08:50 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
:shock: Das klingt ja heftig. Dann mal gute Besserung an den Pechvogel.


Mal noch was zum Thema OnIdle. Ich wäre durchaus interessiert, wie ihr im OnIdle Rendert, ohne 100% CPU Auslastung zu bekommen. Kannst du uns einen kleinen Codeschnipsel zeigen, wo man sieht, wann eure Zeichenfunktion aufgerufen wird?

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 12, 2006 09:32 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Unfall: Das ist ist ja nicht so gut. Dann drücke ich mal die Daumen, dass nichts mehr passiert und das Projekt dennoch weiter geht.

Flash: Kannst du in dem du Done weglässt oder auf True setzt. Dann rauschen nämlich nicht ständig Events rein sondern nur ab und an. Allerdings ist das dann noch zufälliger als mit einem recht ungenauen Timer. Bei Animationen oder so dürfte das meiner Meinung nach ziemlich doof aussehen. Weswegen meiner Meinung nach voll power das Sinnvollste ist. Das kann man dan immer noch bremsen. Und das könntest du machen in dem du Zeit für das einzelne Frame misst und dann entsprechend das Sleep modifizierst. Je nachdem wie stark der Rechner ist würde es wegfallen oder größer werden. Somit wäre es möglich annähernd 30 FPS auf jedes System zu Zaubern. Gepaart mit Timebased Movement dürfte das ein abgerundetes Bild ergeben woran sich auch Notebook Besitzer erfreuen dürften.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 12, 2006 15:23 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Für sowas wäre eine Klasse gut: DGLFrameManager. Der sorgt dafür das alles immer schön Funktioniert, und keiner seinen Akku leer zaubert, mit bisl OGL. 8)

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 12, 2006 15:45 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Eigentlich ist da ja nichts viel dahinter. Das ist nur ein kleiner Zusatz im OnIdle.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 13, 2006 15:23 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Und genau dafür schreibt man sich ja sein eigenes Template ;)

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 13, 2006 16:41 
Offline
DGL Member

Registriert: Mo Dez 20, 2004 08:58
Beiträge: 442
Wohnort: Mittweida (Sachsen)
Imho kann das daran liege, dass wenn man in der Einstellung für den Graphiktreiber die Synchronisation mit der Bildwiederholfrequenz einschaltet, OGl mit dem Rendern wartet, bis neues Bild dran ist.
Wenn er jetzt theoretisch 600 frames KÖNNTE, aber die Frequenz 60 Hz ist, liegt die Auslastung durchaus bei 10%.
Ich kann mich aber auch irren ;)

_________________
Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 14, 2006 21:06 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Okt 14, 2006 14:48
Beiträge: 7
hallo

also ich habe mich nun auch daran gemacht opengl zu lernen... klappt bisher auch schon sehr schön^^ nur mit der steuerung in einer 3d-welt komm ich weniger klar.. da sich ja die welt bewegen muss nicht der betrachter selbst, wie es dort stand...
unsgesammt gefallen mir die tutorials sehr..

und nun zum quickstart... also dort ging bei mir auch keine fps-anzeige... auch nachdem ich das mit dem if im errorhandler hatte.. dann stand dort nur form1 ebend...

ich hab es dann so gelöst:

Code:
  1. procedure TForm1.IdleHandler(Sender: TObject; var Done: Boolean);
  2. begin
  3.   Render;
  4.   Inc(FrameCount);
  5.   timecount:=GetTickCount+rest;
  6.   if timecount-StartTime >= 1000 then begin
  7.     rest:= (timecount-StartTime) - 1000;
  8.     StartTime:= GetTickCount;
  9.     Frames:= FrameCount;
  10.     FrameCount:= 0;
  11.     inc(sekcount);
  12.     Caption:= InttoStr(Frames) + ' FPS - R ' + inttostr(rest) + ' - TC '+inttostr(GetTickCount)
  13.      +' - N '+InttoStr(sekcount);
  14.     ErrorHandler;
  15.   end;
  16.   sleep(1);
  17.   Done:= false;
  18. end;

..hoffe hab nix vergessen, aber so ging es dann.. und wie man im tickcount sieht bleiben auch die letzten 3 stellen so immer gleich (teste kann man das, indem man das fenster größer zieht und dann aber die mausgedrückt hält.. bei mir blockiert die anwendung dann.. und so bildet sich der rest..dieser wird dann immer abgebaut)

mfg

edit: und im oncreate muss starttime mit getickcount belegt werden...

edit2: und nochwas zur cpu auslastung.. die ist bei mir ohne ein sleep bei 100% und mit dem 1er sleep schon runter auf so 5% ca.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 08, 2006 15:46 
Offline
DGL Member

Registriert: Di Sep 19, 2006 13:24
Beiträge: 173
Hi,

ich hoffe ihr verzeiht mir meine Einsteigerfrage aber ich habe ziemliche Probleme mit dem OnIDLE.

Ich schreibe gerade an einem Pong-Klon und lasse das Ganze mit einem Timer zeichnen und berechnen. Leider ist der Timer so langsam das ich den Ball und auch die Balken der Spieler ziemlich springen lassen muss. Das mit dem Ball ist nicht so schlim (es gibt nur nen paar Probleme wegen der Kollisionsabfrage) aber die Balken sind entweder zu langsam (+3 Pixel pro Timerdurchlauf) oder zu ungenau (+7 Pixel pro Durchlauf).

Das hemmt den Spielspaß dann schon ziemlich besonders da das Spiel auf Schnelligkeit ausgelegt ist.

Ich habe mir jetzt mal den OnIDLE Vorschlag im Tutorial angeschaut aber leider funktionierte er nicht bei mir, wenn ich jetzt den von Timi-loader geposteten Vorschlag benutze fürt er den Inhalt der if TimeCount Schleife zwar aus aber nicht wie ich möchte jede Sekunde sondern jede 10.000stel Sekunde oder so...

Das mit dem TimeCount ist doch da um eine definierte Bewegung zu erreichen oder? Ich möchte mein Programm online-fähig machen und dafür muss es auf jedem Rechner schon exakt gleichschnell laufen.. (ich bezweifle das der ping ausreicht um den Server jede Bewegung senden zu lassen..)

Warum geht das nicht so wie ich es will? Oder habe ich das falsch verstanden? Ist mit OnIdle keine genormte Geschwindigkeit möglich?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 08, 2006 20:42 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
Du kannst in onidle nicht direkt eine Geschwindigkeit normen, aber du kannst in verbindung mit gettickcount(oder genauere alternativen) timebased movement anbieten:
Code:
  1.  
  2. var LastTick,Currenttick:Cardinal;
  3.       DeltaT:single;
  4. procedure TForm1.onIdle(...);
  5. begin
  6.  Done:=false;
  7.  Currenttick:=gettickcount;
  8.  DeltaT:=0.001*(Currenttick-Lasttick);
  9.  if DeltaT>0.1 then DeltaT:=0.1;//Sprünge verhindern, max 100ms auf einmal
  10.  if DeltaT<0 then DeltaT:=0;//49.7 Tage Bug vermeiden *g*
  11.  if DeltaT<0.01 then begin sleep(1);exit;end;//Begrenzung auf 100FPS, vermeidet unnötige cpu-last
  12.  //TickCode begin
  13.  x:=x+vx*DeltaT;//Beispiel, vx in Pixel/Sekunde
  14.  y:=y+vy*DeltaT;//Beispiel, vy in Pixel/Sekunde
  15.  //TickCode end
  16.  LastTick:=Currenttick;
  17. end;
  18.  

(ungetestet)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 08, 2006 21:17 
Offline
DGL Member

Registriert: Di Sep 19, 2006 13:24
Beiträge: 173
Erstmal vielen Dank für die Mühe.

Code:
  1. procedure TForm1.IdleHandler(Sender: TObject; var Done: Boolean);
  2. var
  3. DeltaT, numbertmp : single;
  4. Currenttick : integer;
  5. begin
  6. Done:=false;
  7. Currenttick:=gettickcount;
  8. DeltaT:=0.001*(Currenttick-Lasttick);
  9. if DeltaT>0.1 then DeltaT:=0.1;//Sprünge verhindern, max 100ms auf einmal
  10. if DeltaT<0 then DeltaT:=0;//49.7 Tage Bug vermeiden *g*
  11. if DeltaT<0.01 then begin sleep(1);exit;end;//Begrenzung auf 100FPS, vermeidet unnötige cpu-last
  12. //TickCode begin
  13. numbertmp := numbertmp + 5 * DeltaT;
  14. label1.caption := inttostr(round(numbertmp));
  15. //TickCode end
  16. LastTick:=Currenttick;
  17. end;


Also das hier bringt keine Veränderung der Zahl, wenn ich sie als Flusskommerzahl anzeigen lasse verändet sie sich ganz schnell aber anscheinend vor und zurück.. Kannst du mir erklären was gettickcount ausgibt damit ich vielleicht das Prinzip verstehe?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 09, 2006 17:12 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
gettickcount liefert die Zeit in Millisekunden seit Systemstart zurück. Damit wird in DeltaT die Zeit in Sekunden seit dem letzten frame gespeichert. Entsprechend dem Gesetz s=v*t musst du alle Bewegungen als Geschwindigkeit*Zeit verwenden. Im Wiki gibts es afair auch einen artikel dazu. Such mal nach Timebased Movement oder frameratenunabhängige Programmierung.


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


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 | 14 Queries | GZIP : On ]