2012-08-24 17 views
6

Necesito acelerar mi visor de imágenes, y me pregunto si debería buscar crear mi propio control DirectX para hacerlo.WPF nativo frente a DirectX personalizado para mostrar imágenes grandes

Mi visor de imágenes muestra imágenes médicas. Ellos pueden ser bastante grandes Estamos hablando de 55mb cuando se trata de mamografía. Los datos de píxeles son de escala de grises de 16 bits almacenados en una matriz ushort. Sin entrar en detalles sangrientos, mi enfoque actual es cargar los datos de píxeles en un ImageSource y usar el control de imagen de WPF.

Nunca he hecho nada con DirectX. ¿Vale la pena sumergirse en él? ¿Sería más rápido que las cosas nativas de WPF? Si es así, ¿cuánto? O, ¿debería olvidarme de DirectX y buscar áreas en las que pueda mejorar mi enfoque actual?

Antes de que alguien lo diga, sé que WPF utiliza DirectX. Me pregunto si eliminar la capa WPF y escribir DirectX mejorará el rendimiento.

+0

Muestra la imagen completa, o solo partes de ella. Si usa un scrollviewer, solo carga lo que necesita en la memoria –

+0

@JustinPihony mostrando la imagen completa. –

+1

solo recuerda directx! = Directx. También depende de la envoltura de directx que esté usando.Como ejemplo, SlimDX o sharpdx tienen un mejor rendimiento que xna o Managed DirectX. Pero, en general, no creo que obtengas un rendimiento mucho mejor. –

Respuesta

3

Tengo cierta experiencia en el dibujo de imágenes satelitales y de gráficos de varios gigabytes. Trabajar con imágenes de alrededor de 55MB probablemente debería funcionar bien incluso sin intentar optimizarlo demasiado. Realmente no has dado suficientes detalles para recomendar una alternativa sobre la otra, así que daré mi opinión sobre los pros y los contras.

El uso de ventanas API 2D será la más simple de implementar y siempre debe ser lo suficientemente rápido si no necesita girar y simplemente desea mostrar una imagen y hacer zoom y desplazarse. Si lo trata como una imagen grande, el rendimiento no será tan bueno cuando aleje la imagen si está dibujando con medios tonos para obtener una imagen suave y agradable. Esto se debe a que efectivamente tendrá que leer todos los 55mb de imagen cada vez que se dibuje.

Para evitar este problema de rendimiento puede hacer mapas de bits múltiples, mapeo de mapas de su imagen. A medida que aleja, puede elegir la imagen de resolución reducida más cercana a la resolución que está tratando de dibujar. Si no está familiarizado con el mapeo MIP aquí es un enlace Wikipedia:

http://en.wikipedia.org/wiki/Mipmap

Implementar con DirectX habrá 10 veces tan difícil. Hardware de gráficos diferentes tiene diferentes tamaños de textura máxima. Lo más probable es que necesite dividir su imagen en varias texturas para dibujar y también deberá realizar un seguimiento de los estados de procesamiento, matrices de visualización, etc.

Sin embargo, si usa DirectX, puede implementar muchos Ajustes de fotos en tiempo real Puede hacer rotaciones en tiempo real simplemente ajustando las matrices de visualización. Puede hacer contraste, brillo, gamma y nitidez en tiempo real fácilmente en un sombreador de píxeles.

Hay otras dos API que podría sugerir. Si está dispuesto a limitarse a Vista o más tarde, Direct2D sería un poco más simple que Direct3D. Además, si alguna vez necesitas implementarlo en una plataforma que no sea de Windows, te sugiero usar OpenGL en su lugar. Mi proyecto actual está en Direct3D porque hace unos años, cuando comenzamos, OpenGL se estaba quedando atrás y no preveía la popularidad de los dispositivos Android. Ahora desearía haber usado OpenGL en su lugar.

1

Pruebe profiling para ver dónde está pasando su tiempo WPF. ¿Estás mostrando las imágenes en su resolución original? De lo contrario, podría valer la pena realizar un preprocesamiento y crear versiones de 1/2 resolución.

Cuestiones relacionadas