Partager via


MMXSwarm, exemple : illustre la prise en charge de CImage et de MMX Visual C++

Mise à jour : novembre 2007

MMXSwarm est un exemple MFC qui montre comment utiliser la classe CImage MFC, les types de données __m64 et __m128i, et les bitmaps indépendantes du périphérique (DIB, Device-Independent Bitmap).

Cet exemple illustre l'implémentation de la prise en charge de CImage dans une application pour les opérations élémentaires de chargement et d'enregistrement des données dans de nombreux formats d'image. Il illustre également la manipulation directe d'une surface DIB, ainsi que la prise en charge du compilateur de niveau supérieur pour les instructions MMX et entier SSE2, afin d'optimiser la manipulation des bitmaps sans devoir écrire du code assembleur.

Dans le projet, les fichiers Surface.* contiennent la classe de base C++ pour permettre la manipulation de la surface DIB :

  • Les fichiers MMXSurface*.* contiennent des classes dérivées avec des optimisations MMX. MMXWrapper.h contient une classe simple qui encapsule le type de données __m64 et les opérations du compilateur dans une classe conviviale C++ pour les opérations MMX saturées 16 bits.

  • Les fichiers SSE2Surface*.* contiennent des classes dérivées avec des optimisations SSE2. SSE2Wrapper.h contient une classe simple qui encapsule le type de données __m128i et les opérations du compilateur dans une classe conviviale C++ pour les opérations sur les entiers SS2E2 saturées 16 bits.

Ces classes Wrapper ne sont généralement pas utiles sous leur forme d'origine, car elles ne contiennent que la fonctionnalité minimale requise pour l'exemple. L'exemple n'utilise pas l'architecture Document/Vue. La classe CChildView est dérivée de CWnd et est liée à la fenêtre frame.

Note de sécurité :

Cet exemple de code est fourni pour illustrer un concept et ne doit pas être utilisé dans des applications ou des sites Web, car il peut ne pas illustrer les pratiques de programmation les plus sûres. Microsoft n'assume aucune responsabilité pour tout dommage indirect ou consécutif en cas d'utilisation de l'exemple de code à des fins autres que celles prévues.

Pour obtenir des exemples et des instructions d'installation :

  • Dans le menu ? (Aide) de Visual Studio, cliquez sur Exemples.

    Pour plus d'informations, consultez Recherche des fichiers d'exemple.

  • La liste la plus récente et la plus complète d'exemples est disponible en ligne à partir de la page Visual Studio 2008 Samples.

  • Des exemples sont également disponibles sur le disque dur de votre ordinateur. Des exemples et un fichier Readme sont stockés par défaut dans un dossier sous \Program Files\Visual Studio 9.0\Samples\. Pour les éditions Express de Visual Studio, tous les exemples sont disponibles en ligne.

Génération et exécution de l'exemple

Pour générer et exécuter l'exemple MMXSwarm

  1. Ouvrez la solution MMXSwarm.sln.

  2. Dans le menu Générer, cliquez sur Générer.

  3. Dans le menu Déboguer, cliquez sur Exécuter sans débogage.

Dans les deux modes, Debug et Release, les listes de fichiers MMXSurface*.cpp et SSE2Surface*.cpp des assemblys sont générées dans le répertoire de sortie. Examinez ces fichiers pour visualiser le code généré par les parties MMX et SSE2 du projet.

Générez l'exemple en mode Release pour constater le gain de vitesse réalisé grâce à l'utilisation de la prise en charge MMX et SSE2 intrinsèque. En outre, des informations de débogage sont produites pour faciliter l'exécution pas à pas du code MMX et SSE2 généré dans la version Release.

Pour obtenir les meilleurs résultats possibles, exécutez l'exemple dans un mode de couleurs 32 bits.

L'exemple dessine un simple essaim à l'écran, puis utilise une routine de fondu personnalisé pour rendre l'image floue au fil du temps. Le menu File comporte les options nécessaires à l'enregistrement de l'image en cours ou au chargement d'une image existante. Le menu View comporte les options nécessaires à la désactivation ou à l'activation du flou et de l'essaim. Le menu View contient également une commande "Pause Blit" qui désactive BitBlt dans l'écran ce qui permet de meilleures distinctions de fréquence de frames dans les implémentations floues. En outre, plusieurs séquences de touches sont vérifiées de manière asynchrone pour d'autres opérations de manipulation de fichier DIB (MAJ, ESPACE, HAUT et SUPPR). Enfin, le menu CImage vous permet de sélectionner le nombre de bits du fichier DIB manipulé. En règle générale, il est préférable de faire correspondre cette valeur au nombre de bits du bureau. Chaque nombre de bits correspond à une option permettant de créer un flou via une routine C++ générique ou une routine optimisée avec les nouvelles instructions MMX ou entier SSE2 intrinsèques. La barre d'état contient une mesure en frames par seconde pour illustrer les différences de performances.

Mots clés

Cet exemple illustre l'utilisation des mots clés suivants :

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

Voir aussi

Autres ressources

Exemples MFC