From 3f445e8578b25dbe4adccacd59f317cbb3b9a8d7 Mon Sep 17 00:00:00 2001 From: "Thiago Marcos P. Santos" Date: Thu, 7 May 2015 16:09:15 +0300 Subject: [PATCH] Do not process partial tiles if no new resources have arrived Partial tiles are now only processed again when there is a new resource available. If we don't have new resources - like new glyphs - the end result of the reparsing is the same, because no new SymbolBuckets would are created. In my tests debugging with PowerTOP, this patch drops the CPU utilization during the sampling period from 100ms/s to 40ms/s. The improvements on slow connections (i.e. more time waiting for resources) are even more noticeable. --- src/mbgl/map/resource_loader.cpp | 8 +++++++- src/mbgl/map/resource_loader.hpp | 2 ++ src/mbgl/map/source.cpp | 6 ++++-- src/mbgl/map/source.hpp | 3 ++- 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/mbgl/map/resource_loader.cpp b/src/mbgl/map/resource_loader.cpp index 0f5c33abd..46b7af9a2 100644 --- a/src/mbgl/map/resource_loader.cpp +++ b/src/mbgl/map/resource_loader.cpp @@ -85,11 +85,15 @@ void ResourceLoader::update(MapData& data, for (const auto& source : style_->sources) { source->update(data, transform, *style_, glyphAtlas, *glyphStore_, - spriteAtlas, sprite_, texturePool); + spriteAtlas, sprite_, texturePool, shouldReparsePartialTiles_); } + + shouldReparsePartialTiles_ = false; } void ResourceLoader::onGlyphRangeLoaded() { + shouldReparsePartialTiles_ = true; + emitTileDataChanged(); } @@ -102,6 +106,8 @@ void ResourceLoader::onTileLoaded() { } void ResourceLoader::onSpriteLoaded() { + shouldReparsePartialTiles_ = true; + emitTileDataChanged(); } diff --git a/src/mbgl/map/resource_loader.hpp b/src/mbgl/map/resource_loader.hpp index 6f63fe226..cf73db5fa 100644 --- a/src/mbgl/map/resource_loader.hpp +++ b/src/mbgl/map/resource_loader.hpp @@ -73,6 +73,8 @@ public: private: void emitTileDataChanged(); + bool shouldReparsePartialTiles_ = false; + std::string accessToken_; util::ptr sprite_; diff --git a/src/mbgl/map/source.cpp b/src/mbgl/map/source.cpp index 686b15c24..501dde5c2 100644 --- a/src/mbgl/map/source.cpp +++ b/src/mbgl/map/source.cpp @@ -384,7 +384,8 @@ void Source::update(MapData& data, GlyphStore& glyphStore, SpriteAtlas& spriteAtlas, util::ptr sprite, - TexturePool& texturePool) { + TexturePool& texturePool, + bool shouldReparsePartialTiles) { if (!loaded || data.getAnimationTime() <= updated) { return; } @@ -407,7 +408,8 @@ void Source::update(MapData& data, switch (state) { case TileData::State::partial: - handlePartialTile(id, style.workers); + if (shouldReparsePartialTiles) + handlePartialTile(id, style.workers); break; case TileData::State::invalid: state = addTile(data, transformState, style, glyphAtlas, glyphStore, diff --git a/src/mbgl/map/source.hpp b/src/mbgl/map/source.hpp index 15cc8a817..d5f4f8b5d 100644 --- a/src/mbgl/map/source.hpp +++ b/src/mbgl/map/source.hpp @@ -75,7 +75,8 @@ public: GlyphStore&, SpriteAtlas&, util::ptr, - TexturePool&); + TexturePool&, + bool shouldReparsePartialTiles); void invalidateTiles(const std::vector&);