【问题标题】:High CPU usage SceneKit高 CPU 使用率 SceneKit
【发布时间】:2016-08-11 20:34:49
【问题描述】:

当我显示来自COLLADA 文件的节点时,CPU 使用率上升到 100%+。
Link to pic

我没有使用模拟器,我使用的是我的实际手机。该模型由大约 80k 个顶点组成。

这是我加载模型的方式:

// Add Character
func addModel(name:String)
{
    // Load COLLADA Model
    if let myScene = SCNScene(named: "Assets.scnassets/"+name+"/"+name+".dae")
    {
        // Recurse through all the child nodes in the model and add to modelNode
        for node in myScene.rootNode.childNodes as [SCNNode]
        {
            modelNode.addChildNode(node)
        }

        // Add modelNode to scene
        self.rootNode.addChildNode(modelNode)
    }
    else
    {
        print("Error loading model: "+name)
    }
}

型号为 122MB,可在此处找到:
Link to zip

我尝试过使用不同的型号,但每个型号的 CPU 都发疯了。它们都是大约 122MB(听起来很大)和大约 80k 个顶点。

更新
试图降低 SceneKit 中的多边形数量。在搅拌机中,我将顶点从 20k 降低到 5k (see here)。但是当我在 SceneKit 中加载模型时,多边形数仍然相同(68k)。我还尝试将模型和动画转换为 .SCN。这导致文件大小大大变小,但多边形数量和 CPU 使用率相同
Pictures of showStatistics

我认为我需要做的是降低多边形数量,而不是降低文件大小(但不要认为那会有害)。

更新 2 现在我实际上设法将多边形数量降低到大约 48k。仍然落后。如果我删除纹理,CPU 会低得多。

【问题讨论】:

    标签: swift scenekit


    【解决方案1】:

    我不肯定这是您的使用问题,但您加载文件的方法可以简化。

    您无需将 DAE 文件中的每个单独节点添加到您的 modelNode。理想情况下,您的 Collada 模型将拥有自己的具有唯一名称的根节点。只需将该节点添加到modelNode,它的所有子节点都将包括在内。在下面的示例中,lyso_ribbons 是 DAE 中根节点的名称以及 DAE 文件本身的名称。

    guard let lysoRibbons = SCNScene(named: "lyso_ribbons") 
        else { print("Couldn't find molecule in dictionary  (lysoRibbons)")
            return  }
    let modelNode = lysoRibbons.rootNode.childNodeWithName("lyso_ribbons", recursively: false)!
    

    所有与根一起标记的子节点仍然可以通过childNodeWithName 按名称访问。您可以在编辑器窗口中检查 DAE 的场景图,只需在导航面板中单击它,然后在编辑器中单击编辑器窗口左下方的小方块。如果由于某种原因,您的 DAE 模型缺少根节点,您可以在此处创建一个并将所有其他节点移入其中。另见:Transform and Rotate in Scenekit

    您可以在显示您的 DAE 文件的编辑器窗口的左侧面板中创建节点。单击面板左下方的 + 号。将该<untitled> 对象拖到顶部,就在“场景图”下方。然后分组选择所有其他节点并将它们拖到这个新对象中。给新对象一个唯一的名称。您会注意到新节点有一个灰色图标,表示它没有自己的几何形状。

    更好的方法是在创建 Collada 模型时提前计划,使用具有唯一名称的空值将几何节点组织成有意义的子组。然后,空值将作为这些子组的父节点导入。将所有节点放入一个主 null 中,它将成为您模型的根。

    【讨论】:

    • “如果由于某种原因,您的 DAE 模型缺少根节点,您可以在此处创建一个根节点”是什么意思?我没有 dae 文件中所有子节点的父节点。
    • 我已经添加到上面的答案中。如果您自己创建了 DAE,您可能会考虑按照上一段中的建议修改您的建模软件,然后重新保存文件。我不确定这在其他 3-D 软件中是如何工作的,但这是我在 Cinema 4D 中的工作方式。
    • 但这不是我基本上通过将所有子节点添加到父节点(modelNode)来做的吗? modelNode 只包含子节点。
    • 当然,最终结果相同,但是当您可以添加根时,为什么要遍历所有节点?就像我说的那样,这可能无法解决您的问题,但它是一种将您的 DAE 转换为代码的更清洁、更紧凑的方式。如果您的模型只有几个节点但充斥着顶点,那么它可能不会对 CPU 使用率产生影响。但是,您发布了您的加载技术,这就是我关注的重点。
    • 好像对CPU没有影响。如果我加载场景中除模型之外的所有内容,CPU 将保持在
    猜你喜欢
    • 2021-12-09
    • 2014-07-16
    • 2014-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多