Frameunabhängiges Prog. + Animationen unmöglich?
Übersicht

![]() |
skatanistBetreff: Frameunabhängiges Prog. + Animationen unmöglich? |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo,
Ich habe mir mal verschiedene Methoden getestet, um frameunabhängig zu programieren. Dabei scheinen nur 2 Möglichkeiten bei Blitz3d in Frage zu kommen: 1. Rendertweening 2. mit "DeltaTime" Leider habe ich beim RenderTweening(was mir eig. mehr zusagt) teilweise ein eigenartiges Kantenflimmern, welches ich auch nicht wegbekommen habe(weiss da jmd zufällig was drüber?). Also habe ich die andere Methode benutzt. Nur gibt es ein Problem beim Animieren. Da ich die Geschwindigkeit der Animation für mein Mesh immer nur beim Start der Ani festlegen kann (mit Animate Mesh, Geschwindigkeit), scheint es unmöglich, eine immer gleichbleibende, sichtbare Geschwindigkeit zu erzwingen (die Framerate verändert sich ja auch während die Animation läuft!). Ist es vil. möglich die Animationsgeschwindigkeit explizit während einer Ani zu verändern? Hab nix in der Hilfe gefunden... ![]() Das gleiche Prob tritt natürlich auch beim Rendertweening auf, da für eine Animation "UpdateWorld" entscheident ist, welches ebenfals variabel oft pro sekunde ausgeführt wird. Und nun die Frage: Wie macht ihr das bei euren Spielen? Mit Waittimer?! ![]() Ich hoffe mal auf ein paar kompetente Anworten von den Profis hier! Danke schonmal. cya |
||
![]() |
Lord_Vader |
![]() Antworten mit Zitat ![]() |
---|---|---|
Lol Deltatime und Waittimer ist schlecht. Was ist rendertweening. Bitte erklären hab ich selbst in diesem forum nie gelesen.
Ich glaube die meisten machen das ganze mit BlitzBasic: [AUSKLAPPEN] MilliSecs(). Das gibt die Zeit seit dem ?Windowsstart? zurück. Beispiel zur abfrage der vergangenen Zeit: BlitzBasic: [AUSKLAPPEN]
MfG Lord_Vader |
||
![]() |
Jan_Ehemaliger Admin |
![]() Antworten mit Zitat ![]() |
---|---|---|
Aloa, LV, das war die Falsche antwort.
http://blitzbase.de/befehle3d/updateworld.htm schaue da, der Optimale Parameter, --> BlitzBasic: [AUSKLAPPEN]
|
||
between angels and insects |
![]() |
skatanist |
![]() Antworten mit Zitat ![]() |
---|---|---|
Jan_: wow...danke, das ist genau das richtige ![]() hat sonst jmd. vil. eine idee wieso es zu diesen unschönen grafikfehlern beim rendertweening kommt? das wär mir als methode eigentlich lieber... (ein Besipiel zum rendertweening gibts in einem sample von Blitz3d: "...\Samples\Blitz 3D Samples\mak\castle\castle.bb") |
||
MegaTefyt |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Keine Ahnung ob dir das hilft, aber ich hatte auch Probleme damit, und zwar immer genau dann, wenn ich neue Objekte erstellt habe. Dann waren diese komischerweise zu Beginn immer an einer Stelle, wo ich sie gar nicht hingesetzt hatte und erst danach normal.
Lösung des Problems war das CaptureWorld (welches ja auch in der Castle-Demo verwendet wird). Habe ich die neuen Objekte NACH dem CaptureWorld-Befehl erstellt, dann gab es Probleme, sobald ich sie davor erstellt habe ging es einwandfrei. Hatte dazu auch einen Thread: https://www.blitzforum.de/viewtopic.php?t=13086 |
||
horstböhse |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo!!
Ich klink mich mal mit ein, stehe nämlich vor selbigem Problem!! Ich möchte gern die Framerate beliebig begrenzen können, da ich das für mein Netzwerkkonzept brauche!! Mit Delay() oder Waittimer() ruckelt das ganze extrem, auch wenn nur 56, statt der bei mir optimalen 60 Frames pro Sek laufen!! Nun habe ich das mit dem Zeitparameter von Updateworld gelesen, aber der hat bei mir absolut keinen Einfluss, ob ich ihn nun auf 0.1 oder 500 setzte!! Woran liegt das? |
||
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@horstböhse
Wenn du die Framerate begrenzen willst mußt du nur die Zeit messen die deine Hauptschleife braucht und am ende die Zeit die übrig ist pro Frame mit Delay verzögern . Da sollte nix ruckeln wenn du es richtig machst . Ruckeln könnte es auch wenn anderer scheiß im Hintergrund läuft . WaitTimer habe ich noch nie benutzt . |
||
furbolg |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@Markus:
Doch da kann was "wackeln" weil die Zeit auch unterschiedlich ist, man kann dies kompensieren wenn man einen Mittelwert der letzten 10 Frames o.a. nimmt. @Topic: Wieso macht ihr das alles Frameabhängig ? Ich dachte immer Animationen sind Zeitabhängig. 100ms sind bei 100 FPS und bei 50 FPS immer gleich viele. |
||
horstböhse |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke ertmal!!
Das mit dem Delay hab ich schon so gemacht, und es ruckelt regelmäßig, was ziemlich nervt!! Also, mit dem Mittelwert der letzten 10 Frames muss ich es mal ausprobieren!! Aber was ist mit UpdateWorld? Wofür ist der optionale Zeitparameter? |
||
![]() |
Jan_Ehemaliger Admin |
![]() Antworten mit Zitat ![]() |
---|---|---|
der wert ist für die interpolierte Animation von Blitzseitenaus (loadanimmesh)
für Frameunabhängigkeit, brauchst du den Zeitunterschied zum letzten ausführen des Frames, Code: [AUSKLAPPEN] t1=t2 t2=millisecs() deltaT=t2-t1 dieser ist der Multiplikator, der Bewung/die (1000.0/gewünschte Framerate) Code: [AUSKLAPPEN] ;Alt ;playerx=playerx+playerspeed ;Neu: ;1000.0 / 100 FPS = 10.0 playerx=playerx+(playerspeed/10*deltaT) |
||
between angels and insects |
horstböhse |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Jaja, das ist alles klar!!
Framerateunabhängig ist es!! Aber bei Frameraten unter den optimalen 60 ruckelt es!! Ich geh mal davon aus, dass die Genauigkeit von Delay (1ms) nicht ausreichend ist, und dass das Ruckeln durch Rundungsfehler zustande kommt!! So hab ichs bis jetzt realisiert: Code: [AUSKLAPPEN] ;Zu erzwingende Framerate
framerate=50 .Spielschleife While Not KeyHit(1) ;Systemzeit nehmen systime=MilliSecs() (...) UpdateWorld RenderWorld (...) Flip ;Die Restliche Zeit bis die framerate erreicht ist, mit delay füllen ;Dabei abrupte Wartezeitänderung vermeiden! diffwarten# = (1000/Float(framerate)-(MilliSecs()-systime)) - warten# warten# = warten# + diffwarten * 0.1 Delay(warten) Wend |
||
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich mach das so
@horstböhse du zeigst erst das Bild und wartest dann ... wenn dein Rechner zu lange für die Schleife braucht wird es auch immer ruckeln und wie gesagt andere Programme oder Dienste können dein Programm auch stark ins schwanken bringen ... Und ich habe festgestellt das die NVidia Treiber immer schlechter werden ... Code: [AUSKLAPPEN] Local t1# Repeat t1 = MilliSecs() ... RenderWorld While Abs(MilliSecs() - t1) < 20.0 ;schneller als 1/50 sekunde = 20 ms ??? :-) Dann kurze Pause machen ! ;wenn man hier END einbaut und das Programm sich beenden ist der Computer schnell genug ;-) ;nix machen :-) Wend Flip |
||
horstböhse |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Meinst du ungefähr so?
Code: [AUSKLAPPEN] While((MilliSecs()-systime) < 1000/Float(framerate))
Delay(1) Wend ;Tatsächliche Framerate berechnen ;Abruppte Framerateänderung vermeiden diffframe#=1000.0/(MilliSecs()-systime) - frameratetat frameratetat = frameratetat + diffframe * 0.01 Flip Aber es ruckelt immer noch!! ![]() Verstehe ich dich richtig, und du meinst, dass durch Delay kurz Rechenzeit an andere Programme und Services abgegeben wird? Dann könnte ich die Pause ja wie früher mit einer For-Schleife oder so machen!? |
||
horstböhse |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Auch wenn ich die While-Schleife leer lasse, ruckelt es!! ![]() Ist es überhaupt Möglich ruckelfrei eine Framerate von zB 50 zu erzeugen? |
||
Klaas |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
also ich hate mit diesem Framework immer sehr viel Erfolg
http://www.blitzbasic.com/code...php?code=9 |
||
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@horstböhse
die normale API Delay Funk. läßt die Events von Windows weiter zu , sollte aber egal sein . Meß doch mal wieviel Zeit deine Schleife braucht . Ohne warten die Frame Rate anzeigen lassen ! Da solltest du weit über die 50 FPS drüber sein und wenig abweichungen drin haben . Wenn dem so ist kannst du davon ausgehen das das ruckeln durch blöde Dienste verursacht werden die im hintergrund meinen was machen zu müssen . Wenn dein Rechner richtig läuft haste so 1-3 Frames Toleranz bei fast gleicher ausführung des Codes . Was auch ruckler verursacht ist wenn man Funktionen die viel Rechenzeit brauchen nur alle X Frames aufruft . |
||
horstböhse |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Damit funktionierts mit der Framerate!! Aber die Grafik verhält sich plötzlich sehr komisch!! Objekte sind zu sehen, die eigentlich nicht da sein sollten usw.
Ich glaube, immer, wenn ich Alpha benutze! |
||
Klaas |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Benutzt du jetzt Rendertweening? Wenn ja, da gabs mal nen Bug mit Alpha. Hast du denn auch die neusten Updates eingespielt? | ||
horstböhse |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ja, genau, wenn ich Rendertweening mache, sind alle Sachen, die mit Alpha funktionieren, irgendwie fehlerhaft!!
Wo bekomme ich denn die neusten Updates her? Hab im Netz gesucht aber immer nur den Hinwes, dass es ein neues Update gibt, gefunden, aber nirgendwo einen Link!! Rendertweening wäre dann glaub ich die Lösung meines Problems!! Wenn ich das richtig sehe, sorgt das Framework dafür, dass die Grafikframerate und die Spielframerate unabhängig voneinander laufen können. Das ist genial!! Danke dür den Tip! ![]() |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
www.blitzbasic.com Community und dort im Blitz3D Board unter Updates. Das setzt voraus, dass du deine BUID auf blitzbasic.com registriert hast nachdem du Blitz3D gekauft hast.
Die aktuellste Version ist übrigens 1.91 |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group