ネットワークゲームのエンティティシステムに取り組んでおり、各エンティティに一意の32ビット整数IDを割り当てています。このIDを使用して、エンティティおよびエンティティ自体への参照をシリアル化できます。
現在、エンティティが作成されるたびにカウンターをインクリメントしています。IDが最終的に使い果たされると思いますが、40億のエンティティがあるとは本当に思っていません。また、これにより、エンティティ#5が破棄され、IDが5になった場合に問題が回避されます。新しい#5を参照するのか、古い#5を参照するのですか?
問題は、衝突の処理/回避方法がわからないことです。現在、クライアントが現在の「フリーID」よりも高いIDを持つエンティティの更新を受け取ると、それまでのフリーIDにぶつかります。しかし、それはあまり堅牢ではないようです。
競合することなくエンティティを割り当てることができるように各クライアントに範囲を割り当てることを考えました(上位nビットはプレーヤー番号です)が、範囲が時間とともに重複し始めた場合にどうなるか心配です。
これを処理するより良い方法はありますか?idがオーバーフローしたり、許可された範囲の終わりを超えたりすることさえ気にする必要がありますか?これらのケースを検出するコードを追加できますが、クラッシュ以外の事態が発生した場合はどうなりますか。
もう1つのオプションは、128ビットGUIDのように一意である可能性が高いものを使用することですが、ネットワークトラフィックを最小限に抑えようとしているゲームにとっては非常に重いようです。また、現実的には、32ビットまたは24ビットの整数に収まるエンティティが一度に必要になることはありません。
ありがとう!