diff options
author | Asheem Mamoowala <asheem.mamoowala@mapbox.com> | 2017-10-06 13:28:13 -0700 |
---|---|---|
committer | Asheem Mamoowala <asheem.mamoowala@mapbox.com> | 2017-10-10 16:53:14 -0700 |
commit | 39d7bb07a4b1d9196bf2ead7b248e899784ee767 (patch) | |
tree | 8f3d6bdb3deb812bae67a2e72358d66e6f9171e6 | |
parent | 5ff455b63a88dbf82ef210b78adb0bbcbd9e8c76 (diff) | |
download | qtlocation-mapboxgl-39d7bb07a4b1d9196bf2ead7b248e899784ee767.tar.gz |
[core] Cache canonical tile data to avoid multiple round trips through the bindings
-rw-r--r-- | src/mbgl/style/sources/custom_vector_source.cpp | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/src/mbgl/style/sources/custom_vector_source.cpp b/src/mbgl/style/sources/custom_vector_source.cpp index c1b3f390a9..09e69e3e53 100644 --- a/src/mbgl/style/sources/custom_vector_source.cpp +++ b/src/mbgl/style/sources/custom_vector_source.cpp @@ -3,6 +3,7 @@ #include <mbgl/actor/scheduler.hpp> #include <tuple> +#include <map> namespace mbgl { namespace style { @@ -18,7 +19,12 @@ public: } void fetchTile(const OverscaledTileID& tileID, ActorRef<SetTileDataFunction> callbackRef) { - fetchTileFunction(tileID.canonical); + auto cachedTileData = dataCache.find(tileID.canonical); + if (cachedTileData == dataCache.end()) { + fetchTileFunction(tileID.canonical); + } else { + callbackRef.invoke(&SetTileDataFunction::operator(), *(cachedTileData->second)); + } auto tileCallbacks = tileCallbackMap.find(tileID.canonical); if (tileCallbacks == tileCallbackMap.end()) { auto tuple = std::make_tuple(tileID.overscaledZ, tileID.wrap, callbackRef); @@ -52,6 +58,7 @@ public: } if (tileCallbacks->second.size() == 0) { tileCallbackMap.erase(tileCallbacks); + dataCache.erase(tileID.canonical); } } @@ -59,6 +66,7 @@ public: void setTileData(const CanonicalTileID& tileID, const mapbox::geojson::geojson& data) { auto iter = tileCallbackMap.find(tileID); if (iter == tileCallbackMap.end()) return; + dataCache[tileID] = std::make_unique<mapbox::geojson::geojson>(data); for(auto tuple : iter->second) { auto actor = std::get<2>(tuple); actor.invoke(&SetTileDataFunction::operator(), data); @@ -69,9 +77,9 @@ private: TileFunction fetchTileFunction; TileFunction cancelTileFunction; std::unordered_map<CanonicalTileID, std::vector<OverscaledIDFunctionTuple>> tileCallbackMap; + std::map<CanonicalTileID, std::unique_ptr<mapbox::geojson::geojson>> dataCache; }; - CustomTileLoader::CustomTileLoader(TileFunction&& fetchTileFn, TileFunction&& cancelTileFn) : impl(new CustomTileLoader::Impl(std::move(fetchTileFn), std::move(cancelTileFn))) { |