2011-04-12 8 views
1

내 위젯 (QPainter)의 페인트 기능에서 기본 OpenGL을 사용하지 않아 성능을 향상시킬 수 없습니다. QPainter :: begin/endNativePainting() 함수가 있다는 것을 알았습니다. 저를 도울 수 있습니다. 하지만 그 예제를 찾을 수 없습니다 ... 그 기능이 저비용인지 또는 성능을 저하시키는 데 사용하려고하는지 알고 싶습니까? 2. 내가 사용하는 모든 페인트 기능에서 사용하지 않고, 내가 사용하는 모든 위젯에 대해 일반적으로 beginNativePainting() 및 endNativePainting()을 정의 할 수 있습니다. http://doc.qt.io/qt-4.8/qpainter.html#beginNativePaintingqt 성능 - OpenGL

자체가 상당히 저렴한 비용으로해야한다 기능 있지만이 눈에 띄게 원인이 여전히 있습니다 전화 :가 바로 문서에 몇 가지 기본적인 예제 코드는

답변

1

어떤 도움

TNX .... 왜냐하면 Qt는 beginNativePainting() 콜에서 내부 페인팅 큐를 플러시해야하고 아마도 endNativePainting()이 호출되는 즉시 모든 것이 변경된다고 가정해야하기 때문입니다.

두 번째 부분에서 나는 당신이 목표로하는 것을 이해하는지 잘 모르겠습니다. 기본적으로 QPainter 오브젝트가있는 경우 beginNativePainting()을 한 번 호출 할 수 있습니다. 하지만 endNativePainting() 전화와 일치시켜야합니다. 따라서 일반적인 장소는 paint() 메소드입니다.

+0

이 예제를 보았지만 그것을 사용하는 프로그램이 없습니다 (qt examples/demos/nokia-forum) ... 그리고 정말 유용한 지 궁금하거나 다른 방법이 있습니다. 2. 응용 프로그램에서 위젯을 많이 사용하기 위해 QWidget의 ctor에 beginNativePainting()을 넣고 dtor에 endNativePainting()을 넣을 수 있습니까? ..... 내가 위젯을 많이 가지고 있으면 정말 유용 할까? – dan

+0

Qt 프레임 워크는 QWidget의 paintEvent() 메소드에 대한 매개 변수로 QPainter를 제공합니다.begin/endNativePainting()을 사용하면 (QPainter가 존재하는 한)이 메서드 내에서만 의미가 있습니다. 그래서 당신은 단순히 beginNativePainting()을 ctor()에 호출 할 수 없습니다. 무엇을하고 있는지 확실하지 않다면 QPainter를 사용하여 begin/endNativePainting()을 페인트하고 무시하는 것이 좋습니다. Qt의 API로 해결할 수없는 문제가있는 경우에만 재검토해야 할 시간이 될 것입니다. OpenGL을 사용하는 것이 전부라면 Qt의 그래픽 시스템을 보길 원할 것입니다. – Steffen

+0

성능 향상을 위해 OpenGL을 사용해야합니다 ... 가장 좋은 방법은 무엇인지 알 필요가 없습니다. 위젯 코드에서 많은 부분을 변경하지 않고도 그렇게 할 수 있습니다. – dan

0

Qt는 커스텀 셰이더와 다양한 프레임 버퍼를 포함하여 2D 페인팅을 구현하기 위해 다양한 OpenGL 기능을 사용합니다. OpenGL을 꽤 지저분한 상태로 만듭니다.

/endNativePainting Qt의 드로잉 엔진이이 컨텍스트를 저장하고 사용자가 드로잉을 마친 후에 검색 할 수있게하려면 여기를 클릭하십시오.

xxxNativePainting 메소드가 반대로 실행되면 좋겠지 만 (즉, OpenGL의 사용자 구성을 자동으로 저장하고 복원합니다), Qt는 OpenGL 프리미티브를 직접 호출 할 수 있기 때문에 전역 상태를 저장하는 것이 불가능합니다. 잠재적 인 심각한 성능 저하.

대신 이러한 방법은 단순히 Qt의 내부 OpenGL 상태를 저장하고 사용자 코드가 어쨌든 의미가없는 (새 Qt 릴리스마다 변경 될 수 있음) 구성에서 시작하는 대신 OpenGL을 "중립"상태로 재설정합니다 .
는 그것은 시작/종료 섹션 내에서, 당신은 깨끗한 상태로 시작됩니다 것을 의미합니다 : 더 쉐이더는 간단한 QGLWidget/PaintGL 시나리오 곳 등

는 달리, 어떤 정점 배열, 전역 매개 변수의 대부분은 다시없는 연결하지 전역 OpenGL 상태를 한 번에 설정하고 각 프레임의 렌더링 프리미티브를 호출 할 수 있다면 beginNativePainting (호출/바인딩, 전역 매개 변수 설정, 선택 및 활성화) 직후에 거의 모든 것을 복원해야합니다. 다양한 버퍼 등).

네이티브 페인팅을 스파링해야합니다. 각 단일 위젯이 사용자 지정 그림을 사용하면 곧 렌더링이 무릎을 꿇을 수도 있습니다.