api 더블버퍼링 예제

이것이 바로 이중 버퍼링의 작동 방식이며, 이 프로세스는 지금까지 본 거의 모든 게임의 렌더링 시스템의 기초가 됩니다. 단일 프레임 버퍼 대신 두 개의 프레임 버퍼가 있습니다. 그 중 하나는 현재 프레임을 나타내며, 우리의 비유에서 단계 A를 나타냅니다. 비디오 하드웨어가 읽는 것입니다. GPU는 원할 때마다 원하는 만큼 스캔할 수 있습니다. 이중 버퍼링은 주로 응용 프로그램이 아마추어처럼 보이게 하거나, 부진하거나, 깜박이는 것처럼 보일 수 있는 보이는 무승부를 제거하는 데 사용됩니다. 페이지 뒤집기는 주로 찢어짐을 제거하는 데 사용되며, 화면에 그릴 때 모니터의 새로 고침 빈도보다 빠르게 발생하는 분할 효과도 제거됩니다. 더 매끄러운 드로잉은 더 나은 인식 성능과 훨씬 더 나은 사용자 경험을 의미합니다. 가능한 가장 간단한 예제에서 레시피를 살펴보겠습니다(목록 3.1 참조).

이 경우 그림 3.1과 같이 화면에 사각형을 그리는 것이 목표입니다. 그러나 이 같은 레시피를 보다 복잡한 응용 프로그램에 적용할 수 있습니다. 이 레시피를 수정하면 Java 2D로 수행하려는 대부분의 프로젝트를 실현할 수 있습니다. 다음 예제의 대부분은 단순히 필요한 기능을 추가 하는 paint() 메서드를 수정 합니다. 3,66MB가 현대 1920×1080@32bpp LCD 디스플레이에서 실행되는 트리플 버퍼링을 구현하는 비디오 재생 프로그램을 상상한다면 3 버퍼를 저장하는 총 비디오 메모리 양은 24,47MB입니다. 다행히 디스플레이 해상도가 증가함에 따라 메모리도 증가하므로 최신 컴퓨터에서 25MB의 메모리를 사용하여 비디오를 재생할 수 있습니다. 이중 버퍼링을 `수동으로` 구현할 필요가 없습니다. 기어리 씨는 그의 책 « HTML5 캔버스 »에서 이것에 대해 썼습니다.

거의 모든 OS 개발자가 이것을 사용하는 방법을 알고 있기 때문에 콘솔 비디오 메모리를 예로 들었지만 실제로 쓸모없고 메모리를 낭비하기 때문에 콘솔 디스플레이에서 이중 버퍼링을 사용하지 않는 것이 좋습니다 (어떤 종류의 게임을 사용하지 않는 한). OS용 루프)를 참조하십시오. 이중 버퍼링은 사용자 고유의 GUI를 빌드할 때 매우 유용할 수 있습니다. 콘솔 디스플레이에서는 아티팩트에 문제가 없으므로 일반적으로 이중 버퍼링이 필요하지 않습니다. 이것이 우리가 이 패턴이 필요한 이유입니다. 우리의 프로그램은 한 번에 하나씩 픽셀을 렌더링하지만, 우리는 한 번에 모두 볼 수있는 디스플레이 드라이버가 필요합니다 – 한 프레임에서 얼굴이 없는, 그리고 다음 프레임에. 이중 버퍼링은 이 문제를 해결합니다. 나는 비유로 방법을 설명 할 것이다.

렌더링이 여러 setTimeout/setInterval/requestAnimationFrame 호출에 걸쳐 있는 상황을 설정하는 경우, 한 번의 호출에서 캔버스를 지우고 다음 여러 호출에서 캔버스에 요소를 그려 주기(예: 5회 호출마다 반복)를 반복하는 경우 각 통화 후 캔버스가 업데이트되기 때문에 깜박임을 볼 수 있습니다. 따라야 할 일반적인 규칙은 구성요소의 페인트() 메서드에서 구성요소에 대한 모든 그리기를 수행해야 하는 강력한 이유가 없는 한 다음과 같습니다. 목록 3.1의 기본 레시피 예제에서 그리려는 구성 요소 개체는 myCustomCanvas 클래스(캔버스 확장)의 인스턴스입니다. 이것이 그래픽 예제의 작동 방식이며 이중 버퍼링 그래픽을 위한 가장 일반적인 솔루션입니다. 버퍼는 항상 비디오 메모리와 동일한 크기를 가질 필요는 없으며, 이중 버퍼링을 수행하는 다른 방법도 있습니다.