2016-08-09 5 views
1

Когда я показываю узел из файла COLLADA, использование ЦП достигает 100% +.
Link to picВысокое использование ЦП SceneKit

Я не использую тренажер, я использую мой реального телефона. Модель состоит из примерно 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 идет гайки на каждом из них. Все они около 122 МБ (что звучит много) и около 80 тыс. Вершин.

Обновление
Пытались снизить количество поли в SceneKit. В блендере i опускаются вершины от 20k до 5k (see here). Но когда я загружаю модель в SceneKit, количество полисов остается неизменным (68k). Я также попытался преобразовать модель и анимацию в .SCN. Это привело к тому, что намного более низкий размер файла, однако такой же поли счет и использование ЦП.
Pictures of showStatistics

Я думаю, что мне нужно сделать, это уменьшить количество полисов, не столько размер файла (не думайте, что это навредило бы).

Обновление 2 Теперь мне удалось снизить количество полисов до примерно 48 тыс. Все еще отстает. Если я удалю текстуру, процессор будет намного ниже.

ответ

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)! 

Все дочерние узлы, помеченные вместе с корнем все еще доступны по имени через childNodeWithName. Вы можете проверить граф сцены DAE в окне редактора, просто нажмите на нее на панели навигации и в редакторе щелкните по маленькому квадрату слева внизу окна редактора. Если по какой-то причине ваша модель DAE не имеет корневого узла, вы можете создать ее здесь и переместить в нее все остальные узлы. См. Также: Transform and Rotate in Scenekit

Вы можете создать узлы в левой панели окна редактора, отображающие ваш DAE-файл. Нажмите на знак +, расположенный чуть ниже слева от панели. Перетащите объект <untitled> на верх, как раз под «График сцены». Затем группа - выберите все остальные узлы и перетащите их в этот новый объект. Дайте новому объекту уникальное имя. Вы заметите, что новый узел имеет значок серого цвета, означающий, что он не имеет собственной геометрии.

Лучший способ сделать это - планировать будущее при создании модели Collada с использованием нулей с уникальными именами для организации ваших узлов геометрии в значимых подгруппах. Затем нули будут импортированы как родительские узлы этих подгрупп. Поместите все узлы в один главный нуль, который станет корнем для вашей модели.

+0

Где вы имели в виду «Если по какой-то причине ваша модель DAE не имеет корневого узла, вы можете создать один здесь **»? У меня нет родительского узла для всех дочерних элементов dae-файла. – Fredrik

+0

Я добавил к ответу выше. Если вы создали DAE самостоятельно, вы можете рассмотреть возможность пересмотра в своем программном обеспечении моделирования, как это предложено в последнем абзаце, и повторное сохранение файла. Я не уверен, как это работает в другом трехмерном программном обеспечении, но я так и делаю это в Cinema 4D. – bpedit

+0

Но разве это не то, что я в основном делаю, добавляя все дети к родительскому (modelNode)? ** modelNode ** содержит только детей. – Fredrik

Смежные вопросы