gpt4 book ai didi

ios - UINavigationViewController 中的大量 SceneKit 场景需要很长时间才能解除分配

转载 作者:行者123 更新时间:2023-12-01 22:23:23 25 4
gpt4 key购买 nike

我的应用程序使用标准 UINavigationViewController。

在某些时候,用户已导航到显示 SceneKit 场景的 ViewController。

这个场景的内存非常重,因为它有大约 6000 个几何图形,并且每个几何图形都有自己的 Material (必须这样)。

当用户单击顶部栏的后退按钮以返回上一个 viewController 时,应用程序会正确弹出当前 View Controller 并显示下面的一个。

然而,大约 4 秒后,显示的新 ViewController 的 UI 卡住。

我使用了 Instruments Time Profiler,我可以看到这 4 秒的很大一部分是由这些 SceneKit 方法占用的:

-[NSConcreteMapTable countByEnumeratingWithState:objects:count:]

-[SCNMetalResourceManager _geometryWillDie:]

-[SCNMetalResourceManager _materialWillDie:]

这是有道理的,因为有很多几何形状和 Material 。

我该如何解决这种情况,以便在释放繁重的场景时不会阻塞 UI,无论是从 SceneKit 角度(使释放更快)还是从 UINavigationViewController 角度(可能强制场景的释放在单独的线程中发生? )。

最佳答案

我的理解是 SceneKit 使用它自己的后台线程来工作,所以它不应该阻塞主线程。

主线程的阻塞可能与 UINavigationController 动画化内容有关。我在尝试为 SCNViews/SCNScenes 设置动画时遇到了问题,看起来 SceneKit 和 CoreAnimation 不能很好地协作。

我在这里没有完整的上下文,但我可以建议几件事供您测试:

  • 您可以尝试使用重场景设置 SCNView 的场景属性 scnView.scene = [SCNScene scene];在弹出带有场景的 View Controller 之前到一个新的空场景,以便动画不涉及繁重的场景,并且 SceneKit 在其背景威胁中正确地释放它。
  • 您可以尝试在 View Controller 中保持对沉重场景的强烈引用准备场景繁重的有问题的 View Controller 。

    然后当后者弹出并返回到它下面的那个时,弹出的 View Controller 及其所有内容都应该已释放,除了沉重的场景,您将获得对它的引用。

    在这里您可以尝试设置为零(在动画完成后),它可能会在 SceneKit 后台线程上正确释放。

    如果没有,可以先全部删除heavyScene.rootNode子节点、 Action 等,然后解除分配。

    如果这仍然不起作用,您可以先尝试使用递归函数逐个遍历所有节点,然后先将其几何体/ Material 归零,然后再释放场景本身。
  • 使用渲染循环 -renderer:updateAtTime:在几帧(不到一秒)内删除节点的方法。然后你可以确定 SceneKit 会按照设计的方式处理它们。

    您将必须检测用户何时按下 UINavigationController“后退按钮”并且带有繁重场景的 VC 被弹出。然后结束,比如说 20 帧(60fps 时为 1/3 秒),在每帧删除 5% 的节点,所以仍然会有一个短暂的延迟,但 1/3 秒,希望不明显。

    可以通过覆盖其 didMoveToParentViewController: 来检测弹出的 VC。方法并检查 nil作为 parent 传递范围。

  • 例如。
    - (void)didMoveToParentViewController:(UIViewController *)parent {

    if (!parent) {
    // work that should be done when VC is being removed from parent
    // maybe set a counter in the VC being popped off to
    // count down from 20 to 0, -1 at each -update call
    }
    }

    关于ios - UINavigationViewController 中的大量 SceneKit 场景需要很长时间才能解除分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43553312/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com