Framabhängig bewegen
-
Hi, ich habe ein Problem beim bewegen der Objekte. Ich habe die Bewegung umgebaut das es jetzt Frameabhängig ist. Doch jetzt machen die Objekte ab und zu sprünge
Kennt ihr das Problem. Bitte ein paar Ratschläge.
-
Gib doch mal die Zeit, die du für die einzelnen Franmes misst, aus. Gibts da Unregelmässigkeiten? Und welche Funktion benutzt du zum Zeit auslesen?
-
Seltsamerweise läuft heute alles wie geschmiert (ca. 19-23 msek/frame)?!?!
Ich benutzte timeGetTime()
Nur manchmal greift der PC auf die Festplatte zu und in diesem Moment habe ich eine sehr große Zeitdifferenz.
Ich arbeite gerade daran es so umzuprogrammieren das solche extremen Zeitunterschiede nicht in die Berechnung miteinbezogen werden.
cu
-
Ich hoffe für Dich, dass niemand, der dein Spiel ausprobiert, ein langsammes System hat, sonst wird er bei 100ms/Frame ziemlich gears*ht sein
-
Ich habe einen 300Mhz PentiumII
-
FSK schrieb:
Ich hoffe für Dich, dass niemand, der dein Spiel ausprobiert, ein langsammes System hat, sonst wird er bei 100ms/Frame ziemlich gears*ht sein
Damit ist man bei jedem spiel "gearscht", oder etwa nicht?
-
jedem in dem die logic frameabhängig läuft, da haste räscht.
rapso->greets();
-
@FSK
Das Programm simuliert einen Luftkampf (3D). Bei 2 Flugzeugen läuft es flüssig. Wenn ich jetzt 100 Flugzeuge erstelle bewegen sich die Flugzeuge zwar in größeren Schritten, aber insgesamt doch in einer spielbaren Geschwindigkeit. Vorher (mit FPS-Bremse) war es unspielbar.*Also mit FPS-Bremse ist der mit dem langsameren Computer gearscht.
*
-
rapso schrieb:
jedem in dem die logic frameabhängig läuft, da haste räscht.
wie berechnet man die logic eigentlich frameunabhängig? wie kann man die logic und das rendern am besten teilen?
-
Indem man sie in einem extra Thread laufen läßt. Und dann halt 20x oder so / sek updated.
Such mal nach einem Thread von vor ca 1Monat. Da hat rapso dieses Verfahren breit ausdiskutiert
-
sicher nicht im extra thread, zuviel aufwand würde ich sagen.
das prinzip ist sehr einfach.
du hast deine realclock (gettickcount)
eine endlosschleife
while(true)
{
}darin dann dein Render();
und eine schleife, die die logic so oft aufruft, bis sie in ihren zeitschritten wieder gleichauf ist mit deiner realclock
also:
while(m_LogicTime<GetTickCount())
{
m_LogicTime+=LogicTimeDelta; //z.B. 50ms
}das wäre alles.
wie du sehen kannst, wird die logic immer in gleichen zeitabständen aufgerufen sofern sie die LogicTime benutzt und falls die framerate höcher ist als das LogicTimeDelta, dann wird die logic übersprungen, was ja auch richtig ist.dinge die unabhängig von der logic sein können, wie z.B. der mauscursor,partikel,texturanimationen z.B. wellen können ja noch mit der rendertime (gettickcount) animiert werden. aber falls du ein realplay brauchst oder desgleichen, dann mußte das auch mit dem logicTime zeug machen.
in dem thread den SnorreDev meint, hab ich auch nen quellcode gepostet.
rapso->greets();
-
rapso schrieb:
jedem in dem die logic frameabhängig läuft, da haste räscht.
Vollkommen egal wie die Logik läuft, bei 10 fps kann man ja nicht mal mehr irgendwas richtig anvisieren. Sowas spiele ich dann nicht mehr.
-
wenn du nur spiele spielst bei denen du zielen mußt... du armer
rapso->greets();
-
rapso schrieb:
wenn du nur spiele spielst bei denen du zielen mußt... du armer
rapso->greets();
a) ich sagte "anvisieren"
b) bei welchen Spielen muss man das denn nicht, guckt man da nur zu?Also denk doch erstmal nach...
-
bei wirtschatssimulationen, RTS, RPGs, advantures... muss man nichts anvisieren, der hardware mousecursor ist ja sowieso flüssig, da darf die grafik ruhig ruckeln, das spielen trotzdem viele leute auf ihren notebooks mit ihren SIS-scheiss intergrated 8mb grakas.
bestes beispiel wären vielleicht die siedler oder patrizier reihen, da ruckelt alles auf solchen notebooks, außer der maus (und der logic), das einzige was man flüssig braucht.sei also net so vorlaut
rapso->greets();
-
Habe ich es richtig verstanden?
whil(TRUE) { UPDATE_OBJEKTE_ALLE_50_MILLISEKUNDEN() RENDER_BEI_JEDEM_DURCHLAUF() }
-
anstatt
UPDATE_OBJEKTE_ALLE_50_MILLISEKUNDEN()
mußte
while(m_LogicTime<GetTickCount())
{
m_LogicTime+=LogicTimeDelta; //z.B. 50ms
}also so lange die logiczeit updaten bis du mit der logic gleichauf mit der "echtzeit" bist.
-
Bau ich gleich mal in mein Programm ein.
-
rapso schrieb:
bei wirtschatssimulationen, RTS, RPGs, advantures...
Mit der Maus die Einheiten oder Buttons.
Also denk doch erstmal nach...
-
die werden nicht mit der mouse bewegt sondern von der logic und falls dir der hardware cursor nicht flüssig genug ist um etwas zu selektieren, solltest du mal nachdenken ob es nicht an dir liegt.. das ist alles ganz anders als bei deinem moorhuhn... also sei net so vorlaut
rapso->greets();