[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.
This commit is contained in:
Mikhail Pozdnyakov
2019-11-20 21:05:45 +02:00
parent ab5572b0bc
commit 6419cd0ab2
6 changed files with 87 additions and 53 deletions

View File

@@ -4,15 +4,16 @@
#include <mbgl/tile/geojson_tile.hpp>
#include <mbgl/tile/tile_loader_impl.hpp>
#include <mbgl/util/run_loop.hpp>
#include <mbgl/annotation/annotation_manager.hpp>
#include <mbgl/map/transform.hpp>
#include <mbgl/renderer/image_manager.hpp>
#include <mbgl/renderer/tile_parameters.hpp>
#include <mbgl/style/style.hpp>
#include <mbgl/style/layers/circle_layer.hpp>
#include <mbgl/style/layers/circle_layer_impl.hpp>
#include <mbgl/annotation/annotation_manager.hpp>
#include <mbgl/renderer/image_manager.hpp>
#include <mbgl/style/sources/geojson_source.hpp>
#include <mbgl/style/style.hpp>
#include <mbgl/text/glyph_manager.hpp>
#include <mbgl/util/run_loop.hpp>
#include <memory>
@@ -43,6 +44,29 @@ public:
};
};
namespace {
class FakeGeoJSONData : public GeoJSONData {
public:
FakeGeoJSONData(TileFeatures features_) : features(std::move(features_)) {}
void getTile(const CanonicalTileID&, const std::function<void(TileFeatures)>& fn) final {
assert(fn);
fn(features);
}
Features getChildren(const std::uint32_t) final { return {}; }
Features getLeaves(const std::uint32_t, const std::uint32_t, const std::uint32_t) final { return {}; }
std::uint8_t getClusterExpansionZoom(std::uint32_t) final { return 0; }
private:
TileFeatures features;
};
} // namespace
TEST(GeoJSONTile, Issue7648) {
GeoJSONTileTest test;
@@ -50,8 +74,8 @@ TEST(GeoJSONTile, Issue7648) {
mapbox::feature::feature_collection<int16_t> features;
features.push_back(mapbox::feature::feature<int16_t> { mapbox::geometry::point<int16_t>(0, 0) });
GeoJSONTile tile(OverscaledTileID(0, 0, 0), "source", test.tileParameters, features);
auto data = std::make_shared<FakeGeoJSONData>(std::move(features));
GeoJSONTile tile(OverscaledTileID(0, 0, 0), "source", test.tileParameters, data);
Immutable<LayerProperties> layerProperties = makeMutable<CircleLayerProperties>(staticImmutableCast<CircleLayer::Impl>(layer.baseImpl));
StubTileObserver observer;
observer.tileChanged = [&] (const Tile&) {
@@ -68,7 +92,7 @@ TEST(GeoJSONTile, Issue7648) {
test.loop.runOnce();
}
tile.updateData(features);
tile.updateData(data);
while (!tile.isComplete()) {
test.loop.runOnce();
}
@@ -83,8 +107,8 @@ TEST(GeoJSONTile, Issue9927) {
mapbox::feature::feature_collection<int16_t> features;
features.push_back(mapbox::feature::feature<int16_t> { mapbox::geometry::point<int16_t>(0, 0) });
GeoJSONTile tile(OverscaledTileID(0, 0, 0), "source", test.tileParameters, features);
auto data = std::make_shared<FakeGeoJSONData>(std::move(features));
GeoJSONTile tile(OverscaledTileID(0, 0, 0), "source", test.tileParameters, data);
Immutable<LayerProperties> layerProperties = makeMutable<CircleLayerProperties>(staticImmutableCast<CircleLayer::Impl>(layer.baseImpl));
std::vector<Immutable<LayerProperties>> layers { layerProperties };