Condividi tramite


Esempio MMXSwarm: supporto MMX di CImage e Visual C++

Aggiornamento: novembre 2007

MMXSwarm è un esempio MFC in cui viene illustrato come utilizzare la classe CImage MFC, i tipi di dati __m64 e __m128i e le immagini DIB (Device-Independent Bitmap).

Nell'esempio viene illustrata l'implementazione del supporto CImage in un'applicazione per il caricamento e il salvataggio di dati in numerosi formati di immagine. Nell'esempio inoltre viene illustrata la modifica diretta di un'area DIB, nonché l'utilizzo del supporto di compilatori di alto livello per le istruzioni integer SSE2 e MMX allo scopo di ottimizzare la modifica di immagini bitmap senza scrivere codice assembler.

Nel progetto, i file Surface.* contengono la classe base C++ per la modifica dell'area DIB.

  • I file MMXSurface*.* contengono le classi derivate con ottimizzazioni MMX. MMXWrapper.h contiene una classe semplice che incapsula il tipo di dati __m64 e le operazioni del compilatore in una classe friend C++ per operazioni MMX saturate a 16 bit.

  • I file SSE2Surface*.* contengono le classi derivate con ottimizzazioni SSE2. SSE2Wrapper.h contiene una classe semplice che incapsula il tipo di dati __m128i e le operazioni del compilatore in una classe friend C++ per operazioni integer SSE2 saturate a 16 bit.   

Queste classi wrapper in genere non risultano utile così come vengono fornite, poiché contengono funzionalità sufficienti solo per l'esempio. Nell'esempio non viene utilizzata l'architettura documento/visualizzazione. La classe CChildView è derivata da CWnd e associata alla finestra cornice.

Nota sulla sicurezza:

Questo esempio di codice viene fornito solo a scopo dimostrativo e non deve essere utilizzato in applicazioni o siti Web, poiché potrebbe non implementare le tecniche migliori a livello di sicurezza. Microsoft esclude ogni responsabilità per danni diretti o indiretti derivanti dall'utilizzo dell'esempio di codice per scopi diversi da quelli previsti.

Per ottenere gli esempi e le istruzioni per l'installazione:

  • In Visual Studio scegliere Esempi dal menu ?.

    Per ulteriori informazioni, vedere Individuazione dei file di esempio.

  • La versione più recente e l'elenco completo degli esempi sono disponibili in linea alla pagina Visual Studio 2008 Samples.

  • È anche possibile trovare gli esempi sul disco rigido del computer. Per impostazione predefinita, gli esempi e il file Leggimi vengono copiati in una cartella nel percorso \Programmi\Visual Studio 9.0\Samples\. Per le versioni Express di Visual Studio, tutti gli esempi sono disponibili in linea.

Generazione ed esecuzione dell'esempio

Per generare ed eseguire l'esempio MMXSwarm

  1. Aprire il file di soluzione MMXSwarm.sln.

  2. Scegliere Genera dal menu Genera.

  3. Scegliere Avvia senza eseguire debug dal menu Debug.

In entrambe le modalità Release e Debug, i listati dell'assembly dei file MMXSurface*.cpp e SSE2Surface*.cpp vengono generati nella directory di output. Esaminare questi file per controllare il codice generato dalle parti MMX e SSE2 del progetto.

Generare l'esempio in modalità Release per verificare l'incremento di velocità ottenuto utilizzando il supporto di integer SSE2 e MMX intrinseco. Per la build di rilascio vengono inoltre generate informazioni sul debug, in modo da semplificare la verifica un'istruzione alla volta del codice MMX e SSE2 generato.

Per ottenere risultati ottimali, eseguire l'esempio in modalità a colori a 32 bit.

Nell'esempio viene disegnato uno sciame semplice sullo schermo e viene utilizzata una routine di sfumatura personalizzata per sfocare l'immagine con il passare del tempo. Nel menu File sono disponibili le opzioni per salvare l'immagine corrente o per caricare un'immagine esistente. Nel menu Visualizza sono disponibili le opzioni per disattivare o attivare l'effetto sfumatura e lo sciame. Nel menu Visualizza è inoltre incluso un comando "Pause Blit" con cui viene disattivata la funzionalità BitBlt per lo schermo che consente di ottimizzare le differenze nella frequenza di aggiornamento nelle implementazioni della sfumatura. Inoltre, varie sequenze di tasti sono controllate in modo asincrono per eseguire altre modifiche sulla DIB (MAIUSC, SPAZIO, FRECCIA SU e CANC). Il menu CImage consente infine di scegliere la profondità di bit dell'immagine DIB che viene modificata. In genere, è opportuno che questo valore corrisponda alla profondità bit del desktop. A ciascuna profondità di bit è associata un'opzione per la creazione dell'effetto sfumatura con una routine C++ generica oppure con una routine ottimizzata con le nuove funzioni intrinseche integer MMX o SSE2. La barra di stato contiene il valore della misurazione frame al secondo per illustrare le differenze di prestazioni.

Parole chiave

Nell'esempio vengono illustrate le seguenti parole chiave:

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

Vedere anche

Altre risorse

Esempi relativi ad MFC