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

Aktuelle Zeit: So Jul 06, 2025 14:23

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



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mi Jan 15, 2003 19:24 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 15, 2003 19:14
Beiträge: 23
Ich hab mit der Hilfe der Tutorials opengl inizialisiert in einem meiner
alten Delphi Programme, d.h mit VCL.

Ich will nun einen Timer ablaufen lassen, der die objekte festlegt, die auf
den Bildschirm kommen und ausgibt. Im Tutorial wird angegeben, dass
man an einer bestimmten Stelle (im application event on idle) seinen
Code vor Swap Buffers() eingeben soll.

Dieser wird aber dann nur unregelmäßig aufgelistet, es soll ein
richtiger Timer sein.

Aus den Tutorials werd ich nicht mehr schlauer ( sitz schon 4 Tage dran)
Bitte helft mir

<span style='color:red'>Hinweis vom Moderator : Für solche Fragen haben wir ein Einsteiger-Forum, deshalb hab ich ihn auch dorthin verschoben - Son of Satan</span>


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 15, 2003 19:33 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 02, 2002 15:41
Beiträge: 867
Wohnort: nahe Stuttgart
Zuerst mal was allgemeines: Das heißt Initialisierung und Anfängerfragen gehören doch in ein anderes Board, oder?

Ich versteh leider nicht ganz, was du mit "unregelmäßig aufgelistet" meinst. Du musst in OnIdle irgendwo auch
Code:
  1. Done := False
aufrufen.

Ansonsten würde ich im OnIdle einen Timer mit
Code:
  1. inc(zahl,erhöhen); {und} dec(zahl,erniedrigen);
machen. Am besten Leistungsunorientiert, da haben wir glaub ich schon in Allgemein drüber gesprochen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 15, 2003 19:47 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 15, 2003 19:14
Beiträge: 23
also
done:=false;
steht da bei mir auch drin
(Die procedure on idle wird trotzdem unlregelmäßig aufgerufen)


ich weiß nicht ganz was du mit dem:

inc(zahl,erhöhen); {und} dec(zahl,erniedrigen);

meinst

etwa das timer interval??

Ich hab allerdings nicht viel Ahnung warum man seine Sachen, wie
der Aufruf von einer Zeichen oder Berechnungsfunktion in
on idle schreiben soll. Die sollen doch regelmäßig ausgeführt werden
und nicht mal irgendwie so, oder was soll man da denn reinschreiben??


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 15, 2003 19:52 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 02, 2002 15:41
Beiträge: 867
Wohnort: nahe Stuttgart
Im OnIdle sollte eigentlich regelmäßig (je nach GraKa) gerendert werden.
Das was du da hinschreiben sollst, wird dir ausführlich ab Einsteigertut 2 erklärt. Ansonsten load dein Progg mal auf dem FileServer (www.delphigl.com => Filez => ganz unten) up, damit man sich die Sache mal ansehen kann.
@inc & dec:
ich meinte damit ungefähr folgendes:
Code:
  1.  
  2.  
  3.  inc(xyz, 1);
  4.  
  5.  if xyz = 500 then
  6.  
  7.  begin
  8.  
  9.  &nbsp;DrawFirst;
  10.  
  11.  end
  12.  
  13.  else if xyz = 9000 then
  14.  
  15.  begin
  16.  
  17.  DrawSecond;
  18.  
  19.  end;
  20.  
  21.  


EDIT: @SoS: Trifft mal wieder genau den Punkt. :wink:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 15, 2003 19:53 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
OnIdle wird wenn Done := False gesetzt ist nicht unregelmäßig aufgerufen, sondern permanent, sodass dem OpenGL-Programm die komplette CPU-Zeit zum Berechnen und Zeichnen der Szene zur Verfügung steht.Das mach im Normalfall auch Sinn.
Wenn man seine Szene so zeichnet, und im OnIdle-Event dann noch Objekte ordnungsgemäß bewegen will, muss man allerdings mit nem Renderzeit-abhängigem Zeitfaktor arbeiten, der die Objekte je nach Zeichengeschwindigkeit gleichmäßig bewegt, denn diese variiert ja von Rechner zu Rechner und Szene zu Szene.

Für einfache Anwendungen reicht hingegen ein Timer, dem du einen festen Intervall gibts (z.B. 50ms) und in den du dann z.B. so deine Zeichenroutine aufrufst :
Code:
  1.  
  2.  
  3. procedure TForm1.FrameTimerOnTimer()
  4.  
  5. ...
  6.  
  7. begin
  8.  
  9. ZeichneSzene;
  10.  
  11. SwapBuffers(D);
  12.  
  13. end;
  14.  
  15.  

Timer sind jedoch wie schon gesagt schlecht, da sie nur in Intervallen aufgerufen werden und OpenGL seine volle Kraft so nicht entfalten kann.
Ausserdem sind die normalen Windowstimer schlecht aufgelöst.Selbst wenn du einen Intervall von 25ms festlegst, bekommst du im Besten Fall einen Intervall von 50~55ms.
Ausserdem schlecht wirds, wenn ein Rechner so langsam ist, dass er deinen angestrebten Intervall nicht bereitstellen kann.

Am besten beschäftigst du dich also mit der von mir oben erwähnten Methode, die sich im Englischen ürigens "Time based movement" nennt, und zu der es im Netz etliche Tutorials gibt. (z.b. auf <a href='http://www.gametutorials.com' target='_blank'>http://www.gametutorials.com</a> )

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 15, 2003 20:06 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 15, 2003 19:14
Beiträge: 23
danke :D

jetzt hab ich so einiges mehr verstanden


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 15, 2003 20:43 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Mai 06, 2002 10:50
Beiträge: 42
Wohnort: [Auch diese Steine können Sie klauen...]
Zitat:
Selbst wenn du einen Intervall von 25ms festlegst, bekommst du im Besten Fall einen Intervall von 50~55ms.

Soviel ich weiß, gilt das nur für Win95/98/Me. Bei NT/2k/XP beträgt die minimale Timerauflösung meines Wissens nach 10ms.
Trotzdem würde auch ich wegen o.a. Gründe den Renderloop nicht von einem Timer ausführen lassen.

Gruß
Armin


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


Wer ist online?

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