Feature/ios performances (#44)
* improved ios performances * fix merge issue * cleanup playground * update gitignore for playground
This commit is contained in:
3
.gitignore
vendored
3
.gitignore
vendored
@@ -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
BIN
.gitignore.swp
Normal file
Binary file not shown.
@@ -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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user