2010-05-03 10 views
7

Necesito hacer miles de elipsis conectadas entre sí con líneas. ¿Cuál sería la mejor manera (en términos de rendimiento) para representarlo dentro de una aplicación WPF? ¿La pintura WPF Canvas es mucho peor que la pintura XNA?WPF contra XNA para representar miles de sprites

En realidad, la pregunta oculta es: ¿es posible hacer algo de xna-rendering dentro de un host de WPF? Vi algunos ejemplos que utilizan una superposición de ventana XNA sin fronteras, pero sin soluation nativa ...

Gracias, Aurélien

Respuesta

2

Si lo hace bien puede obtener un rendimiento bastante alto en la representación de WPF que tiene la ventaja de que no tiene que tomar el dolor de interoperabilidad de WPF-XNA. Puede renderizar (y animar) una gran cantidad de imágenes si usa las API de procesamiento de bajo nivel de WPF, como CompositionTarget.Rendering y DrawingContext. También puede aprovechar el nuevo Cached Composition feature en .net 4.0. Hay mucho más solo toma esto como punto de partida.

+0

Creo que iré de esta manera, pero necesito cierta interactividad del usuario con cada elipse, y se representan en un ScrollViewer. En realidad, actualmente estoy usando un Control para renderizar una elipse y otro Control para renderizar una Línea. Eso es solo un prototipo, y las actuaciones con más de cien puntos suspensivos son horribles. Gracias. Creo que iré con DrawingVisuals ... –

+1

DrawingVisuals es mucho más rápido que los controles derivados de Shape (Line, Ellipse), pero para el contenido dinámico la sugerencia DrawingContext de bitbonk puede ser aún más rápida. –

1

Acabo de encontrar this article en CodeProject:

Queremos integrar nuestra escena XNA en una interfaz de usuario WPF de la misma manera que integramos un lienzo o cualquier widget. Pero la mejor forma de ver una escena en 3D en XNA es incorporarlo en una ventana. Es imposible obtener el control de cualquier control WPF como se puede hacer con un WinForm. El truco es reescribir parte del framework XNA que gira en torno a la clase Game. El objetivo es heredar una nueva clase de Juego del Panel (en nuestro caso, un Lienzo) para poder incluirlo en el árbol visual de WPF. Los límites visuales del panel serán el área de visualización de la escena XNA. Sin embargo, acabamos de decir que no es posible obtener un control visual que no herede de Window. ¿Cómo mostramos 3D con XNA entonces? Simplemente mostraremos una ventana sin borde justo arriba del panel. Esta ventana siempre estará en la parte superior cuando la aplicación tenga foco y el panel esté visible y se ocultará en este caso. Del mismo modo, cuando el panel no sea visible, detendremos la actividad del juego.

This thread en los foros de Microsoft tiene una discusión sobre este y un cartel estados:

A continuación, las conclusiones es que se puede tener XNA representación en una forma de WPF, sin problemas, pero debe evitar el uso de las clases Game y GraphicsDeviceManager, ya que este último requiere la ejecución de una instancia del juego (el constructor se define como el nuevo GraphicsDeviceManager (Game Game)) y la clase Game no proporciona ninguna forma de definir la ventana en la que se renderiza.

Parece que es posible, pero requiere algo de trabajo en el lado XNA de la ecuación.

2

He logrado "integrar" XNA con WPF al representar primero una escena XNA en un control WinForms y luego alojar ese control en WPF usando the WindowsFormsHost element.

+0

Quería hacer eso, pero escuché que las actuaciones son aplastadas en un host winform. Supongo que solo son rumores, tendré que probar esa asunción. –

+0

Sí, esa suposición debe ser probada :) Estoy ejecutando una escena de triángulos de 60k + con un rendimiento aceptable. Estoy usando 'BasicEffect' con una fuente de luz y niebla activada, aún no he probado texturas. Pero supongo que la sobrecarga adicional de ponerlo en WinForms debe ser constante sin importar lo que esté sucediendo en el lado de XNA. –

+0

De hecho, la sobrecarga de procesamiento de pasar por WinForms es exactamente cero (en comparación con una ventana de superposición). Debajo del capó, tanto el método WinForms como la ventana de superposición dan a Direct3D un área de pantalla rectangular para poseer y jugar. Cambiar el tamaño y mover su ventana será técnicamente más lento, pero en la práctica indetectablemente. –

1

Sin embargo, tenga en cuenta que las aplicaciones XNA no ejecutarán en sistemas sin al menos 1.1 shader GPU.