[node, tests] Consolidate headless rendering logic in HeadlessFrontend

This commit is contained in:
John Firebaugh
2017-07-21 16:36:31 -07:00
parent 11933f6ab8
commit 32bd1d54fa
40 changed files with 380 additions and 770 deletions

View File

@@ -3,15 +3,11 @@
#include <mbgl/test/util.hpp>
#include <mbgl/map/map.hpp>
#include <mbgl/renderer/backend_scope.hpp>
#include <mbgl/gl/headless_backend.hpp>
#include <mbgl/gl/offscreen_view.hpp>
#include <mbgl/gl/headless_frontend.hpp>
#include <mbgl/util/default_thread_pool.hpp>
#include <mbgl/util/io.hpp>
#include <mbgl/util/run_loop.hpp>
#include <mbgl/style/style.hpp>
#include <mbgl/renderer/renderer.hpp>
#include <mbgl/test/stub_renderer_frontend.hpp>
#include <algorithm>
#include <iostream>
@@ -38,9 +34,6 @@ public:
}
util::RunLoop runLoop;
HeadlessBackend backend;
BackendScope scope { backend };
OffscreenView view { backend.getContext(), { 512, 512 } };
StubFileSource fileSource;
ThreadPool threadPool { 4 };
@@ -77,30 +70,25 @@ TEST(Memory, Vector) {
MemoryTest test;
float ratio { 2 };
StubRendererFrontend rendererFrontend {
std::make_unique<Renderer>(test.backend, ratio, test.fileSource, test.threadPool),
test.view };
Map map(rendererFrontend, MapObserver::nullObserver(), { 256, 256 }, ratio, test.fileSource,
HeadlessFrontend frontend { { 256, 256 }, ratio, test.fileSource, test.threadPool };
Map map(frontend, MapObserver::nullObserver(), frontend.getSize(), ratio, test.fileSource,
test.threadPool, MapMode::Still);
map.setZoom(16); // more map features
map.getStyle().loadURL("mapbox://streets");
test::render(map, test.view);
frontend.render(map);
}
TEST(Memory, Raster) {
MemoryTest test;
float ratio { 2 };
StubRendererFrontend rendererFrontend {
std::make_unique<Renderer>(test.backend, ratio, test.fileSource, test.threadPool),
test.view };
Map map(rendererFrontend, MapObserver::nullObserver(), { 256, 256 }, ratio, test.fileSource,
HeadlessFrontend frontend { { 256, 256 }, ratio, test.fileSource, test.threadPool };
Map map(frontend, MapObserver::nullObserver(), frontend.getSize(), ratio, test.fileSource,
test.threadPool, MapMode::Still);
map.getStyle().loadURL("mapbox://satellite");
test::render(map, test.view);
frontend.render(map);
}
/**
@@ -127,57 +115,47 @@ TEST(Memory, Footprint) {
if (!shouldRunFootprint()) {
return;
}
MemoryTest test;
float ratio { 2 };
auto renderMap = [&](Map& map, const char* style){
map.setZoom(16);
map.getStyle().loadURL(style);
test::render(map, test.view);
MemoryTest test;
class FrontendAndMap {
public:
FrontendAndMap(MemoryTest& test_, const char* style)
: frontend(Size{ 256, 256 }, 2, test_.fileSource, test_.threadPool)
, map(frontend, MapObserver::nullObserver(), frontend.getSize(), 2, test_.fileSource, test_.threadPool, MapMode::Still) {
map.setZoom(16);
map.getStyle().loadURL(style);
frontend.render(map);
}
HeadlessFrontend frontend;
Map map;
};
// Warm up buffers and cache.
for (unsigned i = 0; i < 10; ++i) {
StubRendererFrontend rendererFrontend {
std::make_unique<Renderer>(test.backend, ratio, test.fileSource, test.threadPool),
test.view };
Map map(rendererFrontend, MapObserver::nullObserver(), { 256, 256 }, ratio, test.fileSource,
test.threadPool, MapMode::Still);
renderMap(map, "mapbox://streets");
renderMap(map, "mapbox://satellite");
};
FrontendAndMap(test, "mapbox://streets");
FrontendAndMap(test, "mapbox://satellite");
}
// Process close callbacks, mostly needed by
// libuv runloop.
test.runLoop.runOnce();
std::vector<std::pair<std::unique_ptr<Map>, std::unique_ptr<RendererFrontend>>> maps;
std::vector<std::unique_ptr<FrontendAndMap>> maps;
unsigned runs = 15;
long vectorInitialRSS = mbgl::test::getCurrentRSS();
for (unsigned i = 0; i < runs; ++i) {
auto frontend = std::make_unique<StubRendererFrontend>(
std::make_unique<Renderer>(test.backend, ratio, test.fileSource, test.threadPool), test.view);
auto vector = std::make_unique<Map>(*frontend, MapObserver::nullObserver(),
Size{ 256, 256 }, ratio, test.fileSource,
test.threadPool, MapMode::Still);
renderMap(*vector, "mapbox://streets");
maps.push_back({std::move(vector), std::move(frontend)});
};
maps.emplace_back(std::make_unique<FrontendAndMap>(test, "mapbox://streets"));
}
double vectorFootprint = (mbgl::test::getCurrentRSS() - vectorInitialRSS) / double(runs);
long rasterInitialRSS = mbgl::test::getCurrentRSS();
for (unsigned i = 0; i < runs; ++i) {
auto frontend = std::make_unique<StubRendererFrontend>(
std::make_unique<Renderer>(test.backend, ratio, test.fileSource, test.threadPool), test.view);
auto raster = std::make_unique<Map>(*frontend, MapObserver::nullObserver(),
Size{ 256, 256 }, ratio, test.fileSource,
test.threadPool, MapMode::Still);
renderMap(*raster, "mapbox://satellite");
maps.push_back({std::move(raster), std::move(frontend)});
};
maps.emplace_back(std::make_unique<FrontendAndMap>(test, "mapbox://satellite"));
}
double rasterFootprint = (mbgl::test::getCurrentRSS() - rasterInitialRSS) / double(runs);