¿Puede una aplicación WPF independiente crear una interfaz que se parece a una interfaz Flash?

Parece que se creó WPF como la respuesta de la aplicación al Flash de Adobe. Silverlight se usa para crear páginas web. Pero, ¿puede esa misma funcionalidad ser arrastrada a una aplicación WPF independiente? Scaleform permite que Flash se use en juegos de C ++ no administrados. ¿Se puede usar WPF para crear el mismo tipo de interfaces? Lo que he leído parece hacerme creer que puede hacerlo. Pero no he visto ninguna hoja de aplicaciones que muestre este tipo de interfaz.

WPF fue creado para proporcionar una mejor manera para que los desarrolladores de Windows creen GUI para aplicaciones de escritorio. Silverlight se creó como respuesta a Flash y reutiliza mucho la API de WPF, pero tiene una implementación diferente.

En teoría, podrías usar WPF para crear la GUI para un juego, pero en la práctica probablemente no:

  • Su juego dependería del .NET framework que esté instalando. Esto ya no es tan importante, pero aún así, es una cosa más de la que preocuparse por no trabajar.
  • WPF usa Direct3D 9 para renderizar. Existe una extensión que en Vista / Win7 y XP SP3 o posterior le permite asignar una superficie y compartirla entre WPF y su motor de juegos C ++ no administrado. Puede tener problemas con DX10.1 o 11.
  • El time de ejecución de .NET suspende todos los hilos que están involucrados de alguna manera con la memory administrada durante una recolección de basura. Para evitar que se suspenda el bucle de tu juego, debes encontrar una forma de intercambiar datos entre tu código no administrado y el time de ejecución de .NET que evita llamar al time de ejecución de .NET a través de la interoperabilidad. Probablemente tendrías un área compartida de memory no administrada a la que ambos tendrían acceso y sincronizarías usando primativos de subprocesamiento umanaged.
  • Sin embargo, este es el verdadero problema: si sigues esta ruta, estarás cediendo el control de tu window a WPF. Simplemente obtienes WPF con una superficie D3D que contiene tu render final en 3D y luego lo comstack con lo que haya generado antes de presentarlo. Estará bloqueado en el progtwig de actualización de WPF y tampoco habrá posibilidad de ir a pantalla completa en la forma en que lo hacen los juegos en 3D.

Sin embargo, existe la posibilidad de que esta situación pueda ser rescatada. Hay una nueva implementación de código abierto de .NET llamada Mono. Tienen un subproyecto llamado Moonlight, que es una reimplementación de Silverlight. Con el código fuente disponible, existe la posibilidad de que se integre de forma similar a Scaleform y le permita crear GUI utilizando la excelente herramienta de creación Expression Blend de Microsoft. No creo que nadie haya hecho esto todavía, así que probablemente haya problemas que descubrir, pero lo estoy lanzando como una idea.

EDITAR: Después de agregar esto, me di count de que tal vez su interés no estriba tanto en aprovechar las herramientas de autor como Flash Studio o Expression Blend, y que quizás solo quiera dibujar charts de alta calidad en 2d rápidamente. En ese caso, está la API de Direct2D que Microsoft agregó en Windows 7 y luego se transfirió a Vista.

Definitivamente puede crear types similares de interfaces en WPF, pero integrarlas en un juego Direct3D es problemático. Puede alojar contenido de Direct3D dentro de WPF (a través de D3DImage ), pero su contenido 3D se compondría en la aplicación WPF, por lo que la reproducción depende de WPF. En consecuencia, es posible que vea un performance relativamente bajo, ya que está limitado por la velocidad de fotogtwigs de WPF. Además, como señaló U62 en su comentario, WPF solo puede alojar contenido de Direct3D 9 (a diferencia de Direct3D 10/11). Sin embargo, es posible que pueda evitar esto, ya que IDirect3DDevice9Ex es capaz de compartir resources entre dispositivos. Por lo tanto, podría crear un objective de renderizado compartido en Direct3D 10 u 11 y llevarlo a WPF a través de un dispositivo IDirect3DDevice9Ex intermedio. Jeremiah Morrill discute esta técnica aquí .

Una alternativa, aunque lejos de ser elegante, sería renderizar su interfaz de usuario de WPF en una window separada en capas por encima del contenido de Direct3D, como se describe aquí .

También hay forms de acceder a la superficie Direct3D interna de WPF , que le daría una manera de alojar contenido WPF en una escena Direct3D externa (en lugar de al revés). Sin embargo, este es un truco bastante desagradable y podría romperse fácilmente en futuras versiones de WPF.

Por supuesto, nada de esto es relevante si realmente no necesita interoperar con Direct3D. Los juegos que no requieren charts 3D complejos sin duda se pueden desarrollar completamente en WPF . WPF tiene algunas instalaciones 3D simples a su disposition, aunque generalmente son insuficientes para cualquier cosa más allá de forms primitivas con texturas simples. También es compatible con los sombreadores de píxeles personalizados, aunque existen muchas restricciones (por ejemplo, deben ser efectos de un solo paso).