Как можно настроить алгоритм рисования 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);
Все работает хорошо!У меня есть фиксированное время для любого количества элементов.
Есть ли у вас какие-либо предложения по ускорению моего кода?
UDPATE:
У меня ошибка причтение QPainterPath и добавление элементов к нему из другого потока.Иногда происходит сбой приложения с помощью стека вызовов:
QtCored4.dll! Qt_message_output (QtMsgType msgType, const char * buf) Строка 2240 C ++ QtCored4.dll! Qt_message (QtMsgType msgType, const char * ap), const char * ap)Строка 2298 + 0x12 байт C ++ QtCored4.dll! QFatal (const char * msg, ...) Строка 2481 + 0xf байт C ++ QtCored4.dll! Qt_assert (утверждение const char *, файл const char *, строка int) Строка 1999 + 0x16байты C ++ QtGuid4.dll! QPainterPath :: elementAt (int i) Строка 405 + 0x36 байт C ++ MyPlot.dll! MyPlot :: paintEvent (событие QPaintEvent *) Строка 172 + 0x13 байт C ++
при вызовеelementAt (i), i == 4303 и 5459 элементов.
Может быть, количество элементов не является действительным на момент сбоя?
Может ли второй поток изменять количество элементов, когда происходит сбой первого потока?
Вот как работают мои темы: Мой поток графического интерфейса использует только методы только для чтения.Мой второй поток добавляет 1-5 тысяч очков в секунду.