Um aplicativo WPF autônomo pode criar uma interface que se parece com uma interface Flash?

7

Parece que o WPF foi criado como a resposta do aplicativo para o Flash da Adobe. O Silverlight é usado para criar páginas da web. Mas, essa mesma funcionalidade pode ser inserida em um aplicativo WPF independente. O Scaleform permite que o Flash seja usado em jogos C ++ não gerenciados. O WPF pode ser usado para criar o mesmo tipo de interfaces? O que li parece me fazer acreditar que pode. Mas não vi nenhuma planilha de aplicativos que mostrasse esse tipo de interface.

zooropa
fonte
Definitivamente, está relacionado ao jogo, mas você ainda pode obter uma resposta melhor no stackoverflow.com
Iain

Respostas:

5

O WPF foi criado para fornecer uma maneira melhor para os desenvolvedores do Windows criarem GUIs para aplicativos de desktop. O Silverlight foi criado como uma resposta ao Flash e reutiliza grande parte da API do WPF, mas tem uma implementação diferente.

Em teoria, você poderia usar o WPF para criar a GUI para um jogo, mas na prática você provavelmente não faria: -

  • Seu jogo dependerá da estrutura do .NET que está sendo instalada. Isso não é mais um problema tão grande, mas ainda assim, é mais uma coisa com que se preocupar em não funcionar.
  • O WPF usa o Direct3D 9 para renderizar. Existe uma extensão que, no Vista / Win7 e XP SP3 ou posterior, permite alocar uma superfície e compartilhá-la entre o WPF e seu mecanismo de jogo C ++ não gerenciado. Você pode ter problemas com o DX10.1 ou 11.
  • O tempo de execução do .NET suspende todos os threads envolvidos de qualquer forma com a memória gerenciada durante uma coleta de lixo. Para evitar a suspensão do loop do jogo, é necessário criar uma maneira de trocar dados entre o código não gerenciado e o tempo de execução do .NET que evita chamar o tempo de execução do .NET por interoperabilidade. Provavelmente, você teria uma área compartilhada de memória não gerenciada à qual você tem acesso e sincroniza usando os primitivos de threading unificados.
  • Mas aqui está o problema real: se você seguisse essa rota, estaria entregando o controle da sua janela ao WPF. Você apenas fornece ao WPF uma superfície D3D contendo sua renderização 3d final e a compõe com o que quer que tenha gerado antes de apresentá-la. Você estaria bloqueado para a programação de atualização do WPF e também não há chance de entrar em tela cheia da maneira que os jogos 3D normalmente fazem.

Existe a possibilidade de que essa situação possa ser resgatada. Há uma reimplementação de código aberto do .NET chamada Mono. Eles têm um subprojeto chamado Moonlight que é uma reimplementação do Silverlight. Com o código-fonte disponível, é possível integrá-lo de forma semelhante ao Scaleform e permitir criar GUIs usando a excelente ferramenta de autoria do Expression Blend da Microsoft. Eu não acho que alguém tenha feito isso ainda, então provavelmente há questões a serem descobertas, mas estou apenas lançando isso como uma idéia.

EDIT: Ocorreu-me depois de adicionar isso que talvez seu interesse não seja tanto em alavancar ferramentas de autoria como o Flash Studio ou o Expression Blend e talvez você só queira desenhar gráficos 2D de alta qualidade rapidamente. Nesse caso, há a API do Direct2D que a Microsoft adicionou no Windows 7 e depois portou para o Vista.

U62
fonte
Para sua informação, o coletor de lixo foi aprimorado substancialmente no .NET 4. Ele agora suporta a coleta em segundo plano das três gerações de objetos, mas não sei se / como as alterações podem afetar o problema nº 3 da sua lista. Se alguém souber, por favor, compartilhe :).
quer
Mono e Moonlight são licenciados pelo MIT, portanto a incorporação de um ou dos dois em um jogo é certamente factível (e está sendo feita, por exemplo, no Second Life). Houve pelo menos uma tentativa planejada de fazer a incorporação do Moonlight para um jogo: tirania.org/blog/archive/2009/Nov-12-2.html#comment-22844845 (Nenhuma idéia se aconteceu / foi bem-sucedida ou não, no entanto.)
WorldMaker 11/11
1

Definitivamente, você pode criar tipos semelhantes de interfaces no WPF, mas integrá-las a um jogo Direct3D é problemático. Você pode hospedar conteúdo do Direct3D no WPF (via D3DImage), mas o conteúdo 3D seria composto no aplicativo WPF, para que a renderização se torne dependente do WPF. Conseqüentemente, você pode ter um desempenho relativamente ruim, pois está limitado pela taxa de quadros do WPF. Além disso, como U62 observou em seu comentário, o WPF pode hospedar apenas o conteúdo do Direct3D 9 (em oposição ao Direct3D 10/11). No entanto, você pode contornar isso, pois IDirect3DDevice9Exé capaz de compartilhar recursos entre dispositivos. Portanto, você pode criar um destino de renderização compartilhado no Direct3D 10 ou 11 e trazê-lo para o WPF por meio de um IDirect3DDevice9Exdispositivo intermediário . Jeremiah Morrill discute essa técnica aqui .

Uma alternativa, embora longe de ser elegante, seria renderizar a interface do usuário do WPF em uma janela em camadas separada acima do conteúdo do Direct3D, conforme descrito aqui .

Também existem maneiras de acessar a superfície interna do Direct3D do WPF , o que permitiria hospedar o conteúdo do WPF em uma cena externa do Direct3D (em vez do contrário). No entanto, esse é um truque bastante desagradável e pode ser facilmente quebrado por versões futuras do WPF.

Obviamente, nada disso é relevante se você realmente não precisar interoperar com o Direct3D. Jogos que não exigem gráficos 3D complexos certamente podem ser desenvolvidos completamente no WPF . O WPF possui algumas instalações 3D simples à sua disposição, embora geralmente sejam insuficientes para qualquer coisa além de formas primitivas com texturas simples. Ele também suporta sombreadores de pixel personalizados, embora existam muitas restrições (por exemplo, devem ser efeitos de passagem única).

Mike Strobel
fonte