Estou trabalhando em um sistema de entidades para um jogo em rede e atribuindo a cada entidade um ID inteiro de 32 bits exclusivo que posso usar para serializar referências a entidades e às próprias entidades.
Atualmente, estou apenas incrementando um contador toda vez que uma entidade é criada. Acho que os IDs acabarão, mas não espero ter 4 bilhões de entidades. Isso também evita o problema se a entidade nº 5 for destruída e obtivermos um ID igual a 5. Ele deve se referir ao novo nº 5 ou ao antigo nº 5 excluído?
O problema é que não tenho certeza de como lidar com / evitar colisões. Atualmente, se um cliente recebe uma atualização para uma entidade com um ID maior que o "ID gratuito" atual, ele apenas esbarra no ID gratuito. Mas isso não parece muito robusto.
Pensei em talvez atribuir intervalos a cada cliente para que eles possam alocar entidades sem conflitar (digamos que os n bits superiores sejam o número do jogador), mas estou preocupado com o que acontece se os intervalos começarem a se sobrepor ao longo do tempo.
Existe uma maneira melhor de lidar com isso? Devo me preocupar com ids transbordando ou ultrapassando o final do intervalo permitido? Eu poderia adicionar código para detectar esses casos, mas o que faria se eles acontecessem além da falha.
Outra opção é usar algo com maior chance de ser único, como um GUID de 128 bits, mas que parece realmente pesado para um jogo que está tentando minimizar o tráfego de rede. Além disso, realisticamente, eu nunca precisaria de mais entidades ao mesmo tempo, então caberia em um número inteiro de 32 bits ou mesmo 24 bits.
Obrigado!