Ejemplo MMXSwarm: muestra la compatibilidad con CImage y Visual C++ MMX

Actualización: noviembre 2007

MMXSwarm es un ejemplo de MFC que ilustra la forma de utilizar la clase CImage de MFC, los tipos de datos __m64 y __m128i, y los mapas de bits independientes del dispositivo (DIB).

El ejemplo ilustra la implementación de la compatibilidad con CImage en una aplicación para las operaciones básicas de cargar y guardar datos en muchos formatos de imagen. Además, ilustra la forma de manipular directamente la superficie de un mapa de bits DIB, así como el uso de la compatibilidad de alto nivel del compilador con instrucciones MMX y de enteros SSE2 para optimizar la manipulación de mapas de bits sin escribir código ensamblador.

En el proyecto, los archivos Surface.* contienen la clase base de C++ para la manipulación de la superficie de imágenes DIB:

  • Los archivos MMXSurface*.* contienen clases derivadas con optimizaciones MMX. MMXWrapper.h contiene una clase simple que encapsula el tipo de datos __m64 del compilador y las operaciones en una clase descriptiva de C++ para operaciones MMX saturadas de 16 bits.

  • Los archivos SSE2Surface*.* contienen clases derivadas con optimizaciones SSE2. SSE2Wrapper.h contiene una clase simple que encapsula el tipo de datos __m128i del compilador y las operaciones en una clase descriptiva de C++ para operaciones de enteros SSE2 saturadas de 16 bits.

Estas clases contenedoras no se suelen utilizar sin cambios, ya que sólo contienen funcionalidad suficiente para el ejemplo. El ejemplo no utiliza la arquitectura documento/vista. La clase CChildView se deriva de CWnd y se enlaza a la ventana de marco.

Nota de seguridad:

Este código de ejemplo se proporciona para ilustrar un concepto y no debe utilizarse en aplicaciones o sitios Web, ya que quizás no ilustre las prácticas de codificación más seguras. Microsoft no asume ninguna responsabilidad por daños incidentales o consecuentes en caso de que el código de ejemplo se utilice para propósitos distintos de aquellos para los que se concibió.

Para obtener ejemplos e instrucciones para su instalación:

  • En el menú Ayuda de Visual Studio, haga clic en Ejemplos.

    Para obtener más información, vea Localizar archivos de ejemplo.

  • La lista de ejemplos completa con la versión más reciente está disponible en línea en la página Visual Studio 2008 Samples.

  • También encontrará ejemplos en el disco duro de su equipo. De manera predeterminada, los ejemplos y el archivo Léame se copian en una carpeta bajo \Archivos de programa\Visual Studio 9.0\Samples\. Para las versiones Express de Visual Studio, todos los ejemplos están en línea.

Generar y ejecutar el ejemplo

Para generar y ejecutar el ejemplo MMXSwarm

  1. Abra la solución MMXSwarm.sln.

  2. En el menú Generar, haga clic en Generar.

  3. En el menú Depurar, haga clic en Iniciar sin depurar.

En los modos de depuración y lanzamiento, se generan listas de ensamblados de los archivos MMXSurface*.cpp y SSE2Surface*.cpp en el directorio de resultados. Examine estos archivos para ver el código generado por las partes compatibles con MMX y SSE2 del proyecto.

Genere el ejemplo en modo de Lanzamiento para ver las mejoras de velocidad obtenidas al utilizar la compatibilidad intrínseca con MMX y enteros SSE2. Además, se genera información de depuración para la versión de lanzamiento a fin de facilitar el recorrido del código MMX y SSE2 generado.

Para obtener mejores resultados, ejecute el ejemplo en modo de color de 32 bits.

El ejemplo dibuja un enjambre en pantalla y utiliza una rutina personalizada para desvanecer la imagen poco a poco. El menú File tiene opciones para guardar la imagen actual o cargar una imagen existente. El menú View tiene opciones para deshabilitar o habilitar el desvanecimiento de la imagen y la imagen del enjambre. El menú View también tiene un comando 'Pause Blit' que desactiva BitBlt en la pantalla que permite mejor diferencia de frecuencia de imágenes en las implementaciones de desvanecimiento de imagen. Además, se comprueban de forma asincrónica varias pulsaciones de teclas para otras manipulaciones de imágenes DIB (MAYÚS, ESPACIO, FLECHA ARRIBA y SUPRIMIR). Por último, el menú CImage permite seleccionar la profundidad de color de la imagen DIB que se está manipulando. Normalmente, se obtiene el mejor resultado si coincide con la profundidad de color del escritorio. Cada profundidad de color tiene una opción para desvanecerse mediante una rutina genérica programada en C++, u otra rutina optimizada con los detalles intrínsecos de MMX o de los enteros SSE2. La barra de estado contiene una medida de marcos por segundo para ilustrar la diferencia de rendimiento.

Palabras clave

En este ejemplo, se muestra el uso de las siguientes palabras clave:

CImage::GetExporterFilterString, CImage::Load, CImage::SaveAdvanced, CImage::Create, CImage::GetPitch, CImage::GetDC, CImage::ReleaseDC, CImage::Destroy, CImage::BitBlt, CImage::GetBits, CImage::GetHeight, CImage::GetPixelAddress, GetAsyncKeyState, CDC::GetDeviceCaps, ON_UPDATE_COMMAND_UI_RANGE, CWnd::OnSizing, __m64, __m128i, CWinApp::OnIdle, _m_from_int, _mm_setzero_si64, _mm_adds_pu16, _mm_subs_pu16, _mm_srli_pi16, _mm_slli_pi16, _mm_and_si64, _mm_or_si64, _mm_andnot_si64, _m_to_int, _mm_packs_pu16, _mm_unpacklo_pi8, _mm_unpackhi_pi8, _mm_loadl_epi64, _mm_setzero_si128, _mm_set1_epi64, _mm_adds_epu16, _mm_subs_epu16, _mm_srli_epi16, _mm_slli_epi16, _mm_and_si128, _mm_or_si128, _mm_andnot_si128, _mm_packus_epi16, _mm_store_si128, _mm_load_si128, _mm_packus_epi16, _mm_unpacklo_epi8, _mm_unpackhi_epi8

Vea también

Otros recursos

Ejemplos de MFC