summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com>2019-10-25 15:13:02 +0300
committerMikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com>2019-10-28 13:02:32 +0200
commit2f00ba72946618b6baac03ae395645cbeb83fe00 (patch)
tree24180f7feab0afc312f5bb237953a722661e857d
parentaa36dc87fb5583425ab29b4a15407186c31c492f (diff)
downloadqtlocation-mapboxgl-2f00ba72946618b6baac03ae395645cbeb83fe00.tar.gz
[core] Do not make pending requests for already requested images.
so that processing for the corresponding tile does not suspend and the rendering performance is not affected.
-rw-r--r--src/mbgl/renderer/image_manager.cpp15
-rw-r--r--test/renderer/image_manager.test.cpp12
2 files changed, 9 insertions, 18 deletions
diff --git a/src/mbgl/renderer/image_manager.cpp b/src/mbgl/renderer/image_manager.cpp
index 7b51fb9a2e..108376d190 100644
--- a/src/mbgl/renderer/image_manager.cpp
+++ b/src/mbgl/renderer/image_manager.cpp
@@ -197,16 +197,13 @@ void ImageManager::checkMissingAndNotify(ImageRequestor& requestor, const ImageR
existingRequestors.emplace(requestorPtr);
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;
- }
+ // The request for this image has been already delivered
+ // to the client, so we do not treat it as pending.
+ existingRequestors.emplace(requestorPtr);
+ } else {
+ requestedImages[missingImage].emplace(requestorPtr);
+ requestor.addPendingRequest(missingImage);
}
- requestedImages[missingImage].emplace(requestorPtr);
- requestor.addPendingRequest(missingImage);
auto removePendingRequests = [this, missingImage] {
auto existingRequest = requestedImages.find(missingImage);
diff --git a/test/renderer/image_manager.test.cpp b/test/renderer/image_manager.test.cpp
index 20c0a3a7f3..d1d0a83c44 100644
--- a/test/renderer/image_manager.test.cpp
+++ b/test/renderer/image_manager.test.cpp
@@ -187,20 +187,14 @@ TEST(ImageManager, OnStyleImageMissingBeforeSpriteLoaded) {
EXPECT_EQ(observer.count, 1);
ASSERT_TRUE(notified);
- // Repeated request of the same image shall not result another
- // `ImageManagerObserver.onStyleImageMissing()` call.
- imageManager.getImages(requestor, std::make_pair(dependencies, ++imageCorrelationID));
- runLoop.runOnce();
-
- EXPECT_EQ(observer.count, 1);
-
// Request for updated dependencies must be dispatched to the
// observer.
dependencies.emplace("post", ImageType::Icon);
imageManager.getImages(requestor, std::make_pair(dependencies, ++imageCorrelationID));
- runLoop.runOnce();
+ ASSERT_TRUE(requestor.hasPendingRequests());
- EXPECT_EQ(observer.count, 2);
+ runLoop.runOnce();
+ ASSERT_FALSE(requestor.hasPendingRequests());
// Another requestor shall not have pending requests for already obtained images.
StubImageRequestor anotherRequestor(imageManager);