私のアプリは標準のUINavigationViewControllerを使用しています。UINavigationViewControllerの重いSceneKitシーンがdeallocに時間がかかりすぎます
ユーザは、ある時点で、SceneKitシーンを示すViewControllerにナビゲートしています。
このシーンは約6000のジオメトリを持ち、各ジオメトリには独自のマテリアルがあるため(このようにする必要があります)、非常に重いメモリです。
前のviewControllerに戻るためにユーザーがトップバーの戻るボタンをクリックすると、アプリケーションは現在のView Controllerを正しくポップし、下のものを表示します。
しかし、約4秒間、表示された新しいViewControllerのUIがフリーズします。
私は楽器時間プロファイラを使用している、と私はそれらの4秒の大部分は、これらのSceneKit方法によって取られていることを見ることができます:
- [NSConcreteMapTable countByEnumeratingWithState:オブジェクト:カウント:]
- [SCNMetalResourceManager _geometryWillDie:]
- [SCNMetalResourceManager _materialWillDie:]
ように多くの幾何学的形状や材料があるので、それは理にかなっています。
SceneKitのパースペクティブ(解除が速くなる)またはUINavigationViewControllerのパースペクティブ(多分シーンが発生するのを強制的に強制する)のどちらかで、重いシーンが解放されている間にUIがブロックされないように、別のスレッド?)。
感謝。私はオプション1を試しましたが、何が起こるかは、4秒間のUIのフリーズが、ポップ・オフ・アニメーションの後ではなく、その前に起こるということです。つまり、コンテンツのUIAnimationControllerアニメーションとは関係がないようです。私はまた、現在のViewControllerから離れずに重いシーンを新しい空のシーンに設定しようとしましたが、UIもブロックされます。だから私はどうにかして主スレッド上で割り振り解除が起こっていると思う。また、私は "enumerateObjectsUsingBlock"を使用して、すべてのノードのジオメトリをゼロにして、UIもブロックしてみました。 –
他のオプションを試しましたか?重いシーンへの参照を保持して、直前のView Controllerに行くときに直ちに割り当てを解除しないようにしました。移行が完了した後でのみ、バックグラウンドスレッドにnilに設定します。私はまた、より現実的な新しいソリューションを追加しました。上記の答えで**オプション3 **を参照してください。 – Sulevus
こんにちは@Sulevus、はい、前のView Controllerの重いシーンへの参照を維持するのはやりました。あなたの答えに多くの感謝! –