From ffd378c68e3bb47917468872cad03be7295e33fe Mon Sep 17 00:00:00 2001 From: Mikhail Pozdnyakov Date: Thu, 5 Dec 2019 17:46:41 +0200 Subject: [core] Simplify placement code path for still and tile modes --- src/mbgl/renderer/render_orchestrator.cpp | 39 ++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 11 deletions(-) (limited to 'src/mbgl/renderer') diff --git a/src/mbgl/renderer/render_orchestrator.cpp b/src/mbgl/renderer/render_orchestrator.cpp index e13a439ae4..1b689cf82f 100644 --- a/src/mbgl/renderer/render_orchestrator.cpp +++ b/src/mbgl/renderer/render_orchestrator.cpp @@ -377,21 +377,17 @@ std::unique_ptr RenderOrchestrator::createRenderTree(const UpdatePar } // Symbol placement. bool symbolBucketsChanged = false; - { - if (!isMapModeContinuous) { - // TODO: Think about right way for symbol index to handle still rendering - crossTileSymbolIndex.reset(); - } - + if (isMapModeContinuous) { bool symbolBucketsAdded = false; - for (auto it = layersNeedPlacement.rbegin(); it != layersNeedPlacement.rend(); ++it) { - auto result = crossTileSymbolIndex.addLayer(*it, updateParameters.transformState.getLatLng().longitude()); + for (auto it = layersNeedPlacement.crbegin(); it != layersNeedPlacement.crend(); ++it) { + auto result = crossTileSymbolIndex.addLayer(*it, updateParameters.transformState.getLatLng().longitude()); symbolBucketsAdded = symbolBucketsAdded || (result & CrossTileSymbolIndex::AddLayerResult::BucketsAdded); symbolBucketsChanged = symbolBucketsChanged || (result != CrossTileSymbolIndex::AddLayerResult::NoChanges); } // We want new symbols to show up faster, however simple setting `placementChanged` to `true` would // initiate placement too often as new buckets ususally come from several rendered tiles in a row within - // a short period of time. Instead, we squeeze placement update period to coalesce buckets updates from several tiles. + // a short period of time. Instead, we squeeze placement update period to coalesce buckets updates from several + // tiles. optional maximumPlacementUpdatePeriod; if (symbolBucketsAdded) maximumPlacementUpdatePeriod = optional(Milliseconds(30)); renderTreeParameters->placementChanged = !placementController.placementIsRecent( @@ -406,7 +402,7 @@ std::unique_ptr RenderOrchestrator::createRenderTree(const UpdatePar updateParameters.crossSourceCollisions, placementController.getPlacement()); - for (auto it = layersNeedPlacement.rbegin(); it != layersNeedPlacement.rend(); ++it) { + for (auto it = layersNeedPlacement.crbegin(); it != layersNeedPlacement.crend(); ++it) { const RenderLayer& layer = *it; usedSymbolLayers.insert(layer.getID()); placement->placeLayer(layer, renderTreeParameters->transformParams.projMatrix, updateParameters.debugOptions & MapDebugOptions::Collision); @@ -423,9 +419,30 @@ std::unique_ptr RenderOrchestrator::createRenderTree(const UpdatePar } renderTreeParameters->symbolFadeChange = placementController.getPlacement()->symbolFadeChange(updateParameters.timePoint); + renderTreeParameters->needsRepaint = hasTransitions(updateParameters.timePoint); + } else { + crossTileSymbolIndex.reset(); + renderTreeParameters->placementChanged = symbolBucketsChanged = !layersNeedPlacement.empty(); + if (renderTreeParameters->placementChanged) { + Mutable placement = makeMutable(updateParameters.transformState, + updateParameters.mode, + updateParameters.transitionOptions, + updateParameters.crossSourceCollisions, + placementController.getPlacement()); + for (auto it = layersNeedPlacement.crbegin(); it != layersNeedPlacement.crend(); ++it) { + const RenderLayer& layer = *it; + crossTileSymbolIndex.addLayer(layer, updateParameters.transformState.getLatLng().longitude()); + placement->placeLayer(layer, + renderTreeParameters->transformParams.projMatrix, + updateParameters.debugOptions & MapDebugOptions::Collision); + } + placement->commit(updateParameters.timePoint, updateParameters.transformState.getZoom()); + placementController.setPlacement(std::move(placement)); + } + renderTreeParameters->symbolFadeChange = 1.0f; + renderTreeParameters->needsRepaint = false; } - renderTreeParameters->needsRepaint = isMapModeContinuous && hasTransitions(updateParameters.timePoint); if (!renderTreeParameters->needsRepaint && renderTreeParameters->loaded) { // Notify observer about unused images when map is fully loaded // and there are no ongoing transitions. -- cgit v1.2.1