Как можно настроить алгоритм рисования QPainterPath?
Я хотел бы ускорить свое приложение, рисуя только видимые элементы.
Я рисую график в реальном времени из QPainterPath и хотел бы сделать это:
- Двоичный поиск самого левого видимого элемента QPainterPath.
- Двоичный поиск самого правого видимого элемента QPainterPath.
- Рисовать только видимые элементы.
Я думаю, что мне следует настроить QPaintEngine моего QWidget через QWidget::paintEngine()
.
Но QPaintEngine::drawPath(...)
реализация по умолчанию ничего не делает .
Прав я или нет?
ОБНОВЛЕНИЕ:
Спасибо за ответ, Койинг.
Я только что попробовал так:
int minIndex = BinarySearchForMatchOrGreat(path, beginOffset);
int maxIndex = BinarySearchForMatchOrGreat(path, endOffset);
QPainterPath newPath;
for (int i = minIndex; i < maxIndex; i++)
{
const QPainterPath::Element & element = path.elementAt(i);
newPath.moveTo(element.x, element.y);
}
painter.drawPath(newPath);
Все работает красиво! У меня фиксированные затраты времени для любого количества элементов.
Есть ли у вас какие-либо предложения по ускорению моего кода?
ОБНОВЛЕНИЕ:
У меня ошибка при чтении QPainterPath и добавлении к нему элементов из другого потока. Иногда приложение вылетает со стеком вызовов:
QtCored4.dll!qt_message_output(QtMsgType msgType, const char * buf) Строка 2240 C++ QtCored4.dll!qt_message(QtMsgType msgType, const char * msg, char * ap) Строка 2298 + 0x12 байт C++ QtCored4.dll!qFatal(const char * msg, ...) Строка 2481 + 0xf байт C++ QtCored4.dll!qt_assert(const char * assertion, const char * file, int line) Строка 1999 + 0x16 байт C++ QtGuid4.dll!QPainterPath::elementAt(int i) Строка 405 + 0x36 байт C++ MyPlot.dll!MyPlot::paintEvent(QPaintEvent * event) Строка 172 + 0x13 байт C++
при вызове elementAt(i), i == 4303 и 5459 элементов.
Может быть, количество элементов не соответствует действительности на момент аварии?
Может ли второй поток изменить количество элементов, когда первый поток дает сбой?
Вот как работают мои потоки: Мой поток графического интерфейса использует только методы только для чтения. Мой второй поток добавляет 1-5 тысяч точек в секунду.