MMXSwarm サンプル : CImage と Visual C++ MMX サポート
更新 : 2007 年 11 月
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 クラスは、フレーム ウィンドウにバインドされています。
セキュリティに関するメモ : |
---|
このサンプル コードは概念を示す目的で提供されているものです。必ずしも最も安全なコーディング手法に従っているわけではないので、アプリケーションまたは Web サイトでは使用しないでください。Microsoft は、サンプル コードが意図しない目的で使用された場合に、付随的または間接的な損害について責任を負いません。 |
サンプルとそのインストール手順を取得するには
Visual Studio で、[ヘルプ] メニューの [サンプル] をクリックします。
詳細については、「サンプル ファイルの格納場所」を参照してください。
使用できるサンプルの最新バージョンと完全な一覧については、オンラインの Visual Studio 2008 Samples のページを参照してください。
サンプルは、コンピュータのハード ディスク上にもあります。既定では、サンプルおよび Readme ファイルは、\Program Files\Visual Studio 9.0\Samples\ の下のフォルダにコピーされます。Visual Studio Express Edition の場合、すべてのサンプルはオンライン上にあります。
サンプルのビルドと実行
MMXSwarm サンプルをビルドおよび実行するには
ソリューション MMXSwarm.sln を開きます。
[ビルド] メニューの [ビルド] をクリックします。
[デバッグ] メニューの [デバッグなしで開始] をクリックします。
デバッグ モードとリリース モードのどちらでも、MMXSurface*.cpp ファイルおよび SSE2Surface*.cpp ファイルのアセンブリ一覧が出力ディレクトリに生成されます。これらのファイルを調べて、プロジェクトの MMX および SSE2 部分によって生成されたコードを確認します。
リリース モードでサンプルをビルドし、組み込み MMX サポートおよび SSE2 整数サポートを使用することによって速度が向上したことを確認します。また、デバッグ情報がリリース ビルドに対して生成されるため、MMX 生成コードおよび SSE2 生成コードを簡単に調べることができます。
最善の結果を得るために、サンプルを 32 ビット色モードで実行することをお勧めします。
サンプルでは、群れの単純なイメージが画面に描画され、時間の経過につれてカスタムのフェード ルーチンによってイメージがぼやけます。[File] メニューには、現在のイメージを保存するオプションや既存のイメージを読み込むオプションがあります。[View] メニューには、ぼかしや群れのイメージを有効または無効にするオプションがあります。[View] メニューには、ぼかし実行中でのフレーム レートを向上させる、画面への BitBlt を無効にする [Pause Blit] コマンドも用意されています。さらに、ほかの DIB 操作についていくつかのキーストローク (Shift、Space、↑、Del) が非同期でチェックされます。また、CImage メニューを使用すると、操作対象の DIB のビットの深さを選択できます。通常は、デスクトップのビットの深さと同じにするのが最適です。各ビットの深さには、ジェネリック C++ ルーチンによるぼかしのオプション、MMX 組み込み、または SSE2 整数組み込みによって最適化されたオプションがあります。ステータス バーには、1 秒ごとのフレーム測定機能があり、パフォーマンスの差が示されます。
キーワード
このサンプルでは、次のキーワードを使用します。
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