Como se separa a lógica e a renderização do jogo? Eu sei que já parece haver perguntas aqui perguntando exatamente isso, mas as respostas não são satisfatórias para mim.
Pelo que entendi até agora, o ponto de separá-los em segmentos diferentes é para que a lógica do jogo possa começar a executar o próximo tick imediatamente, em vez de esperar o próximo vsync, no qual a renderização finalmente retorna da chamada swapbuffer que está bloqueando.
Mas especificamente quais estruturas de dados são usadas para evitar condições de corrida entre o segmento lógico do jogo e o segmento de renderização. Presumivelmente, o encadeamento de renderização precisa acessar várias variáveis para descobrir o que desenhar, mas a lógica do jogo pode estar atualizando essas mesmas variáveis.
Existe uma técnica padrão de fato para lidar com esse problema. Talvez como copiar os dados necessários para o encadeamento de renderização após cada execução da lógica do jogo. Seja qual for a solução, a sobrecarga da sincronização será menor do que apenas executar tudo em um único encadeamento?