2013-08-04 2 views
4

우리 회사의 일부 리눅스 기반 임베디드 디바이스에 Qt 4.8.5를 사용하려고합니다. 나는 X 서버없이 임베디드 Qt를 사용합니다. 측정 된 데이터를 플롯하고 매우 자주 업데이트해야합니다 (20-30fps이지만 위젯의 일부분 만). 이 시스템은 ARM 기반, 400Mhz이며 GPU가없고 FPU도 없습니다. QWidget을 서브 클래 싱하고 paintEvent()를 재정의했습니다. WA_OpaquePaintEvent 및 WA_StaticContents를 설정했습니다. 테스트를 위해 필자의 paint 이벤트는 비어 있으며 위젯 폼의 update() 함수를 타이머를 50ms로 설정한다. 내 문제는 빈 업데이트가 CPU의 30 %를 차지한다는 것입니다. 금액은 업데이트 영역에 따라 다르므로 QT는 백그라운드에서 무언가를 다시 그릴 수 있습니다. 많은 게시물을 읽었지만 내 문제에 대한 해결책을 찾을 수 없습니다. 업데이트 호출을 주석 처리하면 CPU 사용량이 ~ 1 %로 떨어집니다 (심지어 비어있는 함수 호출보다 훨씬 복잡한 위젯 테스트 타이머에서 사인을 생성하더라도). 내 위젯은 사각형이며 투명하지 않으며 페인트 이벤트에서 전체 드로잉 절차를 처리하려고합니다.Qt 커스텀 위젯 업데이트 큰 오버 헤드

이 오버 헤드를 줄이고 전체 페인팅 프로세스를 직접 처리 할 수 ​​있습니까?

+0

작은 부분 만 업데이트하려면 업데이트 (QRect) 또는 업데이트 (QRegion)를 통해 업데이트 된 영역을 제한하려고 시도 했습니까? –

+0

예, 시도했습니다. 그렇게하면 영역 크기를 재사용 할 때 CPU 사용량이 떨어집니다. 그러나 예를 들어 업데이트되지 않은 15 개의 변경되지 않은 픽셀로 구분 된 2 개의 5 픽셀 영역보다 25 픽셀 넓이의 영역을 업데이트하는 것이 더 저렴합니다. 디버깅을 위해 필자는 페인터를 사용하지 않도록 설정했으며 paintEvent는 빈 함수입니다. 내 문제는 paintEvent 함수에서 아무 것도하지 않으면 CPU를 전혀 사용하지 않는 이유는 무엇입니까? (나는 그것이 스케줄링되고 호출되어야한다는 것을 알고 있지만 최소한의 오버 헤드 여야하며 업데이트 된 영역에 비례하지 않아야한다). – xdever

+0

이전 내용이 지워 지므로 명시 적으로 페인트하지 않으면 위젯이 업데이트됩니다. –

답변

1

은 "빈 업데이트는"비어 있지 않은 - 그것은 전체 창 :

당신이 아래 읽게을 다시 그립니다?

실시간 플롯 그리기 또는 그래프 위젯과 같은 간단한 배경색으로 사용자 정의 위젯을 빠르게 업데이트하려면 (QBackgroundRole()을 QPalette :: Window 역할과 함께 사용하여) 적합한 배경색을 정의하고 autoFillBackground 속성을 사용하고 위젯의 paintEvent()에 필요한 그리기 기능 만 구현합니다. 또한 QWidget::scroll()를 사용한다

는 내부적 이후 윈도우의 백업 저장소를 이동하지, 그것은 훨씬 더 효율적 만 작은 조각이 추가되면 전체 일을 다시 그리기보다는이다.