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:

  1. Os melhores métodos de detecção quando seu aplicativo foi com altivo e quando foi devolvido.
  2. O que os recursos diretos são perdidos quando o usuário alt-tabs e as melhores maneiras de lidar com isso.
  3. As principais coisas a fazer e as coisas a serem evitadas na arquitetura de aplicativos para fins de suporte à TAB alternativa.
  4. 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.

Foi útil?

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]

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 :-)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top