summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAsheem Mamoowala <asheem.mamoowala@mapbox.com>2017-10-06 13:28:13 -0700
committerAsheem Mamoowala <asheem.mamoowala@mapbox.com>2017-10-10 16:53:14 -0700
commit39d7bb07a4b1d9196bf2ead7b248e899784ee767 (patch)
tree8f3d6bdb3deb812bae67a2e72358d66e6f9171e6
parent5ff455b63a88dbf82ef210b78adb0bbcbd9e8c76 (diff)
downloadqtlocation-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.cpp12
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))) {