From 6532438fe47bca1af690779ffa7292d6f1080d0c Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Fri, 26 Jun 2015 15:10:15 -0700 Subject: [PATCH] Rationalize *RenderingMap notifications --- include/mbgl/ios/MGLMapView.h | 6 +++++ include/mbgl/map/map.hpp | 9 ++++++++ include/mbgl/map/view.hpp | 9 +++++--- ios/benchmark/MBXBenchViewController.mm | 2 +- platform/ios/MGLMapView.mm | 30 +++++++++++++++---------- src/mbgl/map/map.cpp | 22 ++++++++++++++++-- 6 files changed, 60 insertions(+), 18 deletions(-) diff --git a/include/mbgl/ios/MGLMapView.h b/include/mbgl/ios/MGLMapView.h index 346bb6225..918f521a8 100644 --- a/include/mbgl/ios/MGLMapView.h +++ b/include/mbgl/ios/MGLMapView.h @@ -418,6 +418,12 @@ IB_DESIGNABLE // TODO - (void)mapViewDidFinishRenderingMap:(MGLMapView *)mapView fullyRendered:(BOOL)fullyRendered; +// TODO +- (void)mapViewWillStartRenderingFrame:(MGLMapView *)mapView; + +// TODO +- (void)mapViewDidFinishRenderingFrame:(MGLMapView *)mapView fullyRendered:(BOOL)fullyRendered; + #pragma mark - Tracking the User Location /** @name Tracking the User Location */ diff --git a/include/mbgl/map/map.hpp b/include/mbgl/map/map.hpp index 59f23fe2b..e1dd4671b 100644 --- a/include/mbgl/map/map.hpp +++ b/include/mbgl/map/map.hpp @@ -156,9 +156,18 @@ public: bool isFullyLoaded() const; private: + View& view; const std::unique_ptr transform; const std::unique_ptr data; const std::unique_ptr> context; + + enum class RenderState { + never, + partial, + fully + }; + + RenderState renderState = RenderState::never; bool paused = false; }; diff --git a/include/mbgl/map/view.hpp b/include/mbgl/map/view.hpp index e3b0810c4..575d0df01 100644 --- a/include/mbgl/map/view.hpp +++ b/include/mbgl/map/view.hpp @@ -20,9 +20,12 @@ enum MapChange : uint8_t { MapChangeWillStartLoadingMap = 5, MapChangeDidFinishLoadingMap = 6, MapChangeDidFailLoadingMap = 7, - MapChangeWillStartRenderingMap = 8, - MapChangeDidFinishRenderingMap = 9, - MapChangeDidFinishRenderingMapFullyRendered = 10 + MapChangeWillStartRenderingFrame = 8, + MapChangeDidFinishRenderingFrame = 9, + MapChangeDidFinishRenderingFrameFullyRendered = 10, + MapChangeWillStartRenderingMap = 11, + MapChangeDidFinishRenderingMap = 12, + MapChangeDidFinishRenderingMapFullyRendered = 13, }; class View { diff --git a/ios/benchmark/MBXBenchViewController.mm b/ios/benchmark/MBXBenchViewController.mm index 8883ebff0..86b4ec9cb 100644 --- a/ios/benchmark/MBXBenchViewController.mm +++ b/ios/benchmark/MBXBenchViewController.mm @@ -88,7 +88,7 @@ static const int benchmarkDuration = 200; // frames } } -- (void)mapViewDidFinishRenderingMap:(MGLMapView *)mapView fullyRendered:(__unused BOOL)fullyRendered +- (void)mapViewDidFinishRenderingFrame:(MGLMapView *)mapView fullyRendered:(__unused BOOL)fullyRendered { if (state == State::Benchmarking) { diff --git a/platform/ios/MGLMapView.mm b/platform/ios/MGLMapView.mm index 378388a21..4957a0329 100644 --- a/platform/ios/MGLMapView.mm +++ b/platform/ios/MGLMapView.mm @@ -669,8 +669,6 @@ std::chrono::steady_clock::duration secondsAsDuration(float duration) { if ( ! self.isDormant) { - [self notifyMapChange:@(mbgl::MapChangeWillStartRenderingMap)]; - _mbglMap->resize(rect.size.width, rect.size.height, view.contentScaleFactor); CGFloat zoomFactor = _mbglMap->getMaxZoom() - _mbglMap->getMinZoom() + 1; @@ -684,8 +682,6 @@ std::chrono::steady_clock::duration secondsAsDuration(float duration) _mbglMap->setSourceTileCacheSize(cacheSize); _mbglMap->renderSync(); - - [self notifyMapChange:@(mbgl::MapChangeDidFinishRenderingMap)]; } } @@ -2561,18 +2557,28 @@ CLLocationCoordinate2D MGLLocationCoordinate2DFromLatLng(mbgl::LatLng latLng) break; } case mbgl::MapChangeDidFinishRenderingMap: - { - if ([self.delegate respondsToSelector:@selector(mapViewDidFinishRenderingMap:fullyRendered:)]) - { - [self.delegate mapViewDidFinishRenderingMap:self fullyRendered:NO]; - } - break; - } case mbgl::MapChangeDidFinishRenderingMapFullyRendered: { if ([self.delegate respondsToSelector:@selector(mapViewDidFinishRenderingMap:fullyRendered:)]) { - [self.delegate mapViewDidFinishRenderingMap:self fullyRendered:YES]; + [self.delegate mapViewDidFinishRenderingMap:self fullyRendered:(change == mbgl::MapChangeDidFinishRenderingMapFullyRendered)]; + } + break; + } + case mbgl::MapChangeWillStartRenderingFrame: + { + if ([self.delegate respondsToSelector:@selector(mapViewWillStartRenderingFrame:)]) + { + [self.delegate mapViewWillStartRenderingFrame:self]; + } + break; + } + case mbgl::MapChangeDidFinishRenderingFrame: + case mbgl::MapChangeDidFinishRenderingFrameFullyRendered: + { + if ([self.delegate respondsToSelector:@selector(mapViewDidFinishRenderingFrame:fullyRendered:)]) + { + [self.delegate mapViewDidFinishRenderingFrame:self fullyRendered:(change == mbgl::MapChangeDidFinishRenderingFrameFullyRendered)]; } break; } diff --git a/src/mbgl/map/map.cpp b/src/mbgl/map/map.cpp index c0f7e953a..91017d89c 100644 --- a/src/mbgl/map/map.cpp +++ b/src/mbgl/map/map.cpp @@ -12,8 +12,9 @@ namespace mbgl { -Map::Map(View& view, FileSource& fileSource, MapMode mode) - : transform(std::make_unique(view)), +Map::Map(View& view_, FileSource& fileSource, MapMode mode) + : view(view_), + transform(std::make_unique(view)), data(std::make_unique(mode)), context(std::make_unique>(util::ThreadContext{"Map", util::ThreadType::Map, util::ThreadPriority::Regular}, view, fileSource, *data)) { @@ -46,9 +47,26 @@ void Map::renderStill(StillImageCallback callback) { } void Map::renderSync() { + if (renderState == RenderState::never) { + view.notifyMapChange(MapChangeWillStartRenderingMap); + } + + view.notifyMapChange(MapChangeWillStartRenderingFrame); + MapContext::RenderResult result = context->invokeSync(&MapContext::renderSync, transform->getState()); + view.notifyMapChange(result.fullyLoaded ? + MapChangeDidFinishRenderingFrameFullyRendered : + MapChangeDidFinishRenderingFrame); + + if (!result.fullyLoaded) { + renderState = RenderState::partial; + } else if (renderState != RenderState::fully) { + renderState = RenderState::fully; + view.notifyMapChange(MapChangeDidFinishRenderingMapFullyRendered); + } + if (transform->needsTransition()) { update(Update(transform->updateTransitions(Clock::now()))); } else if (result.needsRerender) {