Feature/ios performances (#44)

* improved ios performances

* fix merge issue

* cleanup playground

* update gitignore for playground
This commit is contained in:
Matteo Crippa
2021-03-08 20:44:28 +01:00
committed by GitHub
parent 2fdf124f65
commit 58487a9638
5 changed files with 108 additions and 41 deletions

3
.gitignore vendored
View File

@@ -15,7 +15,10 @@
/cmake-build-debug
/platform/android/build
/platform/android/MapboxGLAndroidSDK/src/main/assets/sdk_versions/com.mapbox.mapboxsdk
/platform/ios/platform/ios/Mapbox.playground/build/
*.code-workspace
.DS_Store
/build
**/.idea
/platform/android/MapboxGLAndroidSDKTestApp/local.properties

BIN
.gitignore.swp Normal file

Binary file not shown.

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1120"
LastUpgradeVersion = "1240"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
@@ -15,7 +15,7 @@
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "DA1DC9491CB6C1C2006E619F"
BuildableName = "Mapbox GL.app"
BuildableName = "MapLibre GL.app"
BlueprintName = "iosapp"
ReferencedContainer = "container:ios.xcodeproj">
</BuildableReference>
@@ -31,7 +31,7 @@
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "DA1DC9491CB6C1C2006E619F"
BuildableName = "Mapbox GL.app"
BuildableName = "MapLibre GL.app"
BlueprintName = "iosapp"
ReferencedContainer = "container:ios.xcodeproj">
</BuildableReference>
@@ -54,7 +54,7 @@
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "DA1DC9491CB6C1C2006E619F"
BuildableName = "Mapbox GL.app"
BuildableName = "MapLibre GL.app"
BlueprintName = "iosapp"
ReferencedContainer = "container:ios.xcodeproj">
</BuildableReference>
@@ -78,7 +78,7 @@
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "DA1DC9491CB6C1C2006E619F"
BuildableName = "Mapbox GL.app"
BuildableName = "MapLibre GL.app"
BlueprintName = "iosapp"
ReferencedContainer = "container:ios.xcodeproj">
</BuildableReference>

View File

@@ -158,6 +158,12 @@ enum { MGLAnnotationTagNotFound = UINT32_MAX };
/// The threshold used to consider when a tilt gesture should start.
const CLLocationDegrees MGLHorizontalTiltToleranceDegrees = 45.0;
/// The time between background snapshot attempts.
const NSTimeInterval MGLBackgroundSnapshotImageInterval = 60.0;
/// The delay after the map has idled before a background snapshot is attempted.
const NSTimeInterval MGLBackgroundSnapshotImageIdleDelay = 3.0;
/// Mapping from an annotation tag to metadata about that annotation, including
/// the annotation itself.
typedef std::unordered_map<MGLAnnotationTag, MGLAnnotationContext> MGLAnnotationTagContextMap;
@@ -1552,23 +1558,27 @@ public:
_displayLink.paused = YES;
[self processPendingBlocks];
if ( ! self.glSnapshotView)
if (self.lastSnapshotImage)
{
self.glSnapshotView = [[UIImageView alloc] initWithFrame: _mbglView->getView().frame];
self.glSnapshotView.autoresizingMask = _mbglView->getView().autoresizingMask;
self.glSnapshotView.contentMode = UIViewContentModeCenter;
[self insertSubview:self.glSnapshotView aboveSubview:_mbglView->getView()];
}
if ( ! self.glSnapshotView)
{
self.glSnapshotView = [[UIImageView alloc] initWithFrame: _mbglView->getView().frame];
self.glSnapshotView.autoresizingMask = _mbglView->getView().autoresizingMask;
self.glSnapshotView.contentMode = UIViewContentModeCenter;
[self insertSubview:self.glSnapshotView aboveSubview:_mbglView->getView()];
}
self.glSnapshotView.image = self.lastSnapshotImage;
self.glSnapshotView.hidden = NO;
self.glSnapshotView.image = self.lastSnapshotImage;
self.glSnapshotView.hidden = NO;
self.glSnapshotView.alpha = 1;
if (self.debugMask && [self.glSnapshotView.subviews count] == 0)
{
UIView *snapshotTint = [[UIView alloc] initWithFrame:self.glSnapshotView.bounds];
snapshotTint.autoresizingMask = self.glSnapshotView.autoresizingMask;
snapshotTint.backgroundColor = [[UIColor redColor] colorWithAlphaComponent:0.25];
[self.glSnapshotView addSubview:snapshotTint];
if (self.debugMask && [self.glSnapshotView.subviews count] == 0)
{
UIView *snapshotTint = [[UIView alloc] initWithFrame:self.glSnapshotView.bounds];
snapshotTint.autoresizingMask = self.glSnapshotView.autoresizingMask;
snapshotTint.backgroundColor = [[UIColor redColor] colorWithAlphaComponent:0.25];
[self.glSnapshotView addSubview:snapshotTint];
}
}
_mbglView->deleteView();
@@ -1586,9 +1596,15 @@ public:
_mbglView->createView();
self.glSnapshotView.hidden = YES;
[self.glSnapshotView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
[UIView transitionWithView:self
duration:0.25
options:UIViewAnimationOptionTransitionCrossDissolve
animations:^{
self.glSnapshotView.hidden = YES;
}
completion:^(BOOL finished) {
[self.glSnapshotView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
}];
_displayLink.paused = NO;
@@ -5946,29 +5962,32 @@ public:
- (void)locationManager:(__unused id<MGLLocationManager>)manager didUpdateHeading:(CLHeading *)newHeading
{
if ( ! _showsUserLocation || self.pan.state == UIGestureRecognizerStateBegan || newHeading.headingAccuracy < 0) return;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {
if ( ! self->_showsUserLocation || self.pan.state == UIGestureRecognizerStateBegan || newHeading.headingAccuracy < 0) return;
self.userLocation.heading = newHeading;
self.userLocation.heading = newHeading;
if (self.showsUserHeadingIndicator || self.userTrackingMode == MGLUserTrackingModeFollowWithHeading)
{
[self updateUserLocationAnnotationView];
}
if (self.showsUserHeadingIndicator || self.userTrackingMode == MGLUserTrackingModeFollowWithHeading)
{
[self updateUserLocationAnnotationView];
}
if ([self.delegate respondsToSelector:@selector(mapView:didUpdateUserLocation:)])
{
[self.delegate mapView:self didUpdateUserLocation:self.userLocation];
if ([self.delegate respondsToSelector:@selector(mapView:didUpdateUserLocation:)])
{
[self.delegate mapView:self didUpdateUserLocation:self.userLocation];
if ( ! _showsUserLocation) return;
}
if (!self->_showsUserLocation) return;
}
CLLocationDirection headingDirection = (newHeading.trueHeading >= 0 ? newHeading.trueHeading : newHeading.magneticHeading);
CLLocationDirection headingDirection = (newHeading.trueHeading >= 0 ? newHeading.trueHeading : newHeading.magneticHeading);
if (headingDirection >= 0 && self.userTrackingMode == MGLUserTrackingModeFollowWithHeading
&& self.userTrackingState != MGLUserTrackingStateBegan)
{
[self _setDirection:headingDirection animated:YES];
}
if (headingDirection >= 0 && self.userTrackingMode == MGLUserTrackingModeFollowWithHeading
&& self.userTrackingState != MGLUserTrackingStateBegan)
{
[self _setDirection:headingDirection animated:YES];
[self updateUserLocationAnnotationView];
}
});
}
- (void)locationManager:(__unused id<MGLLocationManager>)manager didFailWithError:(NSError *)error
@@ -6353,6 +6372,8 @@ public:
}
- (void)mapViewWillStartRenderingFrame {
[self cancelBackgroundSnapshot];
if (!_mbglMap)
{
return;
@@ -6413,6 +6434,8 @@ public:
return;
}
[self queueBackgroundSnapshot];
if ([self.delegate respondsToSelector:@selector(mapViewDidBecomeIdle:)]) {
[self.delegate mapViewDidBecomeIdle:self];
}
@@ -6891,6 +6914,39 @@ public:
return _annotationViewReuseQueueByIdentifier[identifier];
}
#pragma mark - Snapshot image -
- (void)attemptBackgroundSnapshot {
static NSTimeInterval lastSnapshotTime = 0.0;
if ([UIApplication sharedApplication].applicationState != UIApplicationStateActive) {
return;
}
NSTimeInterval now = CACurrentMediaTime();
if (lastSnapshotTime == 0.0 || (now - lastSnapshotTime > MGLBackgroundSnapshotImageInterval)) {
self.lastSnapshotImage = _mbglView->snapshot();
lastSnapshotTime = now;
}
}
- (void)cancelBackgroundSnapshot
{
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(attemptBackgroundSnapshot) object:nil];
}
- (void)queueBackgroundSnapshot {
if ([UIApplication sharedApplication].applicationState != UIApplicationStateActive) {
return;
}
[self cancelBackgroundSnapshot];
[self performSelector:@selector(attemptBackgroundSnapshot)
withObject:nil
afterDelay:MGLBackgroundSnapshotImageIdleDelay];
}
@end
#pragma mark - IBAdditions methods