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>
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??
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:
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:
procedure TForm1.FrameTimerOnTimer()
...
begin
ZeichneSzene;
SwapBuffers(D);
end;
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> )
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.
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.