??? Ist das denn unelegant? Und ich würde sagen, dass 60 FPS reichen, mehr brauch man doch gar nicht, 100 FPS maximal, aber 200 FPS ist doch sowas von unnötig!
Ich mache das Delay ja auch nur zum simulieren von schlechteren Framerates. Im programm selbst verwende ich ja normalerweise keine Delays. Die niederen Frames kommen noch, wenn das Programm komplexer wird, oder ich VSync einschalte. Und da Vsync sowieso von Vorteil ist, lass ich das auch vorerst an. Vielleicht mach ich das später noch anders, ich wollte ja ursprünglich auch nur eine Benutzungsmöglichkeit für Delay erläutern, weil danach gefragt wurde.
@ptI
Was macht Dein Programm, wenn der Rechner so schwach ist, daß er die erforderte Framezahl nicht schafft? Bewegung und Animation sollten besser Zeitgesteuert ablaufen. Oft ist es auch in einem Game so, daß Zeitweise mehr Rechenleistung benötigt wird, also wirst Du wohl eher selten ein Game permanent mit 60 Frames laufen haben, es sei denn es ist nicht Anspruchsvoll oder der Rechner hat weit mehr Power als benötigt wird. Ich glaub im alten Board gabs da schon eine ähnliche Diskusion mit weit mehr argumenten gegen die SetFrameRate - Methode.
@Sunny
Bei einem Prog ohne Delay wird der CPU doch zu 100% ausgelastet, wär es da nicht sinnvoll mindestens einen Delay(1) mit einzubauen? (vSync vergleicht das auszugebene Bild nochmal mit dem im GraKaSpeicher vorhandenen Bild, stimmts? Oder sowas Ähnlichs?)
@CSprengel
Mein PC schafft eigentlich gerade noch so die erforderlichen FrameRate's, obwohl das Beispiel (war nur für Testzwecke gedacht) kein bisschen anspruchsvoll ist. Das liegt wohl daran, dass der Code noch sehr unoptimiert ist, den ich aber auch schon vor einem Jahr geschrieben habe. Danach habe ich lange nicht mehr Programmiert, und jetzt fange ich wieder an. Eine Frage zu zeitgesteuerter Animation; Nimmst du dazu GetTicketCount_() (bzw. ElapsedMilliseconds()) und wie machst du das dann genau? Gibt es irgendwas, was man auf jeden Fall beachten sollte?
Leider bin ich da nur ein Theoretiker. Aber ich weiß, daß GetTicketCount_() zu langsam bzw. ungenau ist. Im alten Forum gibt es aber ein gutes Beispiel über QueryPerformanceCounter_() und QueryPerformanceFrequency_() von Rings. Ich selbst hab das mal benutzt um die Zeitunterschiede zwischen den Frames zu messen und das bei über 600 FPS, daß wäre mit GetTicketCount_() nicht möglich.
Man sollte beachten, das das ganze auf kosten der Kollisionskontrolle gehen kann.
Angenommen ich renn gerade auf eine Wand zu (die Spielfigur in einen Jump'n'run) und dann passiert zufällig eine Auslastung des Systems (Ein Programm in Hintergrund braucht kurzzeitig extrem viel Resourcen). Die Spielfigur macht dann auf einen mal einen "Ruck" von 16 Pixel und rast durch die Wand durch und ich bin auf einmal an einer Stelle, die nie vorgesehen war.
Was ich damit sagen will:
Man sollte bei der Methode unbedingt beachten, das bei einer gemessenen Zeit unbedingt eine Obere Grenze festgelegt werden muß, so das solche Sprünge nicht mehr möglich sind.
Achja: Diese Methode ist absolut unbrauchbar für Spiele, bei denen es auf absolut genaue Pixel-Überwachung angeht. Da Hilft nur den CPU auszubremsen.
Das ist allerdings ein Problem. Man kann es über Umwege umgehen, aber ich wüsste nicht genau wie. Theoretisch muss man selber ausrechen, welchen weg das Sprite zurückgelegt hat und dann checken, ob das Sprite da irgendwelche Collisions (zB. mit einer Mauer) hatte.
Man kann es umgehen, mit einer sogenannten "Trace" routine. Man geht einfach Schritt für Schritt(meistens Pixel für Pixel) zum Ziel. Wenn sich dazwischen was befindet, soll sich das Sprite nur so weit bewegen(also SpriteX + DistanzX SpriteY + DistanzY).
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Ich find das Thema hier recht interessant, aber eigentlich hat es nicht mehr viel mit dem Ursprungsthema zu tun. Ich weiß jetzt auch nicht, wieviel einige noch dazu zu sagen haben, aber vielleicht könnte ja ein Moderator etwas umlagern und einen Diskussionsthema draus machen.