Estou trabalhando em um simulador de combate espacial que ocorre em áreas relativamente vastas (um cubo de espaço ~ 20 minutos leves para o lado) e usa (principalmente) física realista. Um dos elementos principais que quero modelar é a velocidade de propagação das informações no espaço de batalha - ou seja, se o Jogador A engajar sua unidade principal em um lado do espaço de batalha, haverá um atraso de 20 minutos antes que o Jogador B a veja e pode reagir a isso
Mesmo em espaços de batalha relativamente pequenos, esse é um fator importante, dadas as velocidades envolvidas. Um navio de 500m de comprimento a 30kps se desloca por toda a sua extensão em 1/60 de segundo, portanto, mesmo mirar um oponente a apenas alguns décimos de segundo de luz será afetado por um atraso de luz.
Eu nunca vi isso antes, e estou me perguntando se existem algumas práticas recomendadas para modelar isso. No momento, estou marcando timestamp cada evento e marcando-o com um local, colocando-o em uma fila e, em seguida, cada tick verificando se algum dos objetos no mundo do jogo está recentemente na borda do cone de luz e adicionando o evento para a fila de sensores. Eu irei (mas ainda não o otimizarei) removendo quaisquer eventos que já tenham sido detectados por todos os objetos que possam senti-lo, mas, ainda assim, acho que isso ficará complicado demais rapidamente e comerei muito de ciclos se houver centenas de objetos sensores em jogo (o que é bastante rotineiro).
Existem modelos de dados que seriam mais adequados para isso que eu deveria conferir?
fonte
Respostas:
Apenas brainstorming aqui ...
Curiosamente, o atraso na rede é seu amigo neste caso. Como você quer que ocorra um atraso para alguns pacotes de dados, pelo menos se for sobre desenho. Mas, em vez de um atraso de base que cada jogador normalmente teria para todos os pacotes de dados afetados apenas pela velocidade da rede, é necessário aplicar um atraso específico para cada evento a cada jogador com base no atraso da velocidade da luz.
Normalmente, o servidor envia atualizações a todos os clientes ao mesmo tempo, mas o que você precisa é que o servidor calcule o "atraso da luz" de cada evento (com base na distância do visualizador) e não envie uma atualização até que Tempo.
Portanto, para cada evento, calcule o atraso de tempo entre o evento e cada jogador e, em seguida, enfileire-o na fila para que não seja enviado para sorteio para esse jogador até que o tempo de atraso tenha passado.
Isso não aborda o efeito do jogador mudar de posição ou velocidade após a ocorrência do evento, mas você pode ajustar os eventos que foram colocados na fila com base nas alterações do jogador. Um jogador começa a se aproximar, aproximar o evento a tempo. O jogador se afasta, afasta-se no tempo.
O deslocamento do Doppler seria algo interessante de se misturar, com base no delta do movimento entre o espectador e o evento.
fonte
A questão é: quão exata você precisa que sua imagem atrasada seja para como ela realmente foi reproduzida? Se você procura 100% de precisão, precisará salvar as ações ou o estado de cada objeto no mapa a cada marca e, como você diz, reproduzi-las com um atraso com base na distância. Se você não se importa tanto com a precisão, que raramente precisa em jogos, pode salvar o estado em intervalos e extrapolar entre eles quando o atraso se aproxima. Você pode otimizar não salvando atualizações idênticas.
Como alternativa, você pode vetorizar todo o movimento e salvar um caminho para cada objeto, juntamente com um horário de início visto por um observador universal. Em seguida, você pode apenas calcular a posição esperada de um objeto para cada observador com base no contador de tempo universal e o horário local com base nos nós do caminho que ele salvou. Quando o carimbo de data e hora de um nó de caminho fica atrás do ícone de luz de todos os objetos relevantes, você o descarta.
Edit: O acima pressupõe que você vai trapacear na relatividade básica por ter um observador absoluto (presumo que o jogador). Isso roubaria alguns dos aspectos mais interessantes da dilatação do tempo, mas modelá-los seria um projeto em si> _>
fonte