프레임버퍼

섬네일|썬 TGX 프레임버퍼
프레임버퍼(framebuffer) 또는 프레임스토어(framestore)는 비디오 디스플레이를 구동하는 비트맵이 담겨있는 랜덤 액세스 메모리(RAM)의 한 부분이다. 완전한 비디오 프레임의 모든 화소를 대표하는 데이터를 포함하는 메모리 버퍼이다. 현대의 그래픽 카드들은 자신들의 코어에 프레임버퍼를 포함한다. 인메모리 비트맵을 컴퓨터 모니터에 출력 가능한 비디오 신호로 변환한다.

컴퓨팅에서 스크린 버퍼(screen buffer)는 콘텐츠를 컴퓨터 모니터에 표출하기 위해 컴퓨터의 응용 프로그램이 사용하는 컴퓨터 메모리의 일부이다. 스크린 버퍼는 비디오 버퍼, 리제네레이션 버퍼(regeneration buffer), 리젠 버퍼(regen buffer)로 부른다.

버퍼의 정보는 일반적으로 디스플레이에 표시될 모든 화소의 색상 값으로 구성된다. 색상 값은 일반적으로 1비트 바이너리 (모노크롬), 4비트 팔레트화, 8비트 팔레트화, 16비트 하이컬러 및 24비트 트루 컬러 형식으로 저장된다. 화소 투명도에 대한 정보를 유지하기 위해 추가적인 알파 채널이 때때로 사용된다. 프레임버퍼에 필요한 총 메모리 양은 출력 신호의 해상도와 색 깊이 또는 팔레트 크기에 따라 달라진다.

 역사 
섬네일|1951년 SWAC 윌리엄스관 CRT의 메모리 패턴
컴퓨터 연구자들은 오랫동안 프레임버퍼의 이론적 이점을 논의했지만, 경제적으로 실현 가능한 비용으로 충분한 주기억장치를 가진 기계를 만들 수 없었다. 1947년, 맨체스터 베이비 컴퓨터는 윌리엄스관, 나중에는 윌리엄스-킬번관을 사용하여 브라운관 메모리에 1024비트를 저장하고 두 번째 브라운관에 표시했다. 다른 연구소들도 이러한 기술을 탐구하고 있었으며, MIT 링컨 연구소는 1950년에 4096개 디스플레이를 달성했다.

색상 스캔 디스플레이는 1960년대 후반에 구현되었는데, 브룩헤이븐 래스터 디스플레이(BRAD)라고 불렸으며, 자기 드럼과 텔레비전 모니터를 사용했다. 1969년, 벨 전화 연구소의 A. 마이클 놀은 자기코어 메모리를 사용하여 프레임 버퍼가 있는 스캔 디스플레이를 구현했다. 약 1년 후, 벨 연구소 시스템은 표준 컬러 TV 모니터에 3비트의 색 깊이를 가진 이미지를 표시하도록 확장되었다. 컴퓨터에 사용된 벡터 그래픽스는 TV 디스플레이의 스캔 그래픽스를 위해 변환되어야 했다.

1970년대 초반, MOS 메모리 (metal–oxide–semiconductor 메모리) 집적 회로 칩, 특히 최소 1kb 메모리를 가진 고밀도 DRAM (동적 랜덤 액세스 메모리) 칩의 개발로, 표준 비디오 이미지를 담을 수 있는 프레임버퍼를 가진 디지털 메모리 시스템을 처음으로 만드는 것이 실용화되었다. 이는 1972년 제록스 PARC의 리처드 숍이 SuperPaint 시스템을 개발하는 계기가 되었다. 숍은 슈퍼페인트 프레임버퍼를 사용하여 초기 디지털 비디오 캡처 시스템을 만들 수 있었다. 출력 신호를 입력 신호에 동기화함으로써 숍은 각 화소 데이터를 시프트될 때 덮어쓸 수 있었다. 숍은 또한 컬러 테이블을 사용하여 출력 신호를 수정하는 실험을 했다. 이러한 컬러 테이블을 통해 슈퍼페인트 시스템은 포함된 제한된 8비트 데이터 범위를 넘어선 다양한 색상을 생성할 수 있었다. 이 방식은 나중에 컴퓨터 프레임버퍼에서 일반화되었다.

