2010-11-18 3 views
6

내가 (AN OpenGLwidget 단위) QPainter가에서 초당 60 프레임의 비디오QPainter를 성능이 높은 프레임 속도

가끔 도면이 너무 길고 QPainter를가있는 동안 다음 다시 그리기 이벤트가 발생 걸리는 문제를 겪고을 보여주기 위해 노력하고 있어요 사용 - 경고 및 임의의 충돌이 발생합니다.

몇 가지 질문 : 아마도 QPainter를이 사용중인 알고 있기 때문에
칠 호출과 효과적으로 연동에 'Qt는 방법', 거기에 - 또는 난 그냥 내 플랫폼 뮤텍스 지원을 사용합니까?

repaint()를 호출하는 타이머보다 높은 프레임 속도 (물론 VSync에 고정되어야 함)를 그리는 더 좋은 방법이 있습니까?

+0

정확히 타이머가 작동 할 때 사용자가 호출하는 명령은 무엇입니까? 또는 직접 전화하지 않으면 60fps를 어떻게 적용합니까? –

+0

repaint(), paintEvent()를 오버로드하여 이미지 데이터를 가져오고 렌더링 된 QImage에 내용을 채 웁니다. –

+0

별도의 스레드에서 QImages를 생성 할 수 있으므로 페인팅 스레드가 각 paintEvent에 더 적은 시간이 필요합니다. – smerlin

답변

2

repaint() 대신 update()을 사용해보십시오.

이 함수는 즉시 다시 그리기를 발생시키지 않습니다. 대신 은 Qt가 메인 이벤트 루프로 돌아갈 때 처리를위한 페인트 이벤트를 예약합니다. 이렇게하면 Qt는 에 대해 repaint() 호출보다 속도와 깜박 거림을 최적화 할 수 있습니다.

update()를 여러 번 호출하면 은 보통 paintEvent() 호출로 끝납니다.

+0

페인트 이벤트가 가능한 한 빨리 발생해야합니다 (이상적으로는 다음 VSync에서 이벤트가 필요합니다 - Qt5에 있음) - 1/60 초마다 하나의 프레임을 그려야합니다. 업데이트 할 위젯이 많을 때 Update()가 더 적합합니다. –

+1

업데이트 속도가 느리지 만 깜박임과 불필요한 호출을 피하기 위해 다시 그리기 호출을 버퍼링합니다. 시도 해봐. 하지만 정말 느린 경우 QPainter 대신 QtOpenGl을 사용하는 것이 더 좋을까요? 아니면 Phonon일까요? 동영상의 출처는 무엇입니까? btw? –

+0

QGLWidget을 사용하여 렌더링하고 있는데, QPainter :: drawImage()를 호출하는 것 같습니다. 이것은 OGL2로 가속화 된 것으로 추정됩니다. 비디오는 궁극적으로 카메라에서 나온 것이지만 각 QImage에서 일부 처리를해야합니다. –

관련 문제