2015-11-09 3 views
9

Итак, я использую SceneKit для рендеринга коллекции параметрических поверхностей (сумма которых создает объект). Чтобы поместить их на экран, я создаю настраиваемые геометрии, пробирая точки и создавая треугольники. Вот краткий обзор того, как я это делаю.Ускорение рендеринга в SceneKit

Loop through the collection of surfaces 
    Generate a random color C 
    For each surface calculate a grid of N x N points (both positions and normals) 
    Assign all vertexes for that surface the color C 
    Add groups of 3 vertexes from this surface to the face index list 

И это похоже на работу. После того, как я получаю все эти данные, я делаю его в соответствующие структуры (SCNGeometrySource и SCNGeometryElement) и сделать SCNGeometry как так

SCNGeometry(sources: [vertexSource, normalSource, colorSource], elements: [element]) 

Это работает и отображает мои поверхности на экране штрафа в качестве одного элемента геометрии. Моя проблема в том, что у меня есть некоторые очень сложные объекты, с которыми я пытаюсь работать, и он просто работает очень медленно, чтобы перемещать камеру вокруг, глядя на объект. Рендеринг занимает около 500 мс. Который делает мою частоту кадров и переживает ужасно.

Итак, вопрос в том, какие шаги я могу предпринять, чтобы ускорить работу SceneKit? Я сделал этот же проект с WebGL, используя Three.js с таким же объемом данных и смог использовать камеру с орбитальной камерой, поэтому я не могу поверить, что набор сюжетов не мог по крайней мере конкурировать с этим. Какие функции я могу настроить и отключить, чтобы ускорить работу? Я использую примитивный тип треугольника, allowCameraControl = true для орбитальной камеры и металл для SCNView.

Для тех, кому интересно, модель, с которой я борюсь, генерирует 231,900 вершин и 347,850 индексов для лиц (11,1312 МБ данных вершин (положение и нормаль) и 1,3914 Мб данных лица (по существу, просто позиции индекса вершин для треугольников .))

+0

На iPad 3 или ранее это приближается к пределам вершин. Добавьте к этому, однако, большую скорость заполнения, которую вы используете, и вы, вероятно, будете изо всех сил пытаться получить 60 кадров в секунду, но не должны быть далеко. 500 мс действительно ненормально. – Confused

+1

Мои старые 4-х используются для обработки таких чисел со скоростью 20 кадров в секунду или около того. Ваш псевдо-код кажется прекрасным, вот как я создаю свою геометрию. В разное время я получал индексы, испорченные, что приводило к гранью беспорядка на экране. Это действительно поразило бы частоту кадров, я отложил ее на шейдер фрагмента, чтобы сделать намного больше работы. Я бы дважды проверял сетку, возможно, сделал ее полупрозрачной и включил каркас 'svnView.debugOptions = .ShowWireframe'. – lock

+0

Как изменить скорость заполнения вручную? – Red

ответ

3

1) Если вы находитесь «стоя» в центре вашей сгенерированной поверхности, то ваша проблема может быть связана с тем, что вы рисуете много экранов (не отбраковываете усечки), и вам нужно разделить ваш суфракт (единственный узел) на подповерхности (дочерние узлы), поэтому выводятся только узлы, которые видны в пространстве просмотра камеры.

Это, как говорится, 231,900 вершин на самом деле не так много, я рисую несколько миллионеров на 60 кадров в секунду с помощью рендерера SceneKit Metal (на 20% быстрее, чем с помощью рендеринга OpenGL) на OSX.

2) Если вы смотрите на свои поверхности с расстояния и имеете плохую производительность, проверьте, какое количество bytesPerComponent: вы кормите при создании SCNGeometrySource. Я столкнулся с большим снижением производительности при использовании CGFloat (double) вместо простого float на GeForce GTX (хотя и на интегрированной графике Intel).

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