Abordagens arquitetônicas para criar um menu de jogo / sobreposição de shell no PC / Linux?

8

Estou trabalhando em uma coleção de jogos para uma instalação de mesa digital personalizada (semelhante às tabelas do Microsoft Surface). Cada jogo será um executável individual que roda em tela cheia. Além disso, é necessário que haja um programa de sobreposição de menu / shell sendo executado simultaneamente. O menu / shell permitirá aos usuários pausar jogos, mudar para outros jogos, verificar seu histórico de jogos etc.

Alguns requisitos principais do shell:

  • ele intercepta todas as entradas do usuário (principalmente multitoque) antes de repassá-las ao jogo em execução no momento (para que ele possa, por exemplo, saber pop-up com um comando de "pausa");

  • pode ser revelado em partes arbitrárias da tela, com o jogo atualmente em execução (mas presumivelmente pausado) ainda sendo exibido por baixo, idealmente com sua forma / tamanho dinâmico, para permitir a criação de um efeito de gaveta de entrada / saída animada sobre o jogo.

Atualmente, estou analisando diferentes abordagens arquitetônicas para esse problema, incluindo sobreposições Fraps e DirectX, mas tenho certeza de que estou perdendo algumas maneiras de pensar sobre isso. Quais são as principais abordagens que devo considerar?

(Observe que a tabela atualmente está sendo executada pelo PC com Windows, mas pode ser uma caixa Linux. Por isso, não quero dizer que precise de uma solução independente de SO. Eu ficaria feliz com uma solução específica do Windows. Mas Eu gostaria de considerar mudar para o Linux e usar uma solução específica para Linux, se for muito mais fácil conseguir isso no Linux.)

Ghopper21
fonte

Respostas:

3

Acho que não há muito o que avaliar. O desempenho / capacidade de resposta vem em primeiro lugar, especialmente em uma instalação desse tipo. Você pode usar o DirectX ou o OpenGL diferido renderização / renderização em textura (RTT).

Para fazer isso, renderize a subjacência do shell no buffer de quadro padrão (o buffer frontal / na tela), processe a sobreposição do jogo ativo em um quadrúpede do tamanho de uma tela, mude esse quadrilátero para a posição apropriada no espaço do mundo, conforme o status atual da "gaveta" "transição, em seguida, renderize-o também no buffer de quadros padrão. Agora você deve ter o jogo ativo colocado sobre o shell, e é uma operação muito rápida e, portanto, se presta a transições lisas (dada uma boa matemática de interpolação).

Nas interações, você pode até tornar a detecção de acertos sob / sobreposição perfeita em pixels, se você ler os dados RTT para o lado da CPU, por quadro. Nesse caso, você precisará retornar pelo menos o buffer de sobreposição como um RTT de máscara de 1 bit barato.

EDIT Outra maneira é seguir totalmente o navegador, como você pode fazer no modo de tela cheia. Você pode carregar os jogos como módulos, em vez de ter "programas" separados. O problema com o navegador é que você não terá o mesmo desempenho. Você ainda pode usar o WebGL (já que teria controle sobre qual navegador estaria usando) para camadas e gráficos rápidos, mas os jogos precisariam ser simples. Além do desempenho, pode ser um pouco mais fácil se desenvolver dessa maneira, e ainda independente do sistema operacional.

Engenheiro
fonte
Deixe-me saber se você tiver alguma dúvida;)
Engineer
Obrigado! E só para verificar, essa abordagem funcionará com o shell e o jogo individual sendo executados como programas separados?
Ghopper21
Não. De uma forma ou de outra, um e apenas um processo será capaz de obter acesso ao contexto do dispositivo GPU. A única maneira de ver você fazendo isso de outra maneira é renunciar à aceleração 3D juntos - o que eu não recomendaria. A outra coisa é a seguinte: se você ainda não tem certeza se vai ganhar ou não com Lin, com essa abordagem, tudo bem. Considerando que, se você escolher alguma abordagem específica do SO, mude para o outro SO posteriormente, que pode tornar a primeira abordagem obsoleta e possivelmente nem mesmo replicável no SO recém-escolhido. Sugiro esperar por mais respostas / idéias.
Engenheiro de
@ Ghopper21 Veja minha edição para uma abordagem diferente.
Engenheiro de
Obrigado Nick pela solução do navegador. Eu acho que quero evitar isso por causa do desempenho e de outros problemas. Mas, pela sua nota, percebo que não estava claro sobre a parte Windows versus Linux. Vou esclarecer em uma edição da pergunta.
Ghopper21