2017-09-15 1 views
22

J'ai donc converti mon projet pour utiliser Swift 4 dans Xcode 9, et j'ai commencé à tester mon application. C'est une grosse application avec quatre onglets distincts, et presque tout fonctionne comme prévu. L'un des onglets est une carte, en utilisant GoogleMaps. Je n'ai jamais eu aucun problème avec cela, mais lorsqu'il est construit avec Xcode 9 et montré dans le simulateur, il utilise sur 100% du processeur lors du déplacement de la carte, et il est très lent. Voici le navigateur de débogage lors de l'exécution sur un simulateur. Nous effectuons un dessin personnalisé, mais pas un dessin de 102%.GoogleMaps sur simulateur dans Xcode 9 utilise plus de 100% du CPU lors du déplacement de la carte

CPU usage

Cela ne commencé à se produire après avoir mis à jour à 9 Xcode et Swift 4. Lors du débogage dans Xcode 9 sur un iPhone 7, 8 ou X simulateur, tous avec iOS 11, il va un peu plus 100% CPU, et il arrête complètement l'interface utilisateur de mise à jour pendant environ une seconde chaque fois que je tente de le déplacer. Je commence le drag-gesture, mais l'interface utilisateur ne se met à jour qu'une fois par seconde. En me donnant environ 1fps.

Cependant, lors du débogage dans Xcode 9 sur un iPhone 6 simulateur avec iOS 9, il obtient jusqu'à ~ 90% lors du déplacement de la carte et non à la traîne presque autant. Je devine que je reçois environ 20-30 fps ici. (Cela peut être le même que si je recevais des simulateurs sur Xcode 8. La carte n'a jamais été vraiment fluide sur le simulateur ..)

Lors de l'exécution sur un appareil réel (iPhone 7, iOS 11), le processeur utilise environ 40% lorsque vous bougez constamment la carte, et fonctionne très lisse sans aucun retard (60fps).

Je reçois aussi cela dans la sortie dès que j'ouvre l'onglet avec la carte, mais je pense qu'il est hors de propos à cette question particulière:

Main Thread Checker: UI API called on a background thread: -[UIApplication applicationState] 
PID: *****, TID: *******, Thread name: com.google.Maps.LabelingBehavior, Queue name: com.apple.root.default-qos.overcommit, QoS: 21 

Cela dit que les appels GoogleMapsAPI [UIApplication applicationState] sur un fil d'arrière-plan. J'utilise la dernière version de GoogleMaps: 2.4.0. Pour autant que je sache, cette version peut ne pas supporter Xcode 9/Swift 4 etc, mais je ne trouve rien sur une nouvelle version.

+0

Je pense que vous devriez poser cette question sur les formes de développement Google aussi . Parce qu'ils pourraient nous donner une réponse de battue à nous. –

+0

@AbuUlHassan J'y ai pensé, mais ils indiquent sur leur page de support pour GoogleMapsAPI que StackOverflow et ces tags personnalisés (google-maps) sont surveillés par plusieurs membres de l'équipe GoogleMapsAPI, et nous encouragent à l'utiliser (https: // developers.google.com/maps/documentation/ios-sdk/support) Je n'aime vraiment pas leur problème de suivi de toute façon .. – Sti

+0

@Sti Avez-vous testé dans le vrai appareil? – Aznix

Répondre

17

Mise à jour: Ce problème est résolu dans Xcode 9.1 beta 2

Il y a un bogue dans OpenGLES.framework qui lui fait sauter le chargement du JIT LLVM et revenir à l'interprétation des shaders. Cela a un impact sévère sur les performances du simulateur car il est entièrement rendu par un logiciel OpenGL (ceci inclut CoreAnimation, SceneKit, etc.).

éditer: Pour clarifier, les symptômes sont exactement ce que vous décrivez: 100% ou plus d'utilisation du processeur et < 1fps de rendu. Cela affecte le SDK Google Maps et MapKit. En guise de solution de contournement temporaire, vous pouvez copier libCoreVMClient.dylib de la version bêta 3 dans le Xcode 9 GM et rétablir les performances de ce qu'il était auparavant. Cela doit être fait pour chaque plate-forme d'exécution séparément.

Pour iOS il se trouve à l'adresse: Xcode[-beta].app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/OpenGLES.framework/libCoreVMClient.dylib

Pour tvOS il se trouve à l'adresse: Xcode[-beta].app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/tvOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/OpenGLES.framework/libCoreVMClient.dylib

Pour watchos il se trouve à l'adresse: Xcode[-beta].app/Contents/Developer/Platforms/WatchOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/watchOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/OpenGLES.framework/libCoreVMClient.dylib

+0

Je suis encore un peu confus ... est-ce que ce bug a un impact sur les vrais appareils, ou seulement sur le simulateur? Je comprends qu'il n'utilise pas 100% CPU sur le périphérique réel, mais cela a-t-il un impact? Et si j'utilise le dylib de b3 - puis compiler et construire et exporter mon application sur AppStore, cette construction serait-elle différente de celle d'une compilation utilisant le GM-dylib? Je ne suis pas tout à fait sûr de quel type de fichier il s'agit, et je suis réticent à l'éteindre en cas d'effets secondaires imprévus. – Sti

+1

Ce bogue n'affecte pas les performances de l'appareil. Le remplacement de dylib n'affecte pas ce qui est généré ou envoyé au magasin d'applications. C'est purement dans l'exécution de Simulator. Vous pouvez également télécharger et utiliser le runtime iOS 10.3 (qui n'a pas ce bug) avec Xcode 9. – russbishop

+0

Bonne réponse mais où pouvons-nous télécharger l'ancien fichier? Un téléchargement serait très apprécié. –