Skip to content

[Bug]: sustained frame drops during long flyTo zoom-out with projection="globe" (Mapbox 11.24.3) #4290

Description

@feras-rove

Mapbox Version

11.24.3

React Native Version

0.83.6

Platform

iOS

@rnmapbox/maps version

10.3.0

Standalone component to reproduce

import React from 'react';
import {Button, View} from 'react-native';
import {MapView, Camera} from '@rnmapbox/maps';

const NYC = [-74.006, 40.7128];

class BugReportExample extends React.Component {
state = {projection: 'globe'};
camera = React.createRef();

flyOut = () => {
// Projection is committed before the fly so the curvature emerges during
// the zoom-out rather than popping in when the camera lands.
this.setState({projection: 'globe'}, () => {
requestAnimationFrame(() => {
this.camera.current?.setCamera({
centerCoordinate: NYC,
zoomLevel: 1,
pitch: 0,
heading: 0,
animationDuration: 2500,
animationMode: 'flyTo',
});
});
});
};

flyIn = () => {
this.setState({projection: 'mercator'}, () => {
this.camera.current?.setCamera({
centerCoordinate: NYC,
zoomLevel: 13,
pitch: 0,
heading: 0,
animationDuration: 2000,
animationMode: 'flyTo',
});
});
};

render() {
return (
<View style={{flex: 1}}>
<MapView
style={{flex: 1}}
styleURL="mapbox://styles/mapbox/standard"
projection={this.state.projection}>


<View style={{flexDirection: 'row', justifyContent: 'space-around'}}>




);
}
}

export default BugReportExample;

Observed behavior and steps to reproduce

Our app uses a single MapView whose projection toggles between globe and
mercator, driven by programmatic setCamera({animationMode: 'flyTo'}) calls of
2000–2500ms when the user switches tabs.

Steps:

  1. Run the component above on a physical device in a Release build.
  2. Tap "Fly in" to get to mercator zoom 13.
  3. Tap "Fly out" to fly back to globe zoom 1 over 2500ms.

During the zoom-out fly the frame rate drops visibly, and the hitches land at the
same point in the animation on every run rather than appearing at random. Zoom-out
is noticeably worse than zoom-in.

This is not our app's compositing. We stripped the app down behind feature flags
until nothing was rendered above the map, no blur or glass surfaces, no list
content, no overlays, and an opaque tab bar replacing the iOS 26 Liquid Glass one
and the hitches were unchanged in both severity and position.

Expected behavior

A programmatic flyTo should hold the display refresh rate for the duration of the
animation. The camera path is known up front and no user interaction is involved,
so there is nothing to schedule reactively.

Notes / preliminary analysis

Additional links and references

No response

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions