diff options
author | Mikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com> | 2019-11-20 21:05:45 +0200 |
---|---|---|
committer | Mikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com> | 2019-11-29 11:12:55 +0200 |
commit | 6419cd0ab2ba877bbae51ae7590ddba47765dac7 (patch) | |
tree | b167f864db677365d281423e1df755f7fd383989 /src/mbgl/tile | |
parent | ab5572b0bc3d386893592b842ad58b356b227a5d (diff) | |
download | qtlocation-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.cpp | 23 | ||||
-rw-r--r-- | src/mbgl/tile/geojson_tile.hpp | 11 |
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 |