diff options
author | John Firebaugh <john.firebaugh@gmail.com> | 2016-06-16 15:51:47 -0700 |
---|---|---|
committer | John Firebaugh <john.firebaugh@gmail.com> | 2016-06-17 11:38:03 -0700 |
commit | e2f52a1dd8020e8665c55650c75d4e5a5e1423a6 (patch) | |
tree | 94e9ee3fdc377c2af12416059e0f74895961da94 /src/mbgl/tile/geometry_tile.cpp | |
parent | a3318c2ced80a3b79dd898afb9f0fe27f0ce7571 (diff) | |
download | qtlocation-mapboxgl-e2f52a1dd8020e8665c55650c75d4e5a5e1423a6.tar.gz |
[core] Copy only the necessary style layers to the worker
Diffstat (limited to 'src/mbgl/tile/geometry_tile.cpp')
-rw-r--r-- | src/mbgl/tile/geometry_tile.cpp | 42 |
1 files changed, 33 insertions, 9 deletions
diff --git a/src/mbgl/tile/geometry_tile.cpp b/src/mbgl/tile/geometry_tile.cpp index 41673a79c6..daa358420b 100644 --- a/src/mbgl/tile/geometry_tile.cpp +++ b/src/mbgl/tile/geometry_tile.cpp @@ -2,6 +2,8 @@ #include <mbgl/tile/tile_observer.hpp> #include <mbgl/tile/geometry_tile_data.hpp> #include <mbgl/style/layer_impl.hpp> +#include <mbgl/style/layers/background_layer.hpp> +#include <mbgl/style/layers/custom_layer.hpp> #include <mbgl/util/worker.hpp> #include <mbgl/util/work_request.hpp> #include <mbgl/style/style.hpp> @@ -12,15 +14,17 @@ namespace mbgl { +using namespace style; + GeometryTile::GeometryTile(const OverscaledTileID& id_, - std::string sourceID, - style::Style& style_, + std::string sourceID_, + Style& style_, const MapMode mode_) : Tile(id_), + sourceID(std::move(sourceID_)), style(style_), worker(style_.workers), tileWorker(id_, - sourceID, *style_.spriteStore, *style_.glyphAtlas, *style_.glyphStore, @@ -28,10 +32,34 @@ GeometryTile::GeometryTile(const OverscaledTileID& id_, mode_) { } +GeometryTile::~GeometryTile() { + cancel(); +} + void GeometryTile::setError(std::exception_ptr err) { observer->onTileError(*this, err); } +std::vector<std::unique_ptr<Layer>> GeometryTile::cloneStyleLayers() const { + std::vector<std::unique_ptr<Layer>> result; + + for (const Layer* layer : style.getLayers()) { + // Avoid cloning and including irrelevant layers. + if (layer->is<BackgroundLayer>() || + layer->is<CustomLayer>() || + layer->baseImpl->source != sourceID || + id.overscaledZ < std::floor(layer->baseImpl->minZoom) || + id.overscaledZ >= std::ceil(layer->baseImpl->maxZoom) || + layer->baseImpl->visibility == VisibilityType::None) { + continue; + } + + result.push_back(layer->baseImpl->clone()); + } + + return result; +} + void GeometryTile::setData(std::unique_ptr<GeometryTileData> data_) { if (!data_) { // This is a 404 response. We're treating these as empty tiles. @@ -53,7 +81,7 @@ void GeometryTile::setData(std::unique_ptr<GeometryTileData> data_) { // when tile data changed. Replacing the workdRequest will cancel a pending work // request in case there is one. workRequest.reset(); - workRequest = worker.parseGeometryTile(tileWorker, style.getLayers(), std::move(data_), targetConfig, [this, config = targetConfig] (TileParseResult result) { + workRequest = worker.parseGeometryTile(tileWorker, cloneStyleLayers(), std::move(data_), targetConfig, [this, config = targetConfig] (TileParseResult result) { workRequest.reset(); if (result.is<TileParseResultData>()) { @@ -82,10 +110,6 @@ void GeometryTile::setData(std::unique_ptr<GeometryTileData> data_) { }); } -GeometryTile::~GeometryTile() { - cancel(); -} - bool GeometryTile::parsePending() { if (workRequest) { // There's already parsing or placement going on. @@ -126,7 +150,7 @@ bool GeometryTile::parsePending() { return true; } -Bucket* GeometryTile::getBucket(const style::Layer& layer) { +Bucket* GeometryTile::getBucket(const Layer& layer) { const auto it = buckets.find(layer.baseImpl->bucketName()); if (it == buckets.end()) { return nullptr; |