1974년, 에반스 & 서덜랜드는 최초의 상업용 프레임버퍼인 픽처 시스템을 출시했으며, 비용은 약 15,000달러였다. 이 시스템은 8비트 회색조로 최대 512x512 화소의 해상도를 생성할 수 있었고, 자체 프레임버퍼를 구축할 자원이 없는 그래픽 연구자들에게 큰 도움이 되었다. 뉴욕 공과대학교는 나중에 에반스 & 서덜랜드의 프레임버퍼 3개를 사용하여 최초의 24비트 컬러 시스템을 만들었다. 각 프레임버퍼는 RGB 컬러 출력(빨강, 초록, 파랑 각 하나씩)에 연결되었고, 디지털 이큅먼트 코퍼레이션의 PDP 11/04 미니컴퓨터가 세 장치를 하나로 제어했다.

1975년, 영국 회사 퀀텔은 최초의 상업용 풀 컬러 방송 프레임버퍼인 퀀텔 DFS 3000을 생산했다. 이 시스템은 1976 몬트리올 올림픽 TV 중계에서 처음 사용되었는데, 경기장에 들어서는 주자의 모습과 함께 올림픽 성화의 픽처 인 픽처 삽입 영상을 생성하는 데 사용되었다.

집적 회로 기술의 급속한 발전으로 1970년대 후반의 많은 가정용 컴퓨터가 낮은 색 깊이의 프레임버퍼를 포함할 수 있게 되었다. 오늘날 그래픽 기능이 있는 거의 모든 컴퓨터는 비디오 신호를 생성하는 데 프레임버퍼를 활용한다. 1980년대에 개발된 아미가 컴퓨터는 그래픽 성능에 특별한 디자인적 관심을 기울였으며, 4096가지 색상을 표시할 수 있는 독특한 Hold-And-Modify 프레임버퍼를 포함했다.

프레임버퍼는 1980년대 내내 고급 워크스테이션과 아케이드 시스템에서도 인기를 얻었다. SGI, 썬 마이크로시스템즈, HP, DEC, IBM은 모두 이 시기에 워크스테이션 컴퓨터용 프레임버퍼를 출시했다. 이 프레임버퍼는 대부분의 가정용 컴퓨터에서 볼 수 있는 것보다 훨씬 높은 품질이었으며, 텔레비전, 인쇄, 컴퓨터 모델링 및 3D 그래픽스에 정기적으로 사용되었다. 프레임버퍼는 세가의 고급 아케이드 보드에도 사용되었으며, 이 역시 가정용 컴퓨터보다 높은 품질이었다.

 디스플레이 모드 
섬네일|선 cgsix 프레임버퍼
개인 및 가정용 컴퓨터에 사용되는 프레임버퍼는 종종 프레임버퍼가 작동할 수 있는 정의된 모드 세트를 가지고 있었다. 이 모드들은 하드웨어를 재구성하여 다른 해상도, 색 깊이, 메모리 레이아웃 및 화면 재생 빈도 타이밍을 출력한다.

유닉스 기계 및 운영 체제의 세계에서는 이러한 편의성이 종종 외면되었고, 대신 하드웨어 설정을 직접 조작하는 것을 선호했다. 이 조작은 훨씬 유연하여 프레임버퍼에 사용 가능한 메모리에 의해서만 제한되는 모든 해상도, 색 깊이 및 화면 재생 빈도를 달성할 수 있었다.

이 방법의 불행한 부작용은 디스플레이 장치가 그 기능을 넘어 구동될 수 있다는 것이었다. 어떤 경우에는 이로 인해 디스플레이에 하드웨어 손상이 발생하기도 했다. 더 일반적으로는 단순히 손상되고 사용할 수 없는 출력을 생성했다. 현대 CRT 모니터는 보호 회로의 도입을 통해 이 문제를 해결한다. 디스플레이 모드가 변경되면 모니터는 새로운 화면 재생 빈도에 대한 신호 잠금을 시도한다. 모니터가 신호 잠금을 얻을 수 없거나 신호가 설계 한계 범위를 벗어나면, 모니터는 프레임버퍼 신호를 무시하고 사용자에게 오류 메시지를 표시할 수 있다.

LCD 모니터는 비슷한 보호 회로를 포함하는 경향이 있지만, 다른 이유 때문이다. LCD는 디스플레이 신호를 디지털 방식으로 샘플링해야 하므로(전자빔을 에뮬레이션함), 범위를 벗어난 신호는 모니터에 물리적으로 표시될 수 없다.

 컬러 팔레트 
