2011-03-21 14 views
6

Estoy creando un visor CAD que trata con archivos de imagen muy grandes y estoy tratando de optimizarlo para una tasa de fotogramas tan alta y baja como sea posible.C# GDI +/System.Drawing.Graphics: ¿crear un buffer y blitting manualmente?

Utiliza GDI + para renderizar en un panel.

Su defecto actual es la representación de imágenes. Algunos de los archivos que estoy usando son imágenes de referencia que son particularmente grandes (8000x8000 píxeles). Optimicé el uso de la memoria al solo cargarlos cuando se vuelven visibles y desecharlos cuando no están visibles. Esto reduce la posibilidad de que el programa se quede sin memoria, pero evita que las imágenes se carguen y descarguen con demasiada frecuencia; sin embargo, representar las imágenes en sí mismas (context.DrawImage) aún conlleva una sobrecarga muy grande.

Ahora estoy explorando maneras de fragmentar las imágenes en un búfer más pequeño de algún tipo, haciendo que este búfer (generalmente mucho más pequeño), y luego refrescar/reconstruir cuando el nivel de zoom cambia significativamente.

El problema es que no puedo encontrar ninguna provisión para esto en absoluto GDI. ¿Alguien puede sugerir cómo podría lograrlo?

Respuesta

0

GDI Agrupada en favor de Direct3D como elementos 3D entró en la ecuación de todos modos. Las imágenes se convierten en miniaturas individuales y mosaicos más grandes que se cargan dentro/fuera según sea necesario.

2

No creo que GDI esté diseñado para tales actualizaciones de alta velocidad de imágenes. Si está intentando desplazar la imagen y seguir el mouse con cada movimiento, intente desplazar secciones de la imagen y complete el espacio abierto por el desplazamiento. Básicamente, reutilice los trucos que los programadores usaron para desplazarse sin problemas por los gráficos en un momento en que las CPU son lentas y la RAM es pequeña.

2

Si está creando una nueva aplicación de gráficos que necesita una tasa de cuadros alta y está buscando sugerencias, le sugiero que abandone GDI + y use WPF. WPF usa aceleración de hardware y admite gráficos de modo retenido; esto tiene un rendimiento mucho mejor por menos trabajo que GDI +.

Si hay alguna limitación que prohíbe WPF, por favor explicarlo en su pregunta. Esto es relevante porque tales limitaciones también pueden afectar el dibujo de GDI +.

0

Me enfrenté a un problema similar al desarrollar mi propia aplicación GIS. La mejor solución que encontré para esto (incluso cuando se usa WPF) es crear mosaicos de imágenes grandes y mostrar solo las partes que son visibles. Esto se dice, me cambiaría a WPF no solo por las razones dadas en las respuestas anteriores sino también por el buen soporte de imágenes ofrecido. Consulte el enlace this para obtener más información

Cuestiones relacionadas