Share via


MMXSwarm 샘플: CImage 및 Visual C++ MMX 지원 설명

업데이트: 2007년 11월

MMXSwarm은 MFC CImage 클래스, __m64__m128i 데이터 형식 및 DIB(장치 독립적 비트맵)를 사용하는 방법을 보여 주는 MFC 샘플입니다.

이 샘플에서는 데이터를 다양한 이미지 형식으로 로드하고 저장하는 기본 기능을 위해 응용 프로그램에 CImage 지원을 구현하는 방법을 보여 줍니다. 또한, DIB 표면의 직접 조작 방법과 MMX 및 SSE2 정수 명령에 대한 고수준 컴파일러 지원을 사용하여 어셈블러 코드를 작성하지 않고도 비트맵 조작을 최적화하는 방법도 보여 줍니다.

이 프로젝트의 Surface.* 파일에는 DIB 표면 조작을 위한 C++ 기본 클래스가 들어 있습니다.

  • 또한 MMXSurface*.* 파일에는 MMX 최적화가 포함된 파생 클래스가 들어 있습니다. MMXWrapper.h에는 컴파일러의 __m64 데이터 형식 및 연산을 16비트 색상의 MMX 연산을 위한 C++ 기반 클래스로 캡슐화하는 간단한 클래스가 들어 있습니다.

  • SSE2Surface*.* 파일에는 SSE2 최적화를 통해 파생된 클래스가 들어 있습니다. SSE2Wrapper.h에는 컴파일러의 __m128i 데이터 형식 및 연산을 16비트 색상의 SSE2 정수 연산을 위한 C++ 기반 클래스로 캡슐화하는 간단한 클래스가 들어 있습니다.

이러한 래퍼 클래스는 샘플용에 적합한 기능만 포함하고 있으며 있는 그대로의 상태로는 일반적으로 유용하지 않습니다. 이 샘플에서는 문서/뷰 아키텍처를 사용하지 않습니다. CChildView 클래스는 CWnd에서 파생되며 프레임 창에 바인딩됩니다.

보안 정보:

이 샘플 코드는 개념을 보여 주기 위해 제공되며 가장 안전한 코드 작성 방법을 제시하지 않을 수 있으므로 응용 프로그램이나 웹 사이트에서 사용할 수 없습니다. Microsoft는 샘플 코드를 원래 용도 이외의 다른 용도로 사용하는 경우 발생하는 부수적이나 파생적인 손해에 대해 책임을 지지 않습니다.

샘플 및 이를 설치하기 위한 지침을 가져오려면

  • Visual Studio의 도움말 메뉴에서 샘플을 클릭합니다.

    자세한 내용은 샘플 파일 찾기를 참조하십시오.

  • 최신 버전 및 전체 샘플 목록은 Visual Studio 2008 Samples 페이지에서 온라인으로 사용할 수 있습니다.

  • 컴퓨터의 하드 디스크에서도 샘플을 찾을 수 있습니다. 기본적으로 샘플과 추가 정보 파일은 \Program Files\Visual Studio 9.0\Samples\ 아래의 폴더에 복사됩니다. Visual Studio Express Edition의 경우에는 모든 샘플이 온라인에 있습니다.

샘플 빌드 및 실행

MMXSwarm 샘플을 빌드하고 실행하려면

  1. 솔루션 파일인 MMXSwarm.sln을 엽니다.

  2. 빌드 메뉴에서 빌드를 클릭합니다.

  3. 디버그 메뉴에서 디버깅하지 않고 시작을 클릭합니다.

디버그 모드와 릴리스 모드 모두에서 MMXSurface*.cpp 및 SSE2Surface*.cpp 파일의 어셈블리 목록은 출력 디렉터리에 생성됩니다. 이 파일들을 검사하여 프로젝트의 MMX 및 SSE2 부분에서 생성된 코드를 확인합니다.

샘플을 릴리스 모드에서 빌드하여 내장 MMX 및 SSE2 정수 지원을 사용할 때의 속도 향상을 확인합니다. 또한 MMX 및 SSE2 생성 코드의 단계별 실행을 쉽게 할 수 있도록 릴리스 빌드에 대해 디버그 정보가 생성됩니다.

최적의 결과를 얻으려면 샘플을 32비트 색 모드에서 실행해야 합니다.

이 샘플에서는 화면에 간단한 모양의 스웜 무늬를 그리고 사용자 지정 페이드 루틴을 사용하여 이미지가 점점 흐려지게 합니다. File 메뉴에는 현재 이미지를 저장하거나 기존 이미지를 로드하는 옵션이 있습니다. View 메뉴에는 흐리게 효과 및 스웜 효과를 비활성화/활성화하는 옵션이 있습니다. View 메뉴에는 흐리게 효과 구현에서 프레임 속도를 향상시키는 BitBlt를 화면에서 비활성화하는 'Pause Blit' 명령도 있습니다. 또한 다른 DIB 조작에 대해 Shift, Space, 위쪽 화살표, 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 샘플