Frameunabhängiges Prog. + Animationen unmöglich?

Übersicht BlitzBasic Blitz3D

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

skatanist

Betreff: Frameunabhängiges Prog. + Animationen unmöglich?

BeitragDo, Aug 11, 2005 2:03
Antworten mit Zitat
Benutzer-Profile anzeigen
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... Confused

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?! Rolling Eyes

Ich hoffe mal auf ein paar kompetente Anworten von den Profis hier!
Danke schonmal.

cya

Lord_Vader

BeitragDo, Aug 11, 2005 7:41
Antworten mit Zitat
Benutzer-Profile anzeigen
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]


start=MilliSecs()

;Hier code

gebraucht=MilliSecs()-start




MfG Lord_Vader

Jan_

Ehemaliger Admin

BeitragDo, Aug 11, 2005 8:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Aloa, LV, das war die Falsche antwort.

http://blitzbase.de/befehle3d/updateworld.htm
schaue da, der Optimale Parameter,
-->


BlitzBasic: [AUSKLAPPEN]

Repeat
t2=t1:t1=MilliSecs():t3=)t1-t2
; moveentity entity,xspeed#*t3*Gamespeed#,yspeed#*t3*Gamespeed#,zspeed#*t3*Gamespeed#
UpdateWorld(t3*Gamespeed#)
RenderWorld
Flip 0
Forever
between angels and insects

skatanist

BeitragDo, Aug 11, 2005 12:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Jan_: wow...danke, das ist genau das richtige Shocked
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

BeitragDo, Aug 11, 2005 13:09
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Jan 13, 2006 0:55
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Jan 13, 2006 13:19
Antworten mit Zitat
Benutzer-Profile anzeigen
@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

BeitragFr, Jan 13, 2006 14:39
Antworten mit Zitat
Benutzer-Profile anzeigen
@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

BeitragFr, Jan 13, 2006 14:53
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Jan 13, 2006 14:59
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Jan 13, 2006 18:57
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Jan 13, 2006 19:14
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Jan 13, 2006 19:59
Antworten mit Zitat
Benutzer-Profile anzeigen
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!! Sad

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

BeitragFr, Jan 13, 2006 20:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Auch wenn ich die While-Schleife leer lasse, ruckelt es!! Sad

Ist es überhaupt Möglich ruckelfrei eine Framerate von zB 50 zu erzeugen?
 

Klaas

BeitragFr, Jan 13, 2006 20:17
Antworten mit Zitat
Benutzer-Profile anzeigen
also ich hate mit diesem Framework immer sehr viel Erfolg

http://www.blitzbasic.com/code...php?code=9

Markus2

BeitragFr, Jan 13, 2006 21:38
Antworten mit Zitat
Benutzer-Profile anzeigen
@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

BeitragFr, Jan 13, 2006 21:58
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Jan 14, 2006 19:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Benutzt du jetzt Rendertweening? Wenn ja, da gabs mal nen Bug mit Alpha. Hast du denn auch die neusten Updates eingespielt?
 

horstböhse

BeitragSo, Jan 15, 2006 17:23
Antworten mit Zitat
Benutzer-Profile anzeigen
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! Very Happy
 

Dreamora

BeitragSo, Jan 15, 2006 17:31
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group