From 71047ab8534462def95537bc15ad7b726df5c1b3 Mon Sep 17 00:00:00 2001 From: Mikhail Pozdnyakov Date: Tue, 8 Oct 2019 22:37:53 +0300 Subject: [core] Disallow coalesced requests for patterns Unlike icons, pattern changes are not caught with style-diff meaning that the existing request could be from the previous style and we cannot coalesce requests for them. --- src/mbgl/renderer/image_manager.cpp | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/mbgl/renderer/image_manager.cpp b/src/mbgl/renderer/image_manager.cpp index a776672edd..65defc54c8 100644 --- a/src/mbgl/renderer/image_manager.cpp +++ b/src/mbgl/renderer/image_manager.cpp @@ -170,20 +170,21 @@ void ImageManager::reduceMemoryUseIfCacheSizeExceedsLimit() { } void ImageManager::checkMissingAndNotify(ImageRequestor& requestor, const ImageRequestPair& pair) { - std::vector missingImages; - missingImages.reserve(pair.first.size()); + ImageDependencies missingDependencies; + for (const auto& dependency : pair.first) { if (images.find(dependency.first) == images.end()) { - missingImages.push_back(dependency.first); + missingDependencies.emplace(dependency); } } - if (!missingImages.empty()) { + if (!missingDependencies.empty()) { ImageRequestor* requestorPtr = &requestor; assert(!missingImageRequestors.count(requestorPtr)); missingImageRequestors.emplace(requestorPtr, pair); - for (const auto& missingImage : missingImages) { + for (const auto& dependency : missingDependencies) { + const std::string& missingImage = dependency.first; assert(observer != nullptr); auto existingRequestorsIt = requestedImages.find(missingImage); @@ -191,8 +192,15 @@ void ImageManager::checkMissingAndNotify(ImageRequestor& requestor, const ImageR if (!existingRequestorsIt->second.empty()) { // Still waiting for the client response. existingRequestorsIt->second.emplace(requestorPtr); requestor.addPendingRequest(missingImage); + continue; + } + // Unlike icons, pattern changes are not caught + // with style-diff meaning that the existing request + // could be from the previous style and we cannot + // coalesce requests for them. + if (dependency.second != ImageType::Pattern) { + continue; } - continue; } requestedImages[missingImage].emplace(requestorPtr); requestor.addPendingRequest(missingImage); -- cgit v1.2.1