Skip to content
This repository has been archived by the owner on Aug 8, 2023. It is now read-only.

Commit

Permalink
[core] Fix excessive onSpriteLoaded() notifications
Browse files Browse the repository at this point in the history
What happened:

The excessive `onSpriteLoaded()` notifications were caused by the trick inside `OnlineFileRequest::completed()` implemenation,
which causes receving of two file source updates pointing to the *same* data in case the network response is `notModified` and
the local storage has the sprite sheet already stored inside.

In the SpriteLoader` implementation, it resulted in 2 extra `parseSprite()` calls and 2 extra `onSpriteLoaded()` notifications.

Then, the excessive `onSpriteLoaded()` notifications affected style images and all the unnecessarily added image dupes (btw,
the amount of these dupes `= 2 * number of style images`) were treated by the `RenderOrchestrator` as *updated* images.

Further, `RenderOrchestrator` called `ImageManager::updateImage()` for the updated images and the `ImageManager` populated the
`updatedImageVersions` map.

Finally, at every frame all the geometry tiles iterated through the `updatedImageVersions` to check whether their uploaded
textures needed patching.

All the mentioned above had a negative performance impact.

The fix:

Now, `SpriteLoader` sends `onSpriteLoaded()` notifications only if the data in the file source response is different comparing
to the existing one.
  • Loading branch information
pozdnyakov authored and alexshalamov committed Feb 12, 2020
1 parent efb7dd0 commit 80cb054
Showing 1 changed file with 4 additions and 4 deletions.
8 changes: 4 additions & 4 deletions src/mbgl/sprite/sprite_loader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -58,9 +58,9 @@ void SpriteLoader::load(const std::string& url, FileSource& fileSource) {
} else if (res.noContent) {
loader->json = std::make_shared<std::string>();
emitSpriteLoadedIfComplete();
} else {
} else if (loader->json != res.data) { // They can be equal, see OnlineFileRequest::completed().
// Only trigger a sprite loaded event we got new data.
loader->json = res.data;
loader->json = std::move(res.data);
emitSpriteLoadedIfComplete();
}
});
Expand All @@ -73,8 +73,8 @@ void SpriteLoader::load(const std::string& url, FileSource& fileSource) {
} else if (res.noContent) {
loader->image = std::make_shared<std::string>();
emitSpriteLoadedIfComplete();
} else {
loader->image = res.data;
} else if (loader->image != res.data) { // They can be equal - see OnlineFileRequest::completed().
loader->image = std::move(res.data);
emitSpriteLoadedIfComplete();
}
});
Expand Down

0 comments on commit 80cb054

Please sign in to comment.