WinAPI에서도 화면에 게임의 장면을 그려내기 위해서 매 프레임마다 화면에 출력을 해줄때 화면이 깜빡거리는 현상이 있었다. 그때는 BitBlt를 이용해서 따로 만들어둔 버퍼에 게임 장면을 다 그리고 화면으로 매 프레임마다 고속 복사 해주는 방식으로 해결했다. DirectX에서는 다르지만 조금 더 효율적인 방법인 '더블 버퍼링(Double Buffering)'이라는 기법으로 깜빡거리는 현상을 해결한다.
위의 사진에서 볼 수 있듯이, 전면버퍼(Front Buffer)와 후면버퍼(Back Buffer) 두개의 버퍼를 둔다. 전면버퍼를 화면에 출력되는 버퍼이고 후면 버퍼는 다음 프레임에 출력될 장면을 그려주는 버퍼이다. 후면버퍼에 다음 프레임 장면을 그려주고 그 장면을 출력할 차례가 되면 후면버퍼였던 버퍼가 전면버퍼, 전면버퍼였던 버퍼가 후면버퍼가 될수 있도록 역할을 바꾼다. 이 동작을 페이지 플리핑(Page Fliping) 기법이라고 한다. 단지 후면버퍼, 전면버퍼가 둘중 무엇이 될지 포인터만 바꿔주면 되므로 고속 복사하던 WinAPI때보다 훨씬 효율적이다.DX에선 IDXGISwapChain타입인 SwapChain의 Present함수에 구현되어 있다.
DXGI_SWAP_CHAIN_DESC타입의 Swap Description을 채워줄 때 SwapEffect라는 멤버를 채워주는데 이때 어떤 옵션을 쓰는지에 따라 페이지 플리핑을 하고 백버퍼 내용을 지울지 말지, bit-blt transfer 모델을 쓸지, flip presentation 모델을 쓸지 정할 수 있다. MSDN을 참고하면 해당 내용을(https://docs.microsoft.com/en-us/windows/win32/api/dxgi/ne-dxgi-dxgi_swap_effect)을 확인할 수 있다.
Reference:
https://docs.microsoft.com/en-us/windows/win32/api/dxgi/ne-dxgi-dxgi_swap_effect
'공부 > Graphics, DirectX, 포트폴리오 구조' 카테고리의 다른 글
Texture, Render Target 그리고 Surface란? (2) | 2022.01.11 |
---|---|
[포트폴리오 구조] AlphaBlend 적용 방법 (0) | 2021.12.22 |
[포트폴리오 구조] ResourceManager, SceneResource 그리고 각종 Manager들의 관계 (0) | 2021.12.17 |
안티 앨리어싱(Anti-Aliasing), 멀티 샘플링(Multi-Sampling), 알파 포괄도 변환(Alpha-To-Coverage) (0) | 2021.12.03 |
DirectX 용어 정리 (0) | 2021.11.27 |