2016-12-05 5 views
3

wxWidget이 qt보다 빠른 나의 특별한 필요를위한 것인지 궁금합니다.네이티브 함수 지원 때문에 wxWidgets가 qt보다 파형을 그릴 때 더 좋습니다?

간단한 것. Audacity만큼 빠른 파형을 그려보고 싶습니다. 나는 Audacity와 같은 접근법을 시도했지만 Audacity와 가까운 성능을 보여 주었지만 여전히 Audacity만큼 빠르지는 않습니다.

제 생각에 비트 맵 드로잉에 Qt가 성능/피드백으로 최적이 아닙니다. 대담 문서에서 :

화면 업데이트는 직접 도면 및 간접 페인트 이벤트의 혼합물을 사용합니다. 그래픽 디스플레이를 업데이트하는 "정상적인"방법은 무언가가 화면을 무효화 할 때 Refresh() 메소드를 호출하는 것입니다. 나중에 시스템은 OnPaint()를 호출합니다.이 응용 프로그램은 화면을 다시 그리기 위해 재정의합니다. wxWidgets에서 Refresh()를 호출하고 OnPaint()가 호출 될 때까지 기다리지 않고도 화면에 직접 그릴 수 있습니다.

이렇게하면 Qt에서 wxwidget으로 "더 직접적인"그림을 그리는 것이 가능합니다. 그렇게한다면 정말 빠릅니까?

UPDATE (필자는 framebufferwith Qt는에 "직접"를 그리기 위해 어떤있는 posibility을 발견하지 않았습니다). 나는 QwtPlotIntervalCurve의 자신의 구현 qwt 사용하여 내 그리기 코드를 (제공에 대한 이 요구 되었기 때문에이 상태에서 캐싱하지 않고/비트 맵 사용법, 자유롭게 최적화 제안 제안, 줌 단계마다 최대 1024 포인트 만 그릴 수 있음). 이 코드는 최소/최대 값과 RMS 값에 대해 수행됩니다.

void WaveformWidget::QwtPlotIntervalCurveFast::drawTube(QPainter * painter, const QwtScaleMap & xMap, const QwtScaleMap & yMap, const QRectF & canvasRect, int from, int to) const 
{ 
    painter->save(); //Not best performance but for some people it suits. 
    painter->setPen(this->pen()); //Feel free to use it. 
    std::vector<QwtIntervalSample> draw = getToDrawData(xMap, yMap); 
    double x, y1, y2; 
    std::vector<QLine> lines(draw.size()); 
    for (int i = 0; i < draw.size(); i++) { 
     x = xMap.transform(draw[i].value); 
     y1 = yMap.transform(draw[i].interval.minValue()); 
     y2 = yMap.transform(draw[i].interval.maxValue()); 
     lines[i] = (QLine(x, y1, x, y2)); 
    } 
    painter->drawLines(lines.data(), lines.size()); 
    painter->restore(); 
} 

업데이트 2 : 이제 프로파일 첨부 파일 : 그것을 위해

죄송합니다 독일에있는 것.

CPU usage during resize of waveform (those tiny peaks)

업데이트 3 : 물건처럼 보이는 방법 . 소음이없는 사인파입니다. 실제 신호가 나오기 전에 약 1 ~ 2 단계의 줌 단계 만 있으면됩니다 (만약 당신이 내게 어떻게 보이는지에 대한 피드백을 주길 바란다면 그것은 굉장히 좋을 것입니다. 큰"). 예 Audacity는 rms 값이 최대/최소값보다 커지지 않도록합니다. 나는 나중에 그것을 추가 할 것이다.

enter image description here

훨씬 그 성능을 향상 unseperated 곡선을 그리기시겠습니까?

업데이트 :

나는 "파형 위젯의 크기를 조정"하는 동안 대담에 내 응용 프로그램의 프로세서 사용량을 비교했다. Audacity는 위젯의 크기를 조정할 때 최소한 내 응용 프로그램보다 프로세서 시간을 10 % 덜 사용합니다. 이러한 작업 중 대담성의 총 사용량은 내 컴퓨터의 20 % (광산 30 %)에 있습니다.

+1

** 프로필 **에서 귀하의 코드와 Audacity 's를 비교했는데 차이점이 기본 툴킷에 의해 수행 된 비트 맵 페인팅 어딘가에 있음을 발견 했습니까? 그렇다면 프로파일 러 결과를 첨부하십시오. 그렇지 않은 경우 먼저 프로필을 작성하십시오. 맞춰 보지 마. – peppe

+0

에 관계없이 위젯에서 'Qt :: WA_PaintOnScreen' 플래그를 설정하여 X11의 화면에 직접 페인트 할 수 있습니다. 다른 것들을 깨뜨리는 것은 가장 중요한 최적화가 아닙니다 (우리는 2016 년에 이중 버퍼링이 더 이상 문제가되지 않습니다). 귀하의 문제를 해결할 것이라고는 생각하지 않습니다. – peppe

+0

조사 후 파형을 그리는 것은 그리 복잡하지 않습니다. 확대 축소를 위해 신호를 패킷으로 나눠서 최대/최소 값을 옵션 인 rms로 얻은 다음 세로선으로 물건을 그립니다. 그건 분명하고 잘 작동해야합니다, 그렇지 않아야합니까? 나는 너의 요점을 보았다, 미안하다, 나는 시험의 나의 부족 때문에 나는 이것 이상을 줄 수 없다. Windows 시스템에서도 가능합니까? –

답변

0

필자는 Windows 시스템에서만이 질문에 답할 수 있습니다.

이 경우 wxWidgets는 qt보다 빠릅니다.

내가 생각하기에 이것은 페인트가 페인트 이벤트와 독립적으로 적용될 수 있으며 그림이 화면에서 직접 수행된다는 것입니다. 또한 wxWidgets는 이중 버퍼링을 원할 경우 특정 가속을 사용할 수 있습니다 (예 : 기본 비트 맵).

대조적으로, Qt는 (지금까지 내가 알고있는) 더블 버퍼링을 사용하지만 Windows 시스템에서는 사용할 수 없습니다 (Linux 시스템에서도 가능함).

이 질문은 Windows 시스템에서만 응답되므로이를 수락하지 않습니다.

추 신 : Linux 시스템에 대해 몇 가지 테스트를 수행 할 수 있다면 제발 저에게 연락하십시오. 코드를 제공 할 것입니다.