프레임버퍼는 전통적으로 다양한 색상 모드를 지원해 왔다. 메모리 비용 때문에 대부분의 초기 프레임버퍼는 1비트(화소당 2색), 2비트(4색), 4비트(16색) 또는 8비트(256색)의 색 깊이를 사용했다. 이러한 작은 색 깊이의 문제점은 전체 범위의 색상을 생성할 수 없다는 것이다. 이 문제에 대한 해결책은 인덱스 컬러였는데, 이는 프레임버퍼에 순람표를 추가한다. 프레임버퍼 메모리에 저장된 각 색상은 색상 인덱스로 작동한다. 순람표는 제한된 수의 다른 색상을 가진 팔레트 역할을 하며, 나머지는 인덱스 테이블로 사용된다.

다음은 일반적인 256색 인덱스 이미지와 그 팔레트(색상 견본 직사각형으로 표시됨)이다.

일부 디자인에서는 순람표에 데이터를 실시간으로 쓰거나(또는 기존 팔레트 간에 전환) 그림을 자체 팔레트를 가진 수평 막대로 분할하여 훨씬 더 넓은 팔레트를 가진 이미지를 렌더링할 수도 있었다. 예를 들어, 야외 촬영 사진을 볼 때, 그림은 네 개의 막대로 분할될 수 있었다: 상단은 하늘색조에 중점을 두고, 다음은 잎색조, 다음은 피부색조와 옷색조, 그리고 하단은 땅색조. 이는 각 팔레트가 겹치는 색상을 가져야 했지만, 신중하게 수행하면 뛰어난 유연성을 제공했다.

 메모리 접근 
프레임버퍼는 일반적으로 CPU 메모리 공간에 직접 메모리 매핑을 통해 접근되지만, 이것이 접근할 수 있는 유일한 방법은 아니다. 프레임버퍼는 메모리에 접근하는 방법에 있어 매우 다양했다. 가장 일반적인 방법 중 일부는 다음과 같다.
 전체 프레임버퍼를 주어진 메모리 범위에 매핑.
 각 화소, 화소 범위 또는 팔레트 항목을 설정하는 포트 명령.
 프레임버퍼 메모리보다 작은 메모리 범위를 매핑한 후, 필요에 따라 뱅크 전환.

프레임버퍼 조직은 팩드 픽셀 또는 평면일 수 있다. 프레임버퍼는 모든 지점에 주소 지정이 가능하거나 업데이트 방식에 제한이 있을 수 있다.

 비디오 카드에 탑재된 RAM 

비디오 카드에는 항상 일정량의 RAM이 있다. 이 RAM의 작은 부분은 이미지 데이터의 비트맵이 디스플레이를 위해 "버퍼링"되는 곳이다. 따라서 프레임 버퍼라는 용어는 이 RAM을 지칭할 때 종종 상호 교환적으로 사용된다.

CPU는 이미지 업데이트를 비디오 카드로 보낸다. 카드에 있는 비디오 프로세서는 화면 이미지의 그림을 형성하여 RAM의 프레임 버퍼에 큰 비트맵으로 저장한다. RAM의 비트맵은 카드에 의해 화면 이미지를 지속적으로 새로 고치는 데 사용된다.

 가상 프레임버퍼 
많은 시스템은 종종 호환성을 위해 프레임버퍼 장치의 기능을 에뮬레이트하려고 시도한다. 가장 일반적인 두 가지 가상 프레임버퍼는 리눅스 프레임버퍼 장치(fbdev)와 X 가상 프레임버퍼(Xvfb)이다. Xvfb는 그래픽 프레임버퍼 없이 X를 실행하는 방법을 제공하기 위해 X 윈도 시스템 배포판에 추가되었다. 리눅스 프레임버퍼 장치는 기본 프레임버퍼에 접근하는 물리적 방법을 프로그램이 쉽게 접근할 수 있는 보장된 메모리 맵으로 추상화하기 위해 개발되었다. 이는 프로그램이 분리된 메모리 맵을 가지거나 뱅크 전환을 요구하는 시스템을 처리할 필요가 없으므로 이식성을 높인다.

 페이지 플리핑 
프레임 버퍼는 두 프레임 분량의 비디오 데이터를 저장할 수 있을 만큼 충분한 메모리로 설계될 수 있다. 일반적으로 더블 버퍼링 또는 더 구체적으로 페이지 플리핑이라고 알려진 기술에서 프레임 버퍼는 메모리의 절반을 현재 프레임을 표시하는 데 사용한다. 이 메모리가 표시되는 동안, 나머지 절반의 메모리는 다음 프레임을 위한 데이터로 채워진다. 보조 버퍼가 채워지면, 프레임 버퍼는 대신 보조 버퍼를 표시하도록 지시받는다. 기본 버퍼는 보조 버퍼가 되고, 보조 버퍼는 기본 버퍼가 된다. 이 전환은 종종 수직 귀선 기간 이후에 수행되어 오래된 프레임의 절반과 새로운 프레임의 절반이 함께 표시되는 스크린 테어링을 피한다.

