LINUX.ORG.RU

Как в QML на объекте Map наиболее оптимизированно показать часть QGeoPath?

 , , ,


0

1

Имеется объект класса QGeoPath, который хранит ~3500 точек. Заказчик требует, чтобы в программе была настройка, какую часть запомненного трека отрисовывать. Условно говоря, 150 точек, 300 точек, 500 точек, 1000, 2000, полный трек.

В самом классе QGeoPath нет возможности указать, на какой точке остановиться при отрисовке трека. Поэтому с таким классом видится только два пути:

1. Делать копию объекта, укорачивать до нужной длинны, и этот объект и отрисовывать на карте Map.
2. Или копировать только нужные данные из этого объекта в отображаемый и отрисовывать его на карте Map. (Возможно, это более оптимизированно, чем вариант 1, но не факт).

Небольшие подробности: экземпляр QGeoPath пополняется новыми точками 10 раз в секунду. Пока трек не достиг длинны 3500 точек, новые точки просто добавляются в «голову». Когда длинна становится 3500, работает алгоритм «змейки», то есть в голову добавляется точка, и в «хвосте» точка удаляется.


Класс QGeoPath - это, по сути, QList<QGeoCoordinate>. То есть, это не массив, а очень фрагментированная в памяти структура. Делать с нее копию таких данных 10 раз в сек, только для того, чтобы показать _часть_ данных - это какой-то дикий оверхед.

Вопрос: как можно извратиться так, чтобы отображать часть трека наиболее оптимизированным способом?

★★★★★

То есть, это не массив, а очень фрагментированная в памяти структура

Вообще-то QList<QGeoCoordinate> это самый настоящий массив. К тому же в QGeoCoordinate лежит QSharedDataPointer, и реально в объектах массива находятся только указатели на QGeoCoordinatePrivate, так что хоть обкопируйся

annulen ★★★★★ ()
Ответ на: комментарий от Xintrea

Вот как ты это определил что список - это массив?

В документации все написано, и на всех форумах это сто раз разжевывали.

Internally, QList<T> is represented as an array of T if sizeof(T) <= sizeof(void*) and T has been declared to be either a Q_MOVABLE_TYPE or a Q_PRIMITIVE_TYPE using Q_DECLARE_TYPEINFO. Otherwise, QList<T> is represented as an array of T* and the items are allocated on the heap.

В нашем случае оба условия выполнены. Если бы одно из них не было - тогда был бы массив указателей на QGeoCoordinate.

А список - это QLinkedList.

annulen ★★★★★ ()
Ответ на: комментарий от Xintrea

Да это дешево, он тупо увеличит счетчик ссылок для твоего QList'а, и пересчитает bounding box (что в любом случае пришлось бы делать в какой-то момент)

https://code.woboq.org/qt5/qtlocation/src/positioning/qgeopath.cpp.html#_ZN15...

annulen ★★★★★ ()
Ответ на: комментарий от Xintrea

Ну если выборки точек не зависят от самих точек (т.е. нет задачи показать часть точек в завимиости от длины пути, или лежащих в каком-то регионе), тогда mid() самое то

annulen ★★★★★ ()