Eu desenvolvo meu próprio mecanismo de jogo por diversão (mas não por lucro). Eu tenho renderização em um segmento e meu gráfico de cena é atualizado (velocidade, etc.) em outro. Quando é hora de renderizar, o thread de renderização adiciona os nós visíveis a um novo buffer linear e os percorre.
Mais detalhadamente, meu gráfico de cena é com buffer triplo. Cada nó no meu gráfico de cena possui três cópias de suas matrizes de transformação relativa e absoluta (4x4). A qualquer momento, uma cópia é gravada pelo encadeamento do gráfico de cena, uma cópia é lida pelo renderizador e existe uma terceira para que o leitor ou escritor possa passar para a próxima sem esperar pela outra. Isso evita gravar em algo enquanto está sendo renderizado e renderizar um gráfico de cena semi-atualizado. De alguma forma, também tenho uma quarta cópia de cada matriz para o usuário trabalhar, de modo a não entrar em conflito com o thread de atualização. Isso parece ter um bom desempenho, evitando ter que sincronizar o tempo todo.
No entanto, isso é uma bagunça.
Estes são meus principais objetivos para o sistema:
- A renderização e a atualização do gráfico de cena ficam em segmentos separados.
- Minimize o quanto esses encadeamentos devem esperar um pelo outro.
- Não renderize uma cena que tenha sido parcialmente atualizada pelo thread de atualização. Isso é particularmente perceptível se a câmera estiver se movendo rapidamente e, às vezes, é renderizada antes ou depois de uma atualização.
- Uso de memória reduzido. Eu tenho muitas matrizes por nó. Também estou pensando em mudar para vetores para posição / rotação / escala devido ao aumento da deriva de ponto flutuante com matrizes.
- Capacidade de lidar com dezenas de milhares de nós. O sistema atual faz isso razoavelmente bem.
Também espero incorporar o Bullet (o mecanismo de física) e as redes no futuro, nenhum dos quais pensei muito.
Quais são algumas abordagens para obter um melhor gráfico de cena?