Netzwerksynchronisation zwischen Clients mittels Server

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Re: Netzwerksynchronisation zwischen Clients mittels Server

Beitrag 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())
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Agent
Beiträge: 296
Registriert: 13.09.2004 11:28
Kontaktdaten:

Re: Netzwerksynchronisation zwischen Clients mittels Server

Beitrag 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
Agent_Sasori
It's not a bug - it's a feature!
http://www.StephenKalisch.de | http://www.ria-tec.com | http://www.dirsync.de
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Re: Netzwerksynchronisation zwischen Clients mittels Server

Beitrag 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
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3875
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Netzwerksynchronisation zwischen Clients mittels Server

Beitrag 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)
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
mk-soft
Beiträge: 3902
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Netzwerksynchronisation zwischen Clients mittels Server

Beitrag 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...
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Re: Netzwerksynchronisation zwischen Clients mittels Server

Beitrag 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.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Antworten