MMXSwarm サンプル:CImage および Visual C++ MMX サポート例を示します

MMXSwarm は、MFC CImage クラス、__m64 データ型、__m128i データ型、およびデバイスに依存しないビットマップ (DIB: Device-Independent Bitmap) の使い方を示す MFC サンプルです。

このサンプルでは、各種のイメージ形式でデータの基本的な読み込みと保存を行うアプリケーションへの CImage サポートの実装を示します。 さらに、このサンプルでは、DIB 領域の直接操作と、アセンブラー コードを作成せずにビットマップ操作を最適化する MMX 命令および SSE2 整数命令のための高水準のコンパイラ サポートの使用についても説明しています。

プロジェクトでは、DIB 領域操作のための C++ 基本クラスが Surface.* ファイルに含まれています。

  • MMXSurface*.* ファイルには、MMX 最適化を含む派生クラスが含まれています。 MMXWrapper.h には、コンパイラの __m64 データ型と操作を 16 ビット MMX 飽和演算のための C++ 対応クラスにカプセル化する、単純なクラスが含まれています。

  • SSE2Surface*.* ファイルには、SSE2 最適化を含む派生クラスが含まれています。 SSE2Wrapper.h には、コンパイラの __m128i データ型と操作を 16 ビット SSE2 飽和整数演算のための C++ 対応クラスにカプセル化する、単純なクラスが含まれています。

通常、ラッパー クラスは "そのまま" では使用しません。サンプルとして十分な機能が含まれているだけです。 このサンプルでは、ドキュメント/ビュー アーキテクチャを使用していません。 CWnd から派生した CChildView クラスは、フレーム ウィンドウにバインドされています。

セキュリティに関するメモセキュリティに関するメモ

このサンプル コードは概念を示すためのものであり、その概念に関連するコードのみを示しています。特定の環境について必ずしもセキュリティ要件を満たしていませんので、そのまま使用しないでください。セキュリティおよびエラー処理コードを追加して、プロジェクトをより安全かつ堅牢にすることをお勧めします。これらのサンプル コードは、現状有姿のままで提供されるものであり、一切保証されていません。

サンプルとそのインストール手順を取得するには

Visual Studio のサンプルにアクセスするには

  • [ヘルプ] メニューの [サンプル] をクリックします。

    既定では、これらのサンプルは drive:\Program Files\Microsoft Visual Studio 10.0\Samples\ にインストールされています。

  • このサンプルの最新版および他のサンプルの一覧については、MSDN Web サイト上で Visual Studio サンプル 」を参照してください。

サンプルのビルドと実行

MMXSwarm サンプルをビルドおよび実行するには

  1. ソリューション MMXSwarm.sln を開きます。

  2. [ビルド] メニューの [ビルド] をクリックします。

  3. でデバッグ メニューの、[デバッグなしで開始 をクリックします。

デバッグ モードとリリース モードのどちらでも、MMXSurface*.cpp ファイルおよび SSE2Surface*.cpp ファイルのアセンブリ一覧が出力ディレクトリに生成されます。 これらのファイルを調べて、プロジェクトの MMX および SSE2 部分によって生成されたコードを確認します。

リリース モードでサンプルをビルドし、組み込み MMX サポートおよび SSE2 整数サポートを使用することによって速度が向上したことを確認します。 また、デバッグ情報がリリース ビルドに対して生成されるため、MMX 生成コードおよび SSE2 生成コードを簡単に調べることができます。

最善の結果を得るために、サンプルを 32 ビット色モードで実行することをお勧めします。

サンプルでは、群れの単純なイメージが画面に描画され、時間の経過につれてカスタムのフェード ルーチンによってイメージがぼやけます。 ファイル このメニューには、現在のイメージを保存または既存のイメージを読み込むためのオプションがあります。 [View] メニューには、ぼかしや群れのイメージを有効または無効にするオプションがあります。 [View] メニューには、ぼかし実行中でのフレーム レートを向上させる、画面への BitBlt を無効にする [Pause Blit] コマンドも用意されています。 さらに、ほかの DIB 操作についていくつかのキーストローク (ShiftSpaceDel) が非同期でチェックされます。 最後に、CImage メニューで操作対象の DIB のビット深さを選択できます。 通常は、デスクトップのビットの深さと同じにするのが最適です。 各ビットの深さには、ジェネリック C++ ルーチンによるぼかしのオプション、MMX 組み込み、または SSE2 整数組み込みによって最適化されたオプションがあります。 ステータス バーには、1 秒ごとのフレーム測定機能があり、パフォーマンスの差が示されます。

Keywords

このサンプルでは、次のキーワードを使用します。

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 サンプル