производительность Qt - OpenGL - PullRequest
1 голос
/ 12 апреля 2011

Я не хочу использовать Native OpenGL в функции рисования моих виджетов (QPainter), чтобы улучшить производительность. я видел, что есть функция QPainter :: begin / endNativePainting (), которая может мне помочь. но я не могу найти примеры для этого ... я хотел бы знать, являются ли эти функции дешевыми, или любое их использование снижает производительность? 2. Могу ли я определить beginNativePainting () и endNativePainting (), в целом для всех виджетов, которые я использую, вместо того, чтобы использовать это в каждой функции рисования, которую я имею.

tnx за любую помощь ....

Ответы [ 2 ]

1 голос
/ 12 апреля 2011

Прямой пример кода приведен в документации: http://doc.qt.io/qt-4.8/qpainter.html#beginNativePainting

Сами функции должны быть довольно дешевыми, но их вызов может все еще вызывать заметные накладные расходы, потому что Qt должен очистить свою внутреннюю очередь рисования при вызове beginNativePainting() и, вероятно, должен предположить, что все меняется, как только endNativePainting() называется.

Что касается второй части, я не уверен, понимаю ли я, к чему вы стремитесь. В основном, если у вас есть объект QPainter, вы можете вызвать beginNativePainting() один раз. Но вы должны сопоставить его с endNativePainting() звонком. Поэтому обычным местом будет метод paint ().

0 голосов
/ 11 мая 2014

Qt использует ряд функциональных возможностей OpenGL для реализации 2D-рисования, включая пользовательские шейдеры и различные буферы кадров. Это переводит OpenGL в довольно грязное состояние.

beginNativePainting / endNativePainting предназначены для того, чтобы механизм рисования Qt мог сохранить этот контекст и извлечь его, как только пользователь завершит рисование.

Было бы неплохо, чтобы методы xxxNativePainting делали обратное (т.е. автоматически сохраняли и восстанавливали пользовательскую конфигурацию OpenGL), но, поскольку Qt позволяет напрямую вызывать примитивы OpenGL, сохранение глобального состояния практически невозможно без множества код и потенциальный серьезный удар по производительности.

Вместо этого эти методы просто сохраняют внутреннее состояние OpenGL в Qt и вместо того, чтобы запускать пользовательский код в конфигурации, которая в любом случае была бы бессмысленной (и может изменяться с каждым новым выпуском Qt), сбрасывают OpenGL в «нейтральное» состояние.
Это означает, что внутри раздела начала / конца вы начнете с чистого листа: без связанного шейдера, без массива вершин, сброса большинства глобальных параметров и т. Д.

В отличие от простого сценария QGLWidget / PaintGL, где вы можете позволить раз и навсегда установить глобальное состояние OpenGL и просто вызывать примитивы рендеринга в каждом кадре, вам придется восстанавливать практически все сразу после вызова beginNativePainting (связать / связать ваши шейдеры, установить глобальные параметры, выбрать и включить различные буферы и т. д.).

Это также означает, что вы должны использовать родную живопись спарринг. Если каждый виджет выполнит пользовательскую рисование, это может скоро поставить ваш рендеринг на колени.

...