공부/Graphics, DirectX, 포트폴리오 구조

DirectX의 더블 버퍼링

sudo 2021. 12. 7. 09:59

WinAPI에서도 화면에 게임의 장면을 그려내기 위해서 매 프레임마다 화면에 출력을 해줄때 화면이 깜빡거리는 현상이 있었다. 그때는 BitBlt를 이용해서 따로 만들어둔 버퍼에 게임 장면을 다 그리고 화면으로 매 프레임마다 고속 복사 해주는 방식으로 해결했다. DirectX에서는 다르지만 조금 더 효율적인 방법인 '더블 버퍼링(Double Buffering)'이라는 기법으로 깜빡거리는 현상을 해결한다.

 

https://lipcoder.tistory.com/entry/DirectX-12-Swap-Chain%EA%B5%90%ED%99%98-%EC%82%AC%EC%8A%AC%EA%B3%BC-%EB%8D%94%EB%B8%94-%EB%B2%84%ED%8D%BC%EB%A7%81

 위의 사진에서 볼 수 있듯이, 전면버퍼(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://lipcoder.tistory.com/entry/DirectX-12-Swap-Chain%EA%B5%90%ED%99%98-%EC%82%AC%EC%8A%AC%EA%B3%BC-%EB%8D%94%EB%B8%94-%EB%B2%84%ED%8D%BC%EB%A7%81

 

[DirectX 12] 기본지식 - Swap Chain(교환 사슬)과 더블 버퍼링

예를 들어 모니터에 하나의 프레임 버퍼를 가지고 게임 세상을 표현한다고 생각해보자. 매 프레임마다 버퍼를 지우고 그리거나 이미 그려진 버퍼에 덮어 쓰게 될것이다. 전자 같은 경우에는 지

lipcoder.tistory.com

https://docs.microsoft.com/en-us/windows/win32/api/dxgi/ne-dxgi-dxgi_swap_effect

 

DXGI_SWAP_EFFECT (dxgi.h) - Win32 apps

Options for handling pixels in a display surface after calling IDXGISwapChain1::Present1.

docs.microsoft.com