Seite 2 von 2

Re: Netzwerksynchronisation zwischen Clients mittels Server

Verfasst: 19.02.2013 20:27
von cxAlex
Agent hat geschrieben: Wie kann es sein, dass auf einem PC der Wert für ElapsedMilliseconds() negativ ist?

In Folge dessen werden in meinem Spiel die Einheiten GARNICHT gebaut, da der Timer negativ ist und niemals über den WarteTimer kommt (zb. erst in ein paar Jahren *lol)
ElapsedMilliseconds() gibt die Millisekunden seit Systemstart zurück, dieser Wert wird als 32 - Bit Integer gespeichert. Da PB nur Vorzeichenbehaftete Typen kennt überschlägt sich dieser Wert nach 2147483647 Millisekunden ins negative, also nach nicht ganz 25 Tagen. Wenn du denn Wert jetzt Als Quad speicherst (64 bit) könntest du das ganze auf ~ 50 Tage strecken, wobei ich mir nicht sicher bin ob das PB - Interne typecasten das Vorzeichen Bit bei t.q = ElapsedMilliseconds() mitzieht, eventuell braucht's hier noch ein bisschen Bit - Maskierung, aber das sollte nicht das Problem sein.

Gruß, Alex

// Edit: jup, das PB - Typecasten zieht das das Vorzeichen Bit mit, soeben ausprobiert weil's mich interessiert hat.

Ein kleines Makro um das zu umgehen, so erhält man den unsigned 32 - Bit Wert in eine Quad - Variable, also ~ 50 Tage Messraum:

Code: Alles auswählen

Macro ltq_unsigned(_l)
  (((_l) & $7FFFFFFF) | ((_l) & $80000000))
EndMacro

timestamp.q = ltq_unsigned(ElapsedMilliseconds())

Re: Netzwerksynchronisation zwischen Clients mittels Server

Verfasst: 19.02.2013 21:00
von Agent
Hey Alex.

Danke fürs Posting.
Allerdings ist mir das Unklar, denn der PC ist nicht 25 Tage gelaufen ;) Dieser wird nur zum Testen angeschmissen und das am gleichen Tag o.O

Wie also kommt es dazu?

PS: danke für das Macro

Re: Netzwerksynchronisation zwischen Clients mittels Server

Verfasst: 20.02.2013 12:34
von cxAlex
Agent hat geschrieben: Allerdings ist mir das Unklar, denn der PC ist nicht 25 Tage gelaufen ;) Dieser wird nur zum Testen angeschmissen und das am gleichen Tag o.O
Sehr gute Frage, eigentlich sollte das nicht passieren. Ich hatte das Problem ein mal, mit Virtual Box in dem ich ein Win XP System, solange ich das System normal gestartet hatte lief alles normal, nur sobald ich einen Snapshot der VM aus dem Laufenden Betrieb wieder hochgefahren hatte war der Wert auch im negativen. Ist aber schon sicher 1, 2 Jahre her, und ich vermute mal das du das System nativ betreibst. Was für ein System läuft den da, Win 7, Vista, XP, ein Linux Derivat, x86/x64?

Gruß, Alex

Re: Netzwerksynchronisation zwischen Clients mittels Server

Verfasst: 20.02.2013 13:49
von bobobo
Vermutung

Das System ist eigentlich egal.

Wichtig ist, dass ElapsedMilliseconds() die MSek seit dem Rechnerstart ausgibt
(in der Pb-Hilfe steht ..seit einer bestimmten Zeit in der Vergangenheit..)

für Windows ist das wohl der Neustart (Boot)

Beim heutigen beliebten HibernationMode (ist eben kein Rechnerneustart) kann man das so
nicht mehr so einfach benutzen und die MSek werden negativ

Im Übrigen sollte man diese Werte nur zum Vergleich heranziehen und dem direkt zurückgegebenen Wert
nicht irgendeine tiefere Bedeutung beimessen (steht auch so in der PB-Hilfe)

Re: Netzwerksynchronisation zwischen Clients mittels Server

Verfasst: 20.02.2013 20:05
von mk-soft
Nutze dieses nur zur Zeitmessung zwischen zwei Aufrufen und die Liegen eigendlich immer unter 25 Tage :allright:
Da ist das vorzeichen auch schnuppe. Da kommt bei ...

Code: Alles auswählen

start = ElapsedMilliseconds()
Delay(1000)
ende = ElapsedMilliseconds()
dauer = ende - start
... immer ein positive ergebnis raus. Plus Minus 16.7ms...

Re: Netzwerksynchronisation zwischen Clients mittels Server

Verfasst: 25.02.2013 18:12
von Thorium
Syncronisation ist immer problematisch. Eigentlich laufen Spiele nie komplett syncron und solange die Spieler nicht nebeneinander sitzen, fällts auch keinem auf. Man kann lange Antwortzeiten per Interpolation kaschieren, was aber auch wieder kompliziert werden kann. Für Schussbefehle ist es eigentlich irrelevant ob die bei einem Client 300ms später kommen als beim anderen, das sollte keinem auffallen.