summaryrefslogtreecommitdiff
path: root/src/mbgl/tile
diff options
context:
space:
mode:
authorMikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com>2019-11-20 21:05:45 +0200
committerMikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com>2019-11-29 11:12:55 +0200
commit6419cd0ab2ba877bbae51ae7590ddba47765dac7 (patch)
treeb167f864db677365d281423e1df755f7fd383989 /src/mbgl/tile
parentab5572b0bc3d386893592b842ad58b356b227a5d (diff)
downloadqtlocation-mapboxgl-6419cd0ab2ba877bbae51ae7590ddba47765dac7.tar.gz
[core] Calculate GeoJSON tile geometries in a background thread
Call `mapbox::geojsonvt::GeoJSONVT::getTile()` in a background thread, so that the rendering thread is not blocked.
Diffstat (limited to 'src/mbgl/tile')
-rw-r--r--src/mbgl/tile/geojson_tile.cpp23
-rw-r--r--src/mbgl/tile/geojson_tile.hpp11
2 files changed, 25 insertions, 9 deletions
diff --git a/src/mbgl/tile/geojson_tile.cpp b/src/mbgl/tile/geojson_tile.cpp
index 0782f74d5d..a4c48fb809 100644
--- a/src/mbgl/tile/geojson_tile.cpp
+++ b/src/mbgl/tile/geojson_tile.cpp
@@ -1,20 +1,29 @@
-#include <mbgl/tile/geojson_tile.hpp>
-#include <mbgl/tile/geojson_tile_data.hpp>
#include <mbgl/renderer/query.hpp>
#include <mbgl/renderer/tile_parameters.hpp>
-
+#include <mbgl/style/sources/geojson_source.hpp>
+#include <mbgl/tile/geojson_tile.hpp>
+#include <mbgl/tile/geojson_tile_data.hpp>
namespace mbgl {
GeoJSONTile::GeoJSONTile(const OverscaledTileID& overscaledTileID,
std::string sourceID_,
const TileParameters& parameters,
- mapbox::feature::feature_collection<int16_t> features)
+ std::shared_ptr<style::GeoJSONData> data_)
: GeometryTile(overscaledTileID, sourceID_, parameters) {
- updateData(std::move(features));
+ updateData(std::move(data_));
}
-void GeoJSONTile::updateData(mapbox::feature::feature_collection<int16_t> features, bool resetLayers) {
- setData(std::make_unique<GeoJSONTileData>(std::move(features)), resetLayers);
+void GeoJSONTile::updateData(std::shared_ptr<style::GeoJSONData> data_, bool resetLayers) {
+ assert(data_);
+ data = std::move(data_);
+ data->getTile(id.canonical,
+ [this, self = weakFactory.makeWeakPtr(), capturedData = data.get(), resetLayers](
+ style::GeoJSONData::TileFeatures features) {
+ if (!self) return;
+ if (data.get() != capturedData) return;
+ auto tileData = std::make_unique<GeoJSONTileData>(std::move(features));
+ setData(std::move(tileData), resetLayers);
+ });
}
void GeoJSONTile::querySourceFeatures(
diff --git a/src/mbgl/tile/geojson_tile.hpp b/src/mbgl/tile/geojson_tile.hpp
index 9161e33f0c..26dc300bdc 100644
--- a/src/mbgl/tile/geojson_tile.hpp
+++ b/src/mbgl/tile/geojson_tile.hpp
@@ -4,6 +4,9 @@
#include <mbgl/util/feature.hpp>
namespace mbgl {
+namespace style {
+class GeoJSONData;
+} // namespace style
class TileParameters;
@@ -12,13 +15,17 @@ public:
GeoJSONTile(const OverscaledTileID&,
std::string sourceID,
const TileParameters&,
- mapbox::feature::feature_collection<int16_t>);
+ std::shared_ptr<style::GeoJSONData>);
- void updateData(mapbox::feature::feature_collection<int16_t>, bool resetLayers = false);
+ void updateData(std::shared_ptr<style::GeoJSONData> data, bool resetLayers = false);
void querySourceFeatures(
std::vector<Feature>& result,
const SourceQueryOptions&) override;
+
+private:
+ std::shared_ptr<style::GeoJSONData> data;
+ mapbox::base::WeakPtrFactory<GeoJSONTile> weakFactory{this};
};
} // namespace mbgl