2012-12-16 3 views
3

리눅스 프레임 버퍼에서 작동하는 C로 게임을 만들고 있습니다. 지금까지 포인터와 마찬가지로 마우스와 함께 움직이는 빨간색 100x100 사각형이 있습니다. 이중 버퍼링을 구현했으며 제대로 작동합니다 (사각형이 깜박임). 문제는 수평 적으로 찢어지고 있다는 것입니다. 제가 의미하는 바는, 사각형이 x 축에서 움직일 때, 그것은 수평으로 나뉘는 것과 같습니다. 그리고 그것의 한 부분은 다른 것보다 더 많이 슬쩍 움직입니다. 이 "찢음"은 내가 계속 움직이면 광장에서 위에서 아래로 천천히 전파됩니다.리눅스 프레임 버퍼 그래픽 및 VSync

하드웨어가 기본 버퍼에 이중 버퍼를 복사하는 순간 프레임 버퍼를 읽으므로 발생한다고 생각합니다.

나는 FBIO_WAITFORVSYNC ioctl과 문제를 해결하려했지만 성공하지 못했습니다.

프레임 버퍼에서 VSync를 어떻게 수행 할 수 있습니까? 설명에 세부 사항을 추가하십시오. Linux 기반 OS에서 이런 것들을 프로그래밍 할 때 처음이므로 자세한 내용을 이해하지 못할 수도 있습니다. http://pastebin.com/KJ4iaVEL

+0

어떤 비디오 하드웨어를 사용하십니까? 예를 들어 Linux는 Sandy Bridge Intel 그래픽에 문제를 일으키고 있습니다. 명확히하십시오. – Toropisco

+0

@vorbote Nvidia 7800 GTX가 있습니다. 언급하지 않으셔서 죄송합니다. 정상적인 사용에는 찢어짐이 없습니다 (예를 들어, X에서 윈도우를 이동할 때). –

답변

4

이 이중 버퍼링을 할 수있는 올바른 방법이되지 않습니다 :

여기 내 코드입니다. 여러분은 백 버퍼에서 모든 페인팅을 수행하는 것이 옳지 만, 데이터를 앞쪽으로 전송하려면 memcpy를 수행하십시오. 복사하는 동안 화면 새로 고침이 쉽게 발생할 수 있습니다.

올바르게하려면 정확히 에 데이터 포인터을 입력해야합니다. 데이터 자체를 복사하지 마십시오. Linux 프레임 버퍼 장치의 경우 물리적 화면의 두 배인 "가상"화면을 사용하고 오프셋 변수를 사용하여 맨 위 또는 아래 반쪽을 표시할지 여부를 설정합니다. FBIOGET_VSCREENINFO, FBIOPUT_VSCREENINFOFBIOPAN_DISPLAYioctl 호출을 사용하여 크기와 오프셋을 쿼리 할 수 ​​있습니다.

이 페이지는 간단히이에 대한 몇 가지 세부 사항을 제공합니다 http://www.ummon.eu/Linux/API/Devices/framebuffer.html

모든 관련 데이터 구조는 linux/fb.h 헤더 파일에 있습니다.

관련 문제