@Mr_T: Du hast vollkommen recht, ein sleep(10) ist absolut suboptimal - trotzdem wird ein OnIdle mit Done:=false immer 100% Prozessorlast zur folge haben.
Somit also zwei Möglichkeiten: Done:=true - es wird erst wieder gerendert, wenn sich irgendwas verändert hat. Das ist gut, wenn im Render-ereignis
absolut keine Berechnungen(timebased movement etc.) vorkommen. Wenn diese also alle ausserhalb passieren, hat man die ideale frame rate und theoretisch dürfte es nicht ruckeln. Für ein kleines 3d-fenster z.B. in einem Tool sollte das reichen.
oder
Die Lösung mit dem Timer. Damit(TTimer.Interval) kann man effektiv die maximale Framerate festlegen.
Für ein Hochleistungs-3d-Spiel wird aber so gut wie immer die einfache OnIdle-mit-done:=false-lösung die einfachste und richtigste bleiben. Wiederum anders sieht es bei Laptops aus - hier sollte man immer zumindest per config-datei eine möglichkeit zur begrenzung anbieten.