페이지 플리핑은 PC 게임 프로그래머들이 사용하는 표준 기술이 되었다.

 그래픽 가속기 

더 나은 그래픽에 대한 수요가 증가함에 따라, 하드웨어 제조업체들은 프레임버퍼를 채우는 데 필요한 CPU 시간을 줄이는 방법을 만들었다. 이를 일반적으로 그래픽 가속이라고 부른다. 일반적인 그래픽 그리기 명령(많은 것이 기하학적)은 원시 형태로 그래픽 가속기로 전송된다. 가속기는 그런 다음 명령의 결과를 프레임버퍼에 래스터라이즈한다. 이 방법은 CPU가 다른 작업을 수행할 수 있도록 해준다.

초기 가속기는 2D GUI 시스템의 성능 향상에 중점을 두었다. 이러한 2D 기능을 유지하면서도, 대부분의 현대 가속기는 실시간으로 3D 이미지를 생성하는 데 중점을 둔다. 일반적인 설계는 OpenGL 또는 Direct3D와 같은 그래픽스 라이브러리를 사용하여 그래픽 드라이버와 인터페이스하여 수신된 명령을 가속기의 그래픽 처리 장치(GPU)를 위한 명령으로 변환한다. GPU는 해당 명령을 사용하여 래스터라이즈된 결과를 계산하고 결과는 프레임버퍼로 비트 블릿된다. 그런 다음 프레임버퍼의 신호는 내장 비디오 오버레이 장치(일반적으로 프레임버퍼의 데이터를 수정하지 않고 마우스 커서를 생성하는 데 사용됨) 및 출력 신호를 수정하여 생성되는 최종 특수 효과와 결합하여 생성된다. 이러한 최종 특수 효과의 예는 3dfx 부두 카드에서 사용된 공간 위신호 제거 기술이었다. 이 카드들은 래스터라이즈된 그래픽스의 계단 현상을 훨씬 덜 명확하게 만드는 약간의 흐림 효과를 출력 신호에 추가한다.

한때 3dfx 인터랙티브, ATI, 허큘리스, 트라이던트, 엔비디아, 라디우스, S3 그래픽스, SiS 및 실리콘 그래픽스를 포함하여 많은 그래픽 가속기 제조업체가 있었다. 2015년 기준으로, x86 기반 시스템용 그래픽 가속기 시장은 엔비디아(2002년 3dfx 인수), AMD(2006년 ATI 인수), 그리고 인텔이 지배하고 있다.

 비교 
프레임버퍼를 사용하면, (디스플레이 기술이 전자빔을 사용하는 경우) 전자빔은 래스터 스캔을 수행하도록 명령받는데, 이는 텔레비전이 방송 신호를 렌더링하는 방식과 같다. 화면에 표시되는 각 점의 색상 정보는 스캔 중에 프레임버퍼에서 직접 가져와 일련의 개별 화상 요소, 즉 화소를 생성한다.

프레임버퍼는 래스터 그래픽스(그리고 결과적으로 프레임버퍼의 개념)가 등장하기 전에는 흔했던 벡터 디스플레이와는 크게 다르다. 벡터 디스플레이에서는 그래픽스 기본 요소의 꼭짓점만 저장된다. 출력 디스플레이의 전자빔은 그런 다음 꼭짓점에서 꼭짓점으로 이동하여 이 점들 사이의 영역을 가로질러 선을 그리는 명령을 받는다.

마찬가지로, 프레임버퍼는 초기의 텍스트 모드 디스플레이에 사용된 기술과 다르다. 텍스트 모드 디스플레이에서는 버퍼가 개별 화소가 아니라 문자에 대한 코드를 보유한다. 비디오 디스플레이 장치는 프레임버퍼와 동일한 래스터 스캔을 수행하지만, 빔을 지시하면서 버퍼에 있는 각 문자의 화소를 생성한다.

 같이 보기 
 타일 렌더링
 각주 

 외부 링크 
 Interview with NYIT researcher discussing the 24-bit system
 History of Sun Microsystems' Framebuffers

분류:컴퓨터 그래픽스
분류:컴퓨터 메모리
분류:영상 처리
분류:사용자 인터페이스