티스토리 뷰

버퍼 1개를 놓고 지웠다 그렸다 지웠다 그렸다 지웠다 그렸다 -> Flickering(깜박이는 현상) 발생!

 따라서, 대부분의 게임, 혹은 실시간3차원 그래픽은 부드런 애니메이션위해  2개 이상의 화면 (buffer) 사용

 

우리가 내리는 모든 렌더 명령에 따라 대부분 후면 버퍼에 그린 후

특정한 명령을 내려 후면 버퍼를 보이는 화면인 전면버퍼로 전송하는 방식

 

이러한 2개 이상의 화면(또는 표면, 버퍼) 을 하나의컬렉션으로 관리하고

이를 스왑체인이라 부른다. 

cf) 스왑체인은 IDirect3DSwapChain9 인터페이스를 통해 이용가능, but 우리는 IDirect3DDevice9 객체를 이용해 그림을 그리고 버퍼교환 명령만 해주면 Direct3D 가 알아서 관리해준다. 따라서 우리가 해당 인터페이스 이용하는 경우 거의 없음

전면버퍼 슬롯의 표면 : 현재 모니터에 디스플레이 되는 이미지와 대응된다.  모니터에 이미지가 대응되는 시간은 재생율에 따라 다르다.

모니터의 디스플레이능력보다 (FPS) 프로그램의 프레임렌더링이 더욱 빠를 경우

현재 프레임도 출력하지 못했는데 다음플레임으로 갱신되는것,

전면버퍼 출력 마칠 때까지 렌더링 멈추는것

둘다 좋은 방법이 아님

=> 후면버퍼에 그린 후 전면버퍼 표면의 디스플레이 완료 시 스왑체인의 끝으로 돌아가 후면버퍼를 전면버퍼로 전환

 =>> 이것을 시연 이라고 부른다. (Presenting )

IDirect3DDevice9 => Present();

 

D3DPRESENT_PARAMETERS

SwapEffect 의 인자

D3DSWAPEFFECT_FLIP    

 백버퍼에 최종 그림을 그리고 현재 전면 버퍼와 교체하는 방식, 백버퍼가 여러개일 경우, 돌가면서 전면버퍼가 된다.

이전 그림(백버퍼) 에 대한 보존설정이 기본적으로 들어가 있기 때문에 페이지 플리핑이 일어날 때 복사 작업이 일어난다.

D3DSWAPEFFECT_COPY

 백버퍼 고정, 전면버퍼에 최종 그려진 그림 복사해주는 방식

D3DSWAPEFFECT_DISCARD

 백버퍼 고정이 되지 않아도 됨을 알림.

 페이지 플리핑이 일어나서 현재 전면 버퍼가 백버퍼로 바뀔 때 현재 그림을 복사받지 않음

 

이전 프레임의 그림이 필요하지 않는 한 D3DSWAPEFFECT_DISCARD

 

 

DirectX9를 이용한 게임프로그래밍 책 참고

https://m.blog.naver.com/PostView.nhn?blogId=ruo1022&logNo=110183002003&proxyReferer=http%3A%2F%2Fwww.google.co.kr%2Furl%3Fsa%3Dt%26rct%3Dj%26q%3D%26esrc%3Ds%26source%3Dweb%26cd%3D1%26ved%3D0ahUKEwiIyfztxsTUAhXKgLwKHYtHBrQQFgghMAA%26url%3Dhttp%253A%252F%252Fm.blog.naver.com%252Fruo1022%252F110183002003%26usg%3DAFQjCNG3uNybOoCnDIO27IPPG33I7MMVkQ%26sig2%3D2F1klbHhQ5DuL-vQWDB23A

댓글