MMXSwarm-Beispiel: Demonstriert CImage- und Visual C++ MMX-Unterstützung

Aktualisiert: November 2007

Das MFC-Beispiel MMXSwarm demonstriert, wie die MFC-Klasse CImage, die Datentypen __m64 und __m128i sowie geräteunabhängige Bitmaps (Device-Independent Bitmaps, DIBs) verwendet werden.

Es wird gezeigt, wie die CImage-Unterstützung in einer Basisanwendung für das Laden und Speichern von Daten in verschiedenen Bildformaten implementiert wird. Zusätzlich veranschaulicht das Beispiel das direkte Bearbeiten einer DIB-Oberfläche sowie die Verwendung einer Compilerunterstützung für MMX- und SSE2-Ganzzahlanweisungen auf höherer Ebene, um die Bitmapbearbeitung ohne das Schreiben von Assemblercode zu optimieren.

In diesem Projekt enthalten die Surface.*-Dateien eine C++-Basisklasse zum Bearbeiten der DIB-Oberfläche.

  • Die MMXSurface*.*-Dateien enthalten abgeleitete Klassen mit MMX-Optimierungen. Die Datei MMXWrapper.h enthält eine einfache Klasse, die den Datentyp __m64 des Compilers und dessen Operationen in eine C++-freundliche Klasse für 16-Bit-MMX-Operationen einschließt.

  • Die SSE2Surface*.*-Dateien enthalten abgeleitete Klassen mit SSE2-Optimierungen. Die Datei SSE2Wrapper.h enthält eine einfache Klasse, die den Datentyp __m128i des Compilers und dessen Operationen in eine C++-saturierte 16-Bit-SSE2-Ganzzahloperationen einschließt.   

Diese Wrapperklassen bieten in unveränderter Form kaum Nutzen, für dieses Beispiel ist ihr Funktionsumfang jedoch ausreichend. Die Dokument-/Ansichtarchitektur kommt im Beispiel nicht zum Einsatz. Die CChildView-Klasse ist von CWnd abgeleitet und wird an das Rahmenfenster gebunden.

Sicherheitshinweis:

Dieser Beispielcode dient dazu, ein Konzept zu veranschaulichen. Er sollte nicht für Anwendungen oder Websites verwendet werden, da dieser Code unter Umständen nicht die sicherste Codierungstechnik darstellt. Microsoft übernimmt keine Haftung für beiläufig entstandene Schäden oder Folgeschäden, falls der Beispielcode nicht bestimmungsgemäß verwendet wird.

So rufen Sie Beispiele und Anweisungen für ihre Installation ab

  • Klicken Sie in Visual Studio im Menü Hilfe auf Beispiele.

    Weitere Informationen finden Sie unter Suchen von Beispieldateien.

  • Die neueste Version und vollständige Liste mit Beispielen ist online unter Visual Studio 2008 Samples verfügbar.

  • Sie können auch Beispiele auf der Festplatte des Computers suchen. Standardmäßig werden Beispiele und eine Infodatei in einen Ordner unter \Programme\Visual Studio 9.0\Samples\ kopiert. Für Express Editions von Visual Studio sind alle Beispiele online verfügbar.

Erstellen und Ausführen des Beispiels

So erstellen Sie das MMXSwarm-Beispiel und führen es aus

  1. Öffnen Sie die Projektmappe MMXSwarm.sln.

  2. Klicken Sie im Menü Erstellen auf Erstellen.

  3. Klicken Sie im Menü Debuggen auf Starten ohne Debuggen.

Sowohl im Debug- als auch im Releasemodus werden Assemblylisten der Dateien MMXSurface*.cpp und SSE2Surface*.cpp im Ausgabeverzeichnis generiert. Überprüfen Sie in diesen Dateien den Code, der von den MMX- und SSE2-Bereichen des Projekts generiert wurde.

Durch Erstellen des Beispiels im Releasemodus können Sie feststellen, welche Geschwindigkeitsverbesserungen durch die Verwendung der systeminternen MMX- und SSE2-Ganzzahlunterstützung erreicht wurden. Zusätzlich werden Debuginformationen für das Releasebuild generiert, um das schrittweise Durchlaufen des durch MMX und SSE2 generierten Codes zu erleichtern.

Führen Sie das Beispiel im 32-Bit-Farbmodus aus, um optimale Ergebnisse zu erzielen.

Das Beispiel generiert auf dem Monitor einen einfachen Punktschwarm und zeichnet das Bild mit einer benutzerdefinierten Abblendroutine nach und nach weich. Das Menü Datei enthält die Optionen zum Speichern des aktuellen bzw. zum Laden eines vorhandenen Bildes. Im Menü Ansicht finden Sie die Optionen zum Aktivieren bzw. Deaktivieren des Weichzeichners und des Punktschwarms. Das Menü Ansicht enthält außerdem einen Befehl "Pause Blit", wodurch BitBlt für den Bildschirm deaktiviert und in Weichzeichenimplementierungen eine bessere Frameratenunterscheidung ermöglicht wird. Zusätzlich werden einige Tastaturbefehle asynchron nach weiteren Änderungen überprüft (UMSCHALTTASTE, LEERTASTE, NACH-OBEN und ENTF). Schließlich können Sie im Menü CImage die Bittiefe für die zu ändernde DIB angeben. Üblicherweise ist es am besten, die Bittiefe an die des Desktops anzupassen. Jede Bittiefe bietet eine Option für das Weichzeichnen mit einer generischen C++-Routine bzw. eine mithilfe der systeminternen MMX- oder SSE2-Ganzzahlkomponenten optimierte Option. Die Statusleiste enthält Messwerte (Rahmen pro Sekunde), die die Performanceunterschiede veranschaulichen.

Schlüsselwörter

Dieses Beispiel demonstriert die Verwendung der folgenden Schlüsselwörter:

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

Siehe auch

Weitere Ressourcen

MFC-Beispiele