共用方式為


MMXSwarm 範例:示範 CImage 和 Visual C++ MMX 支援

更新:2007 年 11 月

MMXSwarm 是一個 MFC 範例,示範如何使用 MFC CImage 類別、__m64 資料型別、__m128i 資料型別以及與裝置無關的點陣圖 (DIB)。

這個範例會針對在應用程式中以多種影像格式進行資料載入與儲存的基本動作,示範 CImage 支援的實作方法。此外,範例中還會示範 DIB 表面的直接操作方法,並且使用 MMX 和 SSE2 整數指令的高階支援,在不需要撰寫組合語言程式碼的情況下,最佳化點陣圖管理。

在專案中,Surface.* 檔包含 DIB 表面管理的 C++ 基底類別:

  • MMXSurface*.* 檔包含了完成 MMX 最佳化的衍生類別。MMXWrapper.h 包含一個簡單類別,可將編譯器的 __m64 資料型別和作業封裝到 16 位元 Saturate 處理的 MMX 作業之 C++ friendly 類別中。

  • SSE2Surface*.* 檔案中包含了具備 SSE2 最佳化的衍生類別。SSE2Wrapper.h 包含一個簡單類別,可將編譯器的 __m128i 資料型別和作業封裝到 C++ friendly 類別中,以進行 16 位元 Saturate 處理的 SSE2 整數作業。

這些未經修改的包裝函式類別通常不是很有用,因為只包含此範例夠用的功能而已。範例中不使用文件/檢視架構。CChildView 類別衍生自 CWnd,並繫結至框架視窗 (Frame Window)。

安全性注意事項:

這個程式碼範例僅供概念說明之用,同時因為範例中的程式碼撰寫並沒有周全的顧及所有安全性問題,所以本範例不適用於實際執行的應用程式或網站中。如果使用者擅自將範例程式碼用於其他意圖而導致連帶事件或重大損害時,Microsoft 將不承擔任何責任。

若要取得範例和指示以便進行安裝:

  • 按一下 Visual Studio [說明] 功能表上的 [範例]。

    如需詳細資訊,請參閱尋找範例檔案

  • 最新版的完整範例清單可從 Visual Studio 2008 範例網頁 (英文) 取得。

  • 您也可以將範例置於電腦硬碟中。根據預設,範例和讀我檔案都會複製到 \Program Files\Visual Studio 9.0\Samples\ 下的資料夾中。對於所有的 Visual Studio Express 版,所有範例都可在線上找到。

建置和執行範例

若要建置並執行 MMXSwarm 範例

  1. 開啟 MMXSwarm.sln 方案。

  2. 在 [建置] 功能表上,按一下 [建置]。

  3. 在 [偵錯] 功能表上,按一下 [啟動但不偵錯]。

在 [偵錯] 和 [發行] 兩個模式中,MMXSurface*.cpp 和 SSE2Surface*.cpp 檔的組件清單都會產生於輸出目錄中。請檢查這些檔案來查看專案的 MMX 和 SSE2 部分所產生的程式碼。

在 [發行] 模式中建置範例,以便查看使用內建 MMX 和 SSE2 整數支援所獲得的加速情形。此外,也會產生發行版本的偵錯資訊,以便減輕逐步執行 MMX 和 SSE2 產生的程式碼作業。

若要取得最佳結果,請在 32 位元色彩模式中執行該範例。

範例會在螢幕上繪製一個簡單的群集,並使用自訂淡出常式隨著時間來模糊影像。[檔案] 功能表具有儲存目前影像或載入現有影像的選項。在 [檢視] 功能表中則可停用及啟用模糊和群集選項。[檢視] 功能表還包含了 'Pause Blit' 命令,可停用螢幕的 BitBlt,使實作模糊時有較高的影像更新頻率。為了配合其他 DIB 管理,會針對數個按鍵 (SHIFT、SPACE、UP ARROW 和 DELETE) 動作進行非同步檢查。最後,CImage 功能表可讓您選取正在操作的 DIB 位元深度。通常,符合桌面的色深為最佳深度。每個色深都有可模糊畫面的選項和泛型 C++ 常式,或是已由新的 MMX 或 SSE2 整數內建最佳化的選項。狀態列含有一個每秒播放格的測量結果,可說明效能差異。

關鍵字

本範例會使用下列關鍵字:

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

請參閱

其他資源

MFC 範例