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

Runaway tile downloads, symbol placement when map is tilted with top padding #15163

@1ec5

Description

@1ec5

As of #14664, increasing the camera’s top padding can cause the camera’s focal point to lie lower than the center of the map. This significantly improves the perspective effect, but it also causes excessive detail to be shown toward the top of the map. Adaptive tile coverage (#9037) is still unimplemented, so tiles for the same zoom level get loaded throughout the map and displayed in smaller and smaller cells as you go toward the top of the map.

Here’s a map view displayed full-screen on an iPhone 8 simulator, with the top content inset set to 40% of the view’s height and the left content inset set to half the view’s height. The camera is rotated 258° counterclockwise from north (approximately west-southwest), tilted 60°, and raised about 200 meters above the ground. Tile boundaries are enabled. The top of the map is covered by an inordinate number of tiles:

boundaries

Sometimes, with slightly different rotation and zooming, mbgl hangs because of the sheer amount of symbol placement that needs to happen – many times the amount of symbol placement that would happen with a normal viewport:

#0	0x000000010c939d68 in std::__1::__tree<std::__1::__value_type<std::__1::basic_string<char16_t, std::__1::char_traits<char16_t>, std::__1::allocator<char16_t> >, std::__1::vector<mbgl::IndexedSymbolInstance, std::__1::allocator<mbgl::IndexedSymbolInstance> > >, std::__1::__map_value_compare<std::__1::basic_string<char16_t, std::__1::char_traits<char16_t>, std::__1::allocator<char16_t> >, std::__1::__value_type<std::__1::basic_string<char16_t, std::__1::char_traits<char16_t>, std::__1::allocator<char16_t> >, std::__1::vector<mbgl::IndexedSymbolInstance, std::__1::allocator<mbgl::IndexedSymbolInstance> > >, std::__1::less<std::__1::basic_string<char16_t, std::__1::char_traits<char16_t>, std::__1::allocator<char16_t> > >, true>, std::__1::allocator<std::__1::__value_type<std::__1::basic_string<char16_t, std::__1::char_traits<char16_t>, std::__1::allocator<char16_t> >, std::__1::vector<mbgl::IndexedSymbolInstance, std::__1::allocator<mbgl::IndexedSymbolInstance> > > > >::__root() const at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/__tree:1076
#1	0x000000010c939c89 in std::__1::__tree<std::__1::__value_type<std::__1::basic_string<char16_t, std::__1::char_traits<char16_t>, std::__1::allocator<char16_t> >, std::__1::vector<mbgl::IndexedSymbolInstance, std::__1::allocator<mbgl::IndexedSymbolInstance> > >, std::__1::__map_value_compare<std::__1::basic_string<char16_t, std::__1::char_traits<char16_t>, std::__1::allocator<char16_t> >, std::__1::__value_type<std::__1::basic_string<char16_t, std::__1::char_traits<char16_t>, std::__1::allocator<char16_t> >, std::__1::vector<mbgl::IndexedSymbolInstance, std::__1::allocator<mbgl::IndexedSymbolInstance> > >, std::__1::less<std::__1::basic_string<char16_t, std::__1::char_traits<char16_t>, std::__1::allocator<char16_t> > >, true>, std::__1::allocator<std::__1::__value_type<std::__1::basic_string<char16_t, std::__1::char_traits<char16_t>, std::__1::allocator<char16_t> >, std::__1::vector<mbgl::IndexedSymbolInstance, std::__1::allocator<mbgl::IndexedSymbolInstance> > > > >::~__tree() at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/__tree:1831
#2	0x000000010c939c65 in std::__1::__tree<std::__1::__value_type<std::__1::basic_string<char16_t, std::__1::char_traits<char16_t>, std::__1::allocator<char16_t> >, std::__1::vector<mbgl::IndexedSymbolInstance, std::__1::allocator<mbgl::IndexedSymbolInstance> > >, std::__1::__map_value_compare<std::__1::basic_string<char16_t, std::__1::char_traits<char16_t>, std::__1::allocator<char16_t> >, std::__1::__value_type<std::__1::basic_string<char16_t, std::__1::char_traits<char16_t>, std::__1::allocator<char16_t> >, std::__1::vector<mbgl::IndexedSymbolInstance, std::__1::allocator<mbgl::IndexedSymbolInstance> > >, std::__1::less<std::__1::basic_string<char16_t, std::__1::char_traits<char16_t>, std::__1::allocator<char16_t> > >, true>, std::__1::allocator<std::__1::__value_type<std::__1::basic_string<char16_t, std::__1::char_traits<char16_t>, std::__1::allocator<char16_t> >, std::__1::vector<mbgl::IndexedSymbolInstance, std::__1::allocator<mbgl::IndexedSymbolInstance> > > > >::~__tree() at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/__tree:1828
#3	0x000000010c939c45 in std::__1::map<std::__1::basic_string<char16_t, std::__1::char_traits<char16_t>, std::__1::allocator<char16_t> >, std::__1::vector<mbgl::IndexedSymbolInstance, std::__1::allocator<mbgl::IndexedSymbolInstance> >, std::__1::less<std::__1::basic_string<char16_t, std::__1::char_traits<char16_t>, std::__1::allocator<char16_t> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char16_t, std::__1::char_traits<char16_t>, std::__1::allocator<char16_t> > const, std::__1::vector<mbgl::IndexedSymbolInstance, std::__1::allocator<mbgl::IndexedSymbolInstance> > > > >::~map() at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/__tree:1504
#4	0x000000010c939c25 in std::__1::map<std::__1::basic_string<char16_t, std::__1::char_traits<char16_t>, std::__1::allocator<char16_t> >, std::__1::vector<mbgl::IndexedSymbolInstance, std::__1::allocator<mbgl::IndexedSymbolInstance> >, std::__1::less<std::__1::basic_string<char16_t, std::__1::char_traits<char16_t>, std::__1::allocator<char16_t> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char16_t, std::__1::char_traits<char16_t>, std::__1::allocator<char16_t> > const, std::__1::vector<mbgl::IndexedSymbolInstance, std::__1::allocator<mbgl::IndexedSymbolInstance> > > > >::~map() at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/__tree:1504
#5	0x000000010c939c09 in mbgl::TileLayerIndex::~TileLayerIndex() at /path/to/mapbox-gl-native/src/mbgl/text/cross_tile_symbol_index.hpp:31
#6	0x000000010c939be5 in mbgl::TileLayerIndex::~TileLayerIndex() at /path/to/mapbox-gl-native/src/mbgl/text/cross_tile_symbol_index.hpp:31
#7	0x000000010c939bc9 in std::__1::pair<mbgl::OverscaledTileID const, mbgl::TileLayerIndex>::~pair() at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/utility:314
#8	0x000000010c939ba5 in std::__1::pair<mbgl::OverscaledTileID const, mbgl::TileLayerIndex>::~pair() at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/utility:314
#9	0x000000010c939b89 in void std::__1::allocator_traits<std::__1::allocator<std::__1::__tree_node<std::__1::__value_type<mbgl::OverscaledTileID, mbgl::TileLayerIndex>, void*> > >::__destroy<std::__1::pair<mbgl::OverscaledTileID const, mbgl::TileLayerIndex> >(std::__1::integral_constant<bool, false>, std::__1::allocator<std::__1::__tree_node<std::__1::__value_type<mbgl::OverscaledTileID, mbgl::TileLayerIndex>, void*> >&, std::__1::pair<mbgl::OverscaledTileID const, mbgl::TileLayerIndex>*) at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/memory:1747
#10	0x000000010c939abd in void std::__1::allocator_traits<std::__1::allocator<std::__1::__tree_node<std::__1::__value_type<mbgl::OverscaledTileID, mbgl::TileLayerIndex>, void*> > >::destroy<std::__1::pair<mbgl::OverscaledTileID const, mbgl::TileLayerIndex> >(std::__1::allocator<std::__1::__tree_node<std::__1::__value_type<mbgl::OverscaledTileID, mbgl::TileLayerIndex>, void*> >&, std::__1::pair<mbgl::OverscaledTileID const, mbgl::TileLayerIndex>*) at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/memory:1595
#11	0x000000010c939a2f in std::__1::__tree<std::__1::__value_type<mbgl::OverscaledTileID, mbgl::TileLayerIndex>, std::__1::__map_value_compare<mbgl::OverscaledTileID, std::__1::__value_type<mbgl::OverscaledTileID, mbgl::TileLayerIndex>, std::__1::less<mbgl::OverscaledTileID>, true>, std::__1::allocator<std::__1::__value_type<mbgl::OverscaledTileID, mbgl::TileLayerIndex> > >::destroy(std::__1::__tree_node<std::__1::__value_type<mbgl::OverscaledTileID, mbgl::TileLayerIndex>, void*>*) at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/__tree:1843
#12	0x000000010c9399f4 in std::__1::__tree<std::__1::__value_type<mbgl::OverscaledTileID, mbgl::TileLayerIndex>, std::__1::__map_value_compare<mbgl::OverscaledTileID, std::__1::__value_type<mbgl::OverscaledTileID, mbgl::TileLayerIndex>, std::__1::less<mbgl::OverscaledTileID>, true>, std::__1::allocator<std::__1::__value_type<mbgl::OverscaledTileID, mbgl::TileLayerIndex> > >::destroy(std::__1::__tree_node<std::__1::__value_type<mbgl::OverscaledTileID, mbgl::TileLayerIndex>, void*>*) at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/__tree:1841
#13	0x000000010c9399e3 in std::__1::__tree<std::__1::__value_type<mbgl::OverscaledTileID, mbgl::TileLayerIndex>, std::__1::__map_value_compare<mbgl::OverscaledTileID, std::__1::__value_type<mbgl::OverscaledTileID, mbgl::TileLayerIndex>, std::__1::less<mbgl::OverscaledTileID>, true>, std::__1::allocator<std::__1::__value_type<mbgl::OverscaledTileID, mbgl::TileLayerIndex> > >::destroy(std::__1::__tree_node<std::__1::__value_type<mbgl::OverscaledTileID, mbgl::TileLayerIndex>, void*>*) at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/__tree:1840
#14	0x000000010c9399f4 in std::__1::__tree<std::__1::__value_type<mbgl::OverscaledTileID, mbgl::TileLayerIndex>, std::__1::__map_value_compare<mbgl::OverscaledTileID, std::__1::__value_type<mbgl::OverscaledTileID, mbgl::TileLayerIndex>, std::__1::less<mbgl::OverscaledTileID>, true>, std::__1::allocator<std::__1::__value_type<mbgl::OverscaledTileID, mbgl::TileLayerIndex> > >::destroy(std::__1::__tree_node<std::__1::__value_type<mbgl::OverscaledTileID, mbgl::TileLayerIndex>, void*>*) at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/__tree:1841
#15	0x000000010c9399e3 in std::__1::__tree<std::__1::__value_type<mbgl::OverscaledTileID, mbgl::TileLayerIndex>, std::__1::__map_value_compare<mbgl::OverscaledTileID, std::__1::__value_type<mbgl::OverscaledTileID, mbgl::TileLayerIndex>, std::__1::less<mbgl::OverscaledTileID>, true>, std::__1::allocator<std::__1::__value_type<mbgl::OverscaledTileID, mbgl::TileLayerIndex> > >::destroy(std::__1::__tree_node<std::__1::__value_type<mbgl::OverscaledTileID, mbgl::TileLayerIndex>, void*>*) at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/__tree:1840
#16	0x000000010c9399e3 in std::__1::__tree<std::__1::__value_type<mbgl::OverscaledTileID, mbgl::TileLayerIndex>, std::__1::__map_value_compare<mbgl::OverscaledTileID, std::__1::__value_type<mbgl::OverscaledTileID, mbgl::TileLayerIndex>, std::__1::less<mbgl::OverscaledTileID>, true>, std::__1::allocator<std::__1::__value_type<mbgl::OverscaledTileID, mbgl::TileLayerIndex> > >::destroy(std::__1::__tree_node<std::__1::__value_type<mbgl::OverscaledTileID, mbgl::TileLayerIndex>, void*>*) at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/__tree:1840
#17	0x000000010c9399f4 in std::__1::__tree<std::__1::__value_type<mbgl::OverscaledTileID, mbgl::TileLayerIndex>, std::__1::__map_value_compare<mbgl::OverscaledTileID, std::__1::__value_type<mbgl::OverscaledTileID, mbgl::TileLayerIndex>, std::__1::less<mbgl::OverscaledTileID>, true>, std::__1::allocator<std::__1::__value_type<mbgl::OverscaledTileID, mbgl::TileLayerIndex> > >::destroy(std::__1::__tree_node<std::__1::__value_type<mbgl::OverscaledTileID, mbgl::TileLayerIndex>, void*>*) at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/__tree:1841
#18	0x000000010c9399e3 in std::__1::__tree<std::__1::__value_type<mbgl::OverscaledTileID, mbgl::TileLayerIndex>, std::__1::__map_value_compare<mbgl::OverscaledTileID, std::__1::__value_type<mbgl::OverscaledTileID, mbgl::TileLayerIndex>, std::__1::less<mbgl::OverscaledTileID>, true>, std::__1::allocator<std::__1::__value_type<mbgl::OverscaledTileID, mbgl::TileLayerIndex> > >::destroy(std::__1::__tree_node<std::__1::__value_type<mbgl::OverscaledTileID, mbgl::TileLayerIndex>, void*>*) at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/__tree:1840
#19	0x000000010c9399f4 in std::__1::__tree<std::__1::__value_type<mbgl::OverscaledTileID, mbgl::TileLayerIndex>, std::__1::__map_value_compare<mbgl::OverscaledTileID, std::__1::__value_type<mbgl::OverscaledTileID, mbgl::TileLayerIndex>, std::__1::less<mbgl::OverscaledTileID>, true>, std::__1::allocator<std::__1::__value_type<mbgl::OverscaledTileID, mbgl::TileLayerIndex> > >::destroy(std::__1::__tree_node<std::__1::__value_type<mbgl::OverscaledTileID, mbgl::TileLayerIndex>, void*>*) at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/__tree:1841
#20	0x000000010c9399a5 in std::__1::__tree<std::__1::__value_type<mbgl::OverscaledTileID, mbgl::TileLayerIndex>, std::__1::__map_value_compare<mbgl::OverscaledTileID, std::__1::__value_type<mbgl::OverscaledTileID, mbgl::TileLayerIndex>, std::__1::less<mbgl::OverscaledTileID>, true>, std::__1::allocator<std::__1::__value_type<mbgl::OverscaledTileID, mbgl::TileLayerIndex> > >::~__tree() at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/__tree:1831
#21	0x000000010c939975 in std::__1::__tree<std::__1::__value_type<mbgl::OverscaledTileID, mbgl::TileLayerIndex>, std::__1::__map_value_compare<mbgl::OverscaledTileID, std::__1::__value_type<mbgl::OverscaledTileID, mbgl::TileLayerIndex>, std::__1::less<mbgl::OverscaledTileID>, true>, std::__1::allocator<std::__1::__value_type<mbgl::OverscaledTileID, mbgl::TileLayerIndex> > >::~__tree() at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/__tree:1828
#22	0x000000010c939955 in std::__1::map<mbgl::OverscaledTileID, mbgl::TileLayerIndex, std::__1::less<mbgl::OverscaledTileID>, std::__1::allocator<std::__1::pair<mbgl::OverscaledTileID const, mbgl::TileLayerIndex> > >::~map() at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/__tree:1504
#23	0x000000010c939935 in std::__1::map<mbgl::OverscaledTileID, mbgl::TileLayerIndex, std::__1::less<mbgl::OverscaledTileID>, std::__1::allocator<std::__1::pair<mbgl::OverscaledTileID const, mbgl::TileLayerIndex> > >::~map() at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/__tree:1504
#24	0x000000010cc8d3ba in mbgl::CrossTileSymbolLayerIndex::addBucket(mbgl::OverscaledTileID const&, mbgl::SymbolBucket&, unsigned int&) at /path/to/mapbox-gl-native/src/mbgl/text/cross_tile_symbol_index.cpp:124
#25	0x000000010c7fe8af in mbgl::SymbolBucket::registerAtCrossTileIndex(mbgl::CrossTileSymbolLayerIndex&, mbgl::OverscaledTileID const&, unsigned int&) at /path/to/mapbox-gl-native/src/mbgl/renderer/buckets/symbol_bucket.cpp:248
#26	0x000000010cc8e128 in mbgl::CrossTileSymbolIndex::addLayer(mbgl::RenderLayer const&, float) at /path/to/mapbox-gl-native/src/mbgl/text/cross_tile_symbol_index.cpp:177
#27	0x000000010c9322a6 in mbgl::RenderOrchestrator::createRenderTree(mbgl::UpdateParameters const&) at /path/to/mapbox-gl-native/src/mbgl/renderer/render_orchestrator.cpp:376
#28	0x000000010c9737b0 in mbgl::Renderer::render(mbgl::UpdateParameters const&) at /path/to/mapbox-gl-native/src/mbgl/renderer/renderer.cpp:36
#29	0x000000010c3fee94 in MGLRenderFrontend::render() at /path/to/mapbox-gl-native/platform/darwin/src/MGLRendererFrontend.h:57
#30	0x000000010c3fede5 in ::-[MGLMapView renderSync]() at /path/to/mapbox-gl-native/platform/ios/src/MGLMapView.mm:905
#31	0x000000010c324983 in MGLMapViewImpl::render() at /path/to/mapbox-gl-native/platform/ios/src/MGLMapView+Impl.mm:14
#32	0x000000010c328158 in ::-[MGLMapViewImplDelegate glkView:drawInRect:](GLKView *, CGRect) at /path/to/mapbox-gl-native/platform/ios/src/MGLMapView+OpenGL.mm:26
#33	0x000000011301fffd in -[GLKView _display:] ()
#34	0x000000010c328b45 in MGLMapViewOpenGLImpl::display() at /path/to/mapbox-gl-native/platform/ios/src/MGLMapView+OpenGL.mm:117
#35	0x000000010c400fbb in ::-[MGLMapView updateFromDisplayLink:](CADisplayLink *) at /path/to/mapbox-gl-native/platform/ios/src/MGLMapView.mm:1069

Increasing the top content inset to fully half the view’s height causes mbgl to not even render the top half of the map:

half

half-rotated

This issue could potentially affect a variety of iOS applications. The iOS and macOS map SDKs automatically increase the top content inset by default to accommodate any translucent top bar or toolbar in the same view controller. The issue isn’t acute in iosapp because the top bar there is relatively thin, but navigation applications in particular tend to have larger elements on top, such as a search bar or visual guidance instructions.

/cc @mapbox/gl-core @mapbox/maps-ios @mapbox/navigation-ios

Metadata

Metadata

Assignees

Labels

CoreThe cross-platform C++ core, aka mbglnavigationFor the Mapbox Navigation SDK for Android or iOS or navigation use cases in generalperformanceSpeed, stability, CPU usage, memory usage, or power usage

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions