다음을 통해 공유


D3DSWAPEFFECT 열거형

스왑 효과를 정의합니다.

Syntax

typedef enum D3DSWAPEFFECT { 
  D3DSWAPEFFECT_DISCARD      = 1,
  D3DSWAPEFFECT_FLIP         = 2,
  D3DSWAPEFFECT_COPY         = 3,
  D3DSWAPEFFECT_OVERLAY      = 4,
  D3DSWAPEFFECT_FLIPEX       = 5,
  D3DSWAPEFFECT_FORCE_DWORD  = 0xFFFFFFFF
} D3DSWAPEFFECT, *LPD3DSWAPEFFECT;

상수

D3DSWAPEFFECT_DISCARD

D3DSWAPEFFECT_FLIP 또는 D3DSWAPEFFECT_COPY 스왑 효과를 사용하여 스왑 체인을 만들 때 런타임은 IDirect3DDevice9::P resent 작업이 백 버퍼의 콘텐츠에 영향을 주지 않도록 보장합니다. 아쉽게도 이 보장을 충족하면 상당한 비디오 메모리 또는 처리 오버헤드가 포함될 수 있습니다. 특히 창이 있는 스왑 체인에 대한 대칭 이동 의미 체계를 구현하거나 전체 화면 스왑 체인에 대한 의미 체계를 복사할 때 특히 그렇습니다. 애플리케이션은 D3DSWAPEFFECT_DISCARD 스왑 효과를 사용하여 이러한 오버헤드를 방지하고 디스플레이 드라이버가 스왑 체인에 가장 효율적인 프레젠테이션 기술을 선택할 수 있도록 할 수 있습니다. D3DPRESENT_PARAMETERS MultiSampleType 멤버에 대해 D3DMULTISAMPLE_NONE 이외의 값을 지정할 때 사용할 수 있는 유일한 스왑 효과이기도 합니다.

D3DSWAPEFFECT_FLIP 사용하는 스왑 체인과 마찬가지로 D3DSWAPEFFECT_DISCARD 사용하는 스왑 체인에는 둘 이상의 백 버퍼가 포함될 수 있으며, 이 중 하나는 IDirect3DDevice9::GetBackBuffer 또는 IDirect3DSwapChain9::GetBackBuffer를 사용하여 액세스할 수 있습니다. 스왑 체인은 0이 항상 다음 Present 작업에 의해 표시되고 버퍼가 표시될 때 삭제되는 백 버퍼를 인덱싱하는 큐로 가장 잘 상상됩니다.

이 스왑 효과를 사용하는 애플리케이션은 삭제된 백 버퍼의 내용에 대해 어떠한 가정도 할 수 없으므로 이를 표시하는 Present 작업을 호출하기 전에 전체 백 버퍼를 업데이트해야 합니다. 이는 적용되지 않지만 런타임의 디버그 버전은 삭제된 백 버퍼의 내용을 임의 데이터로 덮어쓰어 개발자가 애플리케이션이 전체 백 버퍼 표면을 올바르게 업데이트하고 있는지 확인할 수 있도록 합니다.

D3DSWAPEFFECT_FLIP

스왑 체인은 여러 백 버퍼를 포함할 수 있으며 프런트 버퍼를 포함하는 원형 큐로 가장 잘 상상됩니다. 이 큐 내에서 백 버퍼는 항상 0에서 (n - 1)까지 순차적으로 번호가 매겨집니다. 여기서 n은 백 버퍼의 수이므로 0은 가장 최근에 제시된 버퍼를 나타냅니다. Present가 호출되면 큐가 "회전"되어 전면 버퍼가 백 버퍼(n - 1)가 되고 백 버퍼 0은 새 프런트 버퍼가 됩니다.

D3DSWAPEFFECT_COPY

이 스왑 효과는 단일 백 버퍼로 구성된 스왑 체인에 대해서만 지정할 수 있습니다. 스왑 체인이 창 또는 전체 화면인지에 관계없이 런타임은 복사 기반 Present 작업에 내포된 의미 체계를 보장합니다. 즉, 백 버퍼의 콘텐츠를 대칭 이동 기반 Present 작업으로 대체하지 않고 백 버퍼의 콘텐츠를 변경하지 않습니다.

전체 화면 스왑 체인의 경우 런타임은 숨겨진 백 버퍼에서 필요한 경우 지원되는 대칭 이동 작업과 복사 작업의 조합을 사용하여 Present 작업을 수행합니다. 따라서 프레젠테이션은 디스플레이 어댑터의 세로 리트레이스와 동기화되고 선택한 프레젠테이션 간격에 따라 속도가 제한됩니다. D3DPRESENT_INTERVAL_IMMEDIATE 플래그로 지정된 스왑 체인만 예외입니다. (D3DPRESENT_PARAMETERS 구조체의 PresentationIntervals 멤버에 대한 설명을 참조하세요.) 이 경우 Present 작업은 세로 리트레이스를 기다리지 않고 백 버퍼 콘텐츠를 전면 버퍼에 직접 복사합니다.

D3DSWAPEFFECT_OVERLAY

기본 화면에 오버레이할 수 있는 비디오 메모리의 전용 영역을 사용합니다. 오버레이가 표시되면 복사가 수행되지 않습니다. 오버레이 작업은 기본 표면의 데이터를 수정하지 않고 하드웨어에서 수행됩니다.

Direct3D 9와 Direct3D 9Ex 간의 차이점:

  • D3DSWAPEFFECT_OVERLAY Windows 7(또는 현재 운영 체제 이상)에서 실행되는 Direct3D9Ex에서만 사용할 수 있습니다.

D3DSWAPEFFECT_FLIPEX

애플리케이션이 대칭 이동 모드를 채택할 때 애플리케이션이 창 모드로 표시될 때 컴퍼지션을 위해 DWM(데스크톱 창 관리자)에 복사되는 대신 애플리케이션의 프레임이 전달되는 시간을 지정합니다. 대칭 이동 모드를 사용하면 애플리케이션이 메모리 대역폭을 보다 효율적으로 사용할 수 있으며 애플리케이션이 전체 화면 제공 통계를 활용할 수 있습니다. 대칭 이동 모드는 전체 화면 동작에 영향을 주지 않습니다.

참고

D3DSWAPEFFECT_FLIPEX 사용하여 스왑 체인을 만드는 경우 표시할 새 프레임을 표시할 때 D3DPRESENT_PARAMETERS 구조체의 hDeviceWindow 멤버를 재정의할 수 없습니다. 즉, 프레젠테이션에 D3DPRESENT_PARAMETERS hDeviceWindow 멤버를 사용하도록 런타임에 지시하려면 IDirect3DDevice9Ex::P resentEx의 hDestWindowOverride 매개 변수 NULL을 전달해야 합니다.

Direct3D 9와 Direct3D 9Ex 간의 차이점:

  • D3DSWAPEFFECT_FLIPEX Windows 7(또는 현재 운영 체제 이상)에서 실행되는 Direct3D9Ex에서만 사용할 수 있습니다.

D3DSWAPEFFECT_FORCE_DWORD

이 열거형을 강제로 32비트 크기로 컴파일합니다. 이 값이 없으면 일부 컴파일러에서 이 열거형을 32비트 이외의 크기로 컴파일할 수 있습니다. 이 값은 사용되지 않습니다.

설명

Present를 호출한 후 백 버퍼의 상태는 이러한 각 스왑 효과에 의해 잘 정의되며 Direct3D 디바이스가 전체 화면 스왑 체인 또는 창이 있는 스왑 체인으로 만들어졌는지 여부는 이 상태에 영향을 주지 않습니다. 특히 D3DSWAPEFFECT_FLIP 스왑 효과는 창 또는 전체 화면과 동일하게 작동하며 Direct3D 런타임은 추가 버퍼를 만들어 이를 보장합니다. 따라서 애플리케이션은 가능한 한 D3DSWAPEFFECT_DISCARD 사용하여 이러한 처벌을 피하는 것이 좋습니다. 이 스왑 효과는 항상 메모리 사용량 및 성능 측면에서 가장 효율적이기 때문입니다.

D3DSWAPEFFECT_FLIP 또는 D3DSWAPEFFECT_DISCARD 사용하는 애플리케이션은 전체 화면 대상 알파가 작동할 것으로 예상해서는 안 됩니다. 즉, 이러한 스왑 효과가 있는 전체 화면 스왑 체인은 드라이버의 관점에서 명시적 픽셀 형식이 없으므로 D3DRS_DESTBLEND 렌더링 상태가 예상대로 작동하지 않습니다. 드라이버는 알파 채널이 없는 표시 형식을 사용해야 한다고 유추합니다. 이 작업을 해결하려면 다음 단계를 수행합니다.

  • D3DSWAPEFFECT_COPY 사용합니다.
  • D3DCAPS9 구조체의 Caps3 멤버에서 D3DCAPS3_ALPHA_FULLSCREEN_FLIP_OR_DISCARD 플래그를 확인합니다. 이 플래그는 D3DSWAPEFFECT_FLIP 또는 D3DSWAPEFFECT_DISCARD 사용할 때 드라이버가 알파 혼합을 수행할 수 있는지 여부를 나타냅니다.
  • 대칭 이동 모드 스왑 효과(D3DSWAPEFFECT_FLIPEX)를 사용하는 애플리케이션은 창 크기 조정 또는 지역 변경 후 PresentEx 를 호출하여 표시 콘텐츠가 업데이트되도록 해야 합니다.

보이지 않는 창은 사용자 모드 이벤트를 받을 수 없습니다. 또한 보이지 않는 전체 화면 창은 다른 애플리케이션의 창 모드 창 표시를 방해합니다. 따라서 각 애플리케이션은 스왑 체인이 전체 화면 모드로 표시될 때 디바이스 창이 표시되는지 확인해야 합니다.

요구 사항

요구 사항
헤더
D3D9Types.h

추가 정보

Direct3D 열거형

IDirect3DDevice9::Reset