Jogo multiencadeado - atualização, renderização e como dividi-los

8

No post StackOverflow (foi recomendado que eu mova isso):

Então, estou trabalhando em um mecanismo de jogo e fiz um bom progresso. No entanto, meu mecanismo é de thread único, e as vantagens de dividir a atualização e a renderização em threads separados são uma ótima idéia.

Como devo fazer isso? Mecanismos de jogo de thread único são (conceitualmente) muito fáceis de criar, você tem um loop em que atualiza -> render -> sleep -> repeat. No entanto, não consigo pensar em uma boa maneira de separar a atualização e a renderização, especialmente se eu alterar as taxas de atualização (digamos, eu percorro o loop de atualização 25x por segundo e tenho 60fps para renderizar) - e se eu começar a atualizar no meio do caminho através de um loop de renderização, ou vice-versa?

CodeBunny
fonte

Respostas:

6

Você deseja duplicar / triplicar o buffer de todos os dados necessários para a renderização que são alterados no passo de atualização. Dessa forma, você não renderizará com algo que foi parcialmente alterado. O motivo pelo qual você provavelmente precisará triplicar o buffer é 1) a cópia que você está atualizando, 2) a última cópia que você atualizou completamente e 3) a cópia que está sendo usada atualmente para renderização que você não deseja alterar .

A parte mais difícil é provavelmente descobrir a melhor maneira de organizar seus dados para isso.

Roger Perkins
fonte
4

Este site discute o problema e implementou uma solução de buffer triplo, como Roger sugeriu:

http://blog.slapware.eu/game-engine/programming/multithreaded-renderloop-part1/ http://blog.slapware.eu/game-engine/programming/multithreaded-renderloop-part2/ http: // blog. slapware.eu/game-engine/programming/multithreaded-renderloop-part3/ http://blog.slapware.eu/game-engine/programming/multithreaded-renderloop-part4/

É silencioso, difícil de implementar, mas o site tem uma distribuição de origem e binária da implementação, se você estiver interessado.

Alex de Vries
fonte