Ich arbeite an einem Entitätssystem für ein vernetztes Spiel und ordne jeder Entität eine eindeutige 32-Bit-Ganzzahl-ID zu, mit der ich Verweise auf Entitäten und die Entitäten selbst serialisieren kann.
Derzeit erhöhe ich nur einen Zähler jedes Mal, wenn eine Entität erstellt wird. Ich schätze, die IDs werden irgendwann aufgebraucht sein, aber ich erwarte nicht wirklich 4 Milliarden Entitäten. Auch dies vermeidet das Problem, wenn die Entität Nr. 5 zerstört wird und wir eine ID von 5 erhalten. Soll dies auf die neue Nr. 5 oder die alte gelöschte Nr. 5 verweisen?
Das Problem ist, dass ich nicht sicher bin, wie ich mit Kollisionen umgehen soll. Wenn ein Client derzeit ein Update für eine Entität mit einer höheren ID als der aktuellen "freien ID" erhält, wird die freie ID bis dahin nur angetastet. Das scheint aber nicht sehr robust zu sein.
Ich habe darüber nachgedacht, jedem Client möglicherweise Bereiche zuzuweisen, damit er Entitäten ohne Konflikte zuordnen kann (die obersten n Bits sind die Spielernummer), aber ich mache mir Sorgen darüber, was passiert, wenn sich Bereiche im Laufe der Zeit überlappen.
Gibt es eine bessere Möglichkeit, damit umzugehen? Sollte ich mich überhaupt darum kümmern, dass IDs überlaufen oder das Ende des zulässigen Bereichs überschritten wird? Ich könnte Code hinzufügen, um diese Fälle zu erkennen, aber was würde es tun, wenn sie nicht zum Absturz führen.
Eine andere Möglichkeit ist die Verwendung einer 128-Bit-GUID, bei der die Wahrscheinlichkeit höher ist, dass sie eindeutig ist. Bei einem Spiel, das versucht, den Netzwerkverkehr zu minimieren, scheint dies jedoch sehr schwer zu sein. Realistisch gesehen würde ich nie mehr Entitäten auf einmal benötigen, als in eine 32-Bit- oder sogar 24-Bit-Ganzzahl passen würden.
Vielen Dank!