Bevor ich den Thread von Big_Santa noch vollspamme mach ich dazu lieber einen eigenen Thread auf.
Kurze Einleitung:
Meine Ursprungsfrage warum überhaupt Fixed Step Logic und was der Nachteil wäre wenn man sie durch soeine ersetzt:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
|
if( ZeitSeitLetztemUpdate >= KonstanteZeit )
{
Update(ZeitSeitLetztemUpdate);
ZeitSeitLetztemUpdate = .0f;
}
else ZeitSeitLetztemUpdate += DeltaZeit;
|
Link zum Post
Kurz google'n hat mich zu
dem Blog gebracht (thx an BlueCobold für den Hint)
Eine Aussage war: mit Fixed Step läuft die Physiksimulation konstant ab, was bei meiner "Lösung" nicht der Fall wäre, wenn zB wg Debug-Purpose mal kurz (2-5s) der Prozess pausiert oder wg was-weiß-ich ein größerer Lag entsteht.
Dadurch wiederum ist die Physik deutlich stabiler, weil riesige Sprünge absehbarer sind und entsprechend eingegangen werden kann.
Hab ich das richtig kapiert, dass Fixed Step für die Stabiltät der Simulation entsprechend wichtig ist?
So meine neue Idee ist jz die:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
//"Pseudo" Code
const float step ...; //konstante Update Zeit
const float max_advance ...; //zweite Konstante, max. Anzahl an Frames* die weiter berechnet werden dürfen
float total_time ...; //Zeit-Konto
//Im Main-Loop
if( total_time >= step )
{
float diff = total_time - step;
float advance = step + min(diff, max_advance);
total_time -= advance;
Update(advance);
}
|
Dadurch sollte die Physik immer noch stabil laufen, weil keine riesige Sprünger möglich sind, aber trotzdem Ungenauigkeiten auf Dauer ausgeräumt werden.
Sozusagen eine limitierte Variable Step Logik.
Was ist eure Meinung dazu?
Offtopic: Ich seh ab und zu, dass manche von euch (sry, Namen vergessen) sehr aktuell über die Neuerungen C++ Bescheid wissen.
Gibt's vom Commitee sozusagen eine offizielle Seite mit den "Patch Notes" und wichtigen Terminen oder wie wird das nach außen kommuniziert?
Freu mich auch über Tipps wie ich mich generell up2date halten kann. Meistens passiert das durch Zufall 2-3 Monate nach dem die News war.
* Frames ist dafür die falsche Bezeichnung. Ich meine damit um wieviel Prozent der derzeitige Update in der Pause zw. dem eigtl fixed Update und dem Nächsten steht.
Substeps wäre der richtige Name.
max_advance gibt dann einen Threshold an bis wie weit in diesen Bereich reinge'steppt werden darf.
-------|----------------------------|----------------------------------------------|
fixed Update___________hier befindet sich der Code_______________Zeitpunkt des nächsten Updates
Edit1: Grad über die Zahl 2 Frames extra nachgedacht, bei einer Updaterate von 60Hz wären das 8,333..% mehr. Die Zahl scheint mir deutlich zu extrem angesetzt.
Ich denke, dass .25-.5 Frames max. mehr deutlich stabiler wären, aber dennoch Langzeitungenauigkeiten ausgleicht. Die Updaterate würde dann nur noch um max. ~1-2% verfälscht werden.
Edit2: Links korrigiert.
Edit3: Genauere Beschreibung zu 'max_advance' eingefügt.