우리 회사의 일부 리눅스 기반 임베디드 디바이스에 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 커스텀 위젯 업데이트 큰 오버 헤드
이 오버 헤드를 줄이고 전체 페인팅 프로세스를 직접 처리 할 수 있습니까?
작은 부분 만 업데이트하려면 업데이트 (QRect) 또는 업데이트 (QRegion)를 통해 업데이트 된 영역을 제한하려고 시도 했습니까? –
예, 시도했습니다. 그렇게하면 영역 크기를 재사용 할 때 CPU 사용량이 떨어집니다. 그러나 예를 들어 업데이트되지 않은 15 개의 변경되지 않은 픽셀로 구분 된 2 개의 5 픽셀 영역보다 25 픽셀 넓이의 영역을 업데이트하는 것이 더 저렴합니다. 디버깅을 위해 필자는 페인터를 사용하지 않도록 설정했으며 paintEvent는 빈 함수입니다. 내 문제는 paintEvent 함수에서 아무 것도하지 않으면 CPU를 전혀 사용하지 않는 이유는 무엇입니까? (나는 그것이 스케줄링되고 호출되어야한다는 것을 알고 있지만 최소한의 오버 헤드 여야하며 업데이트 된 영역에 비례하지 않아야한다). – xdever
이전 내용이 지워 지므로 명시 적으로 페인트하지 않으면 위젯이 업데이트됩니다. –