高CPU使用率SceneKit

时间:2016-08-09 10:58:54

标签: swift scenekit

当我从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会低得多。

1 个答案:

答案 0 :(得分:2)

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

您不需要将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)!

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

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

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