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

Commit

Permalink
[core] Render::clearData clears fonts
Browse files Browse the repository at this point in the history
  • Loading branch information
pozdnyakov committed Mar 19, 2020
1 parent 765f725 commit af8d4a1
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 23 deletions.
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

- [core] Add Renderer::clearData() ([#16323](https://github.com/mapbox/mapbox-gl-native/pull/16323))

The newly added `Renderer::clearData()` method allows to clear render data and thus save memory and make sure outdated tiles are not shown.
The newly added `Renderer::clearData()` method allows to clear render data and thus save memory and make sure outdated tiles are not shown. It clears data more agressively than `Renderer::reduceMemoryUse()` does, as it clears not only the cache but all orchestration data, including the data used by the currently rendered frame.

## maps-v1.4.1

Expand Down
1 change: 1 addition & 0 deletions src/mbgl/renderer/render_orchestrator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -709,6 +709,7 @@ void RenderOrchestrator::clearData() {
if (!patternAtlas->isEmpty()) patternAtlas = std::make_unique<PatternAtlas>();

imageManager->clear();
glyphManager->evict(fontStacks(*layerImpls));
}

void RenderOrchestrator::onGlyphsError(const FontStack& fontStack, const GlyphRange& glyphRange, std::exception_ptr error) {
Expand Down
46 changes: 24 additions & 22 deletions test/map/map.test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1349,42 +1349,44 @@ TEST(Map, TEST_REQUIRES_SERVER(ExpiredSpriteSheet)) {
}

namespace {
constexpr auto styleJSON = R"STYLE({
"sources": {
"a": { "type": "vector", "tiles": [ "a/{z}/{x}/{y}" ] }
},
"layers": [{
"id": "a",
"type": "fill",
"source": "a",
"source-layer": "a"
}]
})STYLE";

int requestsCount = 0;
auto makeResponse(const std::string& file, bool incrementCounter = false) {
return [file, incrementCounter](const Resource&) {
if (incrementCounter) ++requestsCount;
Response result;
result.data = std::make_shared<std::string>(util::read_file("test/fixtures/resources/" + file));
return result;
};
}

} // namespace

TEST(Map, KeepRenderData) {
MapTest<> test;
int requestsCount = 0;
test.fileSource->tileResponse = [&](const Resource&) {
++requestsCount;
Response res;
res.noContent = true;
return res;
};

test.fileSource->tileResponse = makeResponse("vector.tile", true);
test.fileSource->glyphsResponse = makeResponse("glyphs.pbf", true);
// The resources below belong to style and requested on style re-load.
test.fileSource->styleResponse = makeResponse("style_vector.json");
test.fileSource->sourceResponse = makeResponse("source_vector.json");
test.fileSource->spriteJSONResponse = makeResponse("sprite.json");
test.fileSource->spriteImageResponse = makeResponse("sprite.png");

test.map.jumpTo(CameraOptions().withZoom(10));
test.map.getStyle().loadURL("mapbox://streets");
const int iterations = 3;
const int resourcesCount = 4 /*tiles*/ + 3 /*fonts*/;
// Keep render data.
for (int i = 1; i <= iterations; ++i) {
test.map.getStyle().loadJSON(styleJSON);
test.frontend.render(test.map);
EXPECT_EQ(4, requestsCount);
EXPECT_EQ(resourcesCount, requestsCount);
}
requestsCount = 0;
// Clear render data.
for (int i = 1; i <= iterations; ++i) {
test.frontend.getRenderer()->clearData();
test.map.getStyle().loadJSON(styleJSON);
test.frontend.render(test.map);
EXPECT_EQ(4 * i, requestsCount);
EXPECT_EQ(resourcesCount * i, requestsCount);
}
}

0 comments on commit af8d4a1

Please sign in to comment.