Pracuję nad systemem jednostek dla gry sieciowej i przypisuję każdej jednostce unikalny 32-bitowy identyfikator liczby całkowitej, którego mogę użyć do serializacji odniesień do jednostek i samych jednostek.
Obecnie tylko zwiększam licznik za każdym razem, gdy tworzony jest byt. Wydaje mi się, że identyfikatory ostatecznie się skończą, ale tak naprawdę nie spodziewam się posiadania 4 miliardów podmiotów. Pozwala to również uniknąć problemu, jeśli jednostka 5 zostanie zniszczona, a otrzymamy identyfikator 5. Czy ma to oznaczać odniesienie do nowego # 5 lub starego usuniętego # 5?
Problem polega na tym, że nie jestem pewien, jak radzić sobie z kolizjami / unikać ich. Obecnie, jeśli klient otrzyma aktualizację dla podmiotu o identyfikatorze wyższym niż jego obecny „darmowy identyfikator”, po prostu podbija swój darmowy identyfikator aż do przeszłości. Ale to nie wydaje się bardzo solidne.
Myślałem o przypisaniu zakresów każdemu klientowi, aby mogli oni alokować jednostki bez konfliktu (powiedzmy, że górne n bitów to liczba graczy), ale martwię się, co się stanie, jeśli zakresy zaczną się nakładać z czasem.
Czy istnieje lepszy sposób na poradzenie sobie z tym? Czy powinienem nawet przejmować się przepełnieniem identyfikatorów lub przekroczeniem dozwolonego zakresu? Mógłbym dodać kod, aby wykryć te przypadki, ale co by zrobił, gdyby zdarzyły się inaczej niż awaria.
Inną opcją jest użycie czegoś o większej szansie bycia wyjątkowym, takiego jak 128-bitowy identyfikator GUID, ale wydaje się to bardzo ciężkie w przypadku gry, która próbuje zminimalizować ruch w sieci. Ponadto, realistycznie, nigdy nie potrzebowałbym więcej jednostek naraz, wtedy zmieściłby się w 32-bitowej lub nawet 24-bitowej liczbie całkowitej.
Dzięki!