そこで、プロジェクトをXcode9でSwift 4を使用するように変換し、アプリのテストを開始しました。これは4つの異なるタブを備えた大きなアプリであり、ほぼすべてが期待どおりに機能しています。1つタブの一部はGoogleMapsを使用したマップです。問題はありませんでしたが、Xcode 9でビルドしてシミュレーターに表示すると、over100%CPUを使用します。マップを移動すると、非常に遅れます。シミュレーターで実行する場合のデバッグナビゲーターは次のとおりです。カスタム描画を行いますが、102%の価値のある描画は行いません。
これは、Xcode9とSwift 4に更新した後にのみ発生し始めました。iPhone7、8、またはXシミュレーターでXcode 9でデバッグする場合、すべてiOS11では、CPUが100%をわずかに超え、移動しようとするたびにUIの更新が約1秒間完全に停止します。ドラッグジェスチャを開始しますが、UIは1秒に1回しか更新されません。 1fpsについて教えてください。
ただし、iPhone 6シミュレーターとiOS 9でXcode9をデバッグする場合)、マップを移動すると最大90%になり、遅れはほとんどありません。ここでは約20〜30fpsになると思います。 (これは、Xcode 8のシミュレーターで取得するのと同じfpsである可能性があります。マップは、シミュレーターで実際にスムーズになったことはありません。)
実際のデバイス(iPhone 7、iOS 11)で実行している場合、CPUは常にマップを移動するときに約40%を使用し、ラグがまったくなく(60fps)非常にスムーズに動作します。
マップのタブを開くとすぐにこれも出力に表示されますが、この特定の質問とは無関係だと思います。
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
これは、GoogleMapsAPIがバックグラウンドスレッドで[UIApplication applicationState]
を呼び出すことを意味します。
最新バージョンのGoogleMapsを使用しています:2.4.0。私の知る限り、このバージョンはXcode 9/Swift 4などをサポートしていない可能性がありますが、新しいバージョンについては何も見つかりません。
更新:この問題はXcode9.1ベータ2で修正されています
OpenGLES.framework
にバグがあり、LLVM JITのロードをスキップして、シェーダーの解釈にフォールバックします。これは、完全にソフトウェアでレンダリングされたOpenGL(CoreAnimation、SceneKitなどを含む)であるため、シミュレーターのパフォーマンスに深刻な影響を及ぼします。
編集:明確にするために、これの症状はまさにあなたが説明しているものです:100%以上のCPU使用率と<1fpsのレンダリング。これは、Google MapsSDKとMapKitに影響します。
一時的な回避策として、libCoreVMClient.dylib
をベータ3からXcode9 GMにコピーすると、パフォーマンスが以前の状態に復元されます。これは、プラットフォームランタイムごとに個別に実行する必要があります。
IOSの場合、これは次の場所にあります: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
TvOSの場合、これは次の場所にあります: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
WatchOSの場合、これは次の場所にあります: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