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 位饱和 MMX 操作的 C++ 友好类中。
SSE2Surface*.* 文件包含具有 SSE2 优化的派生类。SSE2Wrapper.h 包含一个简单的类,该类将编译器的 __m128i 数据类型和操作封装到 C++ 友好类中,以进行 16 位饱和 SSE2 整数操作。
这些包装类本身并不具有广泛的通用性,它们所包含的功能仅够此示例使用。此示例不使用文档/视图结构。CChildView 类从 CWnd 派生并绑定到框架窗口。
安全说明: |
---|
提供该示例代码是为了阐释一个概念,并不代表着最安全的编码实践,因此不应在应用程序或网站中使用该示例代码。对于超出本示例代码的预期用途以外的使用所造成的偶然或继发性损失,Microsoft 不承担任何责任。 |
获取示例和安装示例的说明:
在 Visual Studio 的“帮助”菜单上,单击“示例”。
有关更多信息,请参见定位示例文件。
示例的最新版本和完整列表可以从 Visual Studio 2008 Samples page(Visual Studio 2008 示例页面)联机获取。
还可以在计算机的硬盘上查找示例。默认情况下,示例和自述文件将复制到 \Program Files\Visual Studio 9.0\Samples\ 下的文件夹中。对于 Visual Studio 速成版,所有示例都位于联机位置。
生成并运行示例
生成并运行 MMXSwarm 示例
打开解决方案 MMXSwarm.sln。
在“生成”菜单中单击“生成”。
在“调试”菜单中,单击“开始执行(不调试)”。
在“Debug”和“Release”模式中,MMXSurface*.cpp 和 SSE2Surface*.cpp 文件的程序集列表在输出目录中生成。检查这些文件,查看由项目的 MMX 和 SSE2 部分生成的代码。
以“Release”模式生成此示例,查看由于使用内部 MMX 和 SSE2 整数支持而获得的速度提高。另外,为发布版本生成了调试信息,以简化逐句通过 MMX 和 SSE2 生成的代码。
为了获得最佳效果,请以 32 位彩色模式运行此示例。
此示例在屏幕上绘制一个简单的蜂群,并使用自定义淡出例程使图像随时间变得模糊。“文件”菜单包含用于保存当前图像或加载现有图像的选项。“视图”菜单包含禁用/启用模糊处理和蜂群的选项。“视图”菜单还包含一个“Pause Blit”命令,该命令对屏幕禁用 BitBlt,从而在模糊实现中支持更佳的帧速率分辨。另外,以异步方式为其他 DIB 操作选中若干按键(Shift、空格键、向上键和 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