Melhores práticas para suporte ao alt-tab em um aplicativo DirectX?
-
13-09-2019 - |
Pergunta
Ao escrever aplicativos diretos, obviamente é desejável apoiar o usuário suspendendo o aplicativo via Alt-Aba de uma maneira que é rápido e livre de erros. Qual é o melhor conjunto de práticas para garantir isso? As coisas que precisam ser abordadas incluem:
- Os melhores métodos de detecção quando seu aplicativo foi com altivo e quando foi devolvido.
- O que os recursos diretos são perdidos quando o usuário alt-tabs e as melhores maneiras de lidar com isso.
- As principais coisas a fazer e as coisas a serem evitadas na arquitetura de aplicativos para fins de suporte à TAB alternativa.
- Quaisquer diferenças significativas entre as principais versões do DirectX, conforme elas se aplicam ao acima.
Truques e betchas interessantes também são bons de se ouvir.
Solução
Suponho que você esteja usando C ++ para os propósitos das minhas respostas, mas se você puder usar C#, XNA (http://creators.xna.com/) é uma excelente plataforma de jogo que lida com todos esses problemas para você.
1]
Este artigo é útil para os eventos do Windows no procedimento da janela para detectar quando uma janela perde ou ganha foco, você pode lidar com isso na janela principal: http://www.functionx.com/win32/lesson05.htm. Além disso, confira a mensagem WM_ACTIVATAPPAPP aqui: http://msdn.microsoft.com/en-us/library/ms632614(vs.85).aspx
2]
O dispositivo gráfico é perdido quando o aplicativo perde o foco do modo de tela inteira. A Microsoft oferece um artigo sobre como lidar com isso: http://msdn.microsoft.com/en-us/library/bb174717(vs.85).aspx Este artigo também possui um tutorial de dispositivo perdido: http://www.codesampler.com/dx9src/dx9src_6.htm
O DirectInput também pode ter um estado de erro perdido do dispositivo, aqui está um link sobre isso: http://www.toymaker.info/games/html/directinput.html
DirectSound também pode ter um estado de erro perdido de dispositivo, este artigo possui código que lida com isso: http://www.eastcoastgames.com/directx/chapter2.html
3]
Eu me certificaria de nunca desativar o alt-tab. Você provavelmente deseja uma carga mínima de CPU enquanto o aplicativo não está ativo porque o usuário provavelmente com alt-tabbed porque eles querem fazer outra coisa, para que você possa pausar completamente o aplicativo ou reduzir os quadros renderizados por segundo. Se o aplicativo for mínimo, é claro que você também não precisará renderizar nada. Depois de pensar em um jogo de rede, minha melhor solução é que você ainda deve reduzir os quadros renderizados por segundo, bem como a quantidade de pacotes de rede tratados, possivelmente jogando fora muitos dos pacotes que entram até que o jogo seja reativado.
4]
Honestamente, eu me apegaria ao DirectX 9.0C (ou DirectX 10 se você quiser limitar seu sistema operacional de destino a Vista e mais recente) se possível :)
Finalmente, o DirectX SDK possui inúmeros tutoriais e amostras: http://www.microsoft.com/downloads/details.aspx?familyid=24a541d6-0486-4453-8641-1eee9e21b282&displaylang=en
Outras dicas
Nós o resolvemos não usando um dispositivo DirectX de tela cheia-em vez disso, usamos uma janela de tela cheia com a bandeira mais importante para ocultar a barra de tarefas. Se você é alterado, poderá remover a bandeira e minimizar a janela. Os recursos de textura são mantidos vivos pela janela.
No entanto, essa abordagem não lida com o evento perdido, que está acontecendo devido à 'tela de bloqueio', Ctrl+ALT+Excluir, conexões de desktop remotas, comutação do usuário ou similar. Mas esses não precisam ser tratados de maneira extremamente rápida ou eficiente (pelo menos esse foi o caso em nosso aplicativo)
Todos os aplicativos D3D sérios devem ser capazes de lidar com dispositivos perdidos, pois isso é algo que pode acontecer por vários motivos.
No DX10, no Vista, há um novo recurso "detecção de tempo limite e recuperação", que o torna comum na minha experiência para que os dispositivos gráficos sejam redefinidos, o que causaria um dispositivo perdido para o seu aplicativo. Isso parece estar melhorando à medida que os motoristas amadurecem, mas você precisa lidar com isso de qualquer maneira.
No DX8 e 9 (e 10?) Se você criar seus recursos (buffers e texturas de vértice e índice principalmente) usando o D3DPOOL_MANAGED, eles persistirão através de dispositivos perdidos e não precisarão recarregar. Isso ocorre porque eles são armazenados na memória do sistema e nas cópias de tempo de execução do DX para a memória de vídeo automaticamente. No entanto, há um custo de desempenho devido à cópia e isso não é recomendado para os dados de vértice em rápida mudança. Claro que você faria com o perfil primeiro para determinar se há um problema de velocidade :-)