2016-12-01 6 views
4

Есть ли способ добавить наклейки (текстуры) на SCNNode? На данный момент все, что я могу сделать, это создать новый SCNNode с геометрией SCNPlane присвоить текстуру ее рассеянное содержимое и добавить ее в сцену ... Этот подход очень неэффективен.SceneKit Cocoa Добавить наклейки

Я хочу добавить отличительные знаки, которые не будут частью сцены - увеличить производительность игры. , потому что я хочу иметь относительно большое количество отличительных знаков на узле пола.

Возможно, что-то похожее на то, как работают частицы внутри? Или какой-нибудь другой подход к быстрому рисованию изображений.

Я уже пробовал @ Suggestion число rickster в 1

Использование SKEffectNode в качестве буфера в SpriteKit сцене - бросок брызгает в узел эффекта до тех пор, пока он получает до определенного числа детей, затем включите его параметр shouldRasterize, чтобы он не повторно отображал его дочерние элементы (и начать использовать новый узел эффекта для более splatters).

В том же проекте showreel проекта SceneKit - это уже дало хорошие результаты, FPS не отбрасываются, так как 5 минут продолжают играть на сцене, что хорошо.

С надеждой на выполнение предложения # 2 - Я считаю, что это уменьшит время рендеринга 2D-сцены (это довольно большой сейчас).

В этом скриншоте есть 5k отличительные знаки

5k

+1

Вам нужно будет кэшировать самолеты, вручную, в массиве, и найти способ, чтобы привлечь на них, что это эффективно, и поместите их в виде частиц при нуждаются в них, исходя из потребностей и их содержания. Да, как вы говорите, точно так же, как частицы, но система частиц, которая полностью загружена, и готова отображать и поместить SCNPlanes по мере необходимости, когда вам нужно, когда вам нужно ... поэтому нет времени на создание/время создания. – Confused

+0

Я не уверен, что Какао имеет отношение к вашему вопросу. Это может смутить некоторых людей. Наверное, меня смущает. Но я ... – Confused

+0

@Confused Cocoa - ну, я могу просто объединить 2 изображения и присвоить результат как материал -> эффективность = 0 – ColdSteel

ответ

2

Я бы рекомендовал использовать SpriteKit сцену в качестве материала для вашей «брызнула-на» геометрии. Яблоко sample code, который показывает много того, что вы собираетесь здесь:

  1. Сделайте SpriteKit сцену, что это материал для геометрии SceneKit.
  2. Когда что-то в 3D-мире должно сделать брызги, используйте тестовое тестирование для поиска координат текстуры в материале и преобразования их в координаты сцены SpriteKit.
  3. Поместите спрайт в сцену SpriteKit в этом месте, чтобы создать надпись.

Судя по вашему other question, вы, кажется, уже начали движение в этом направлении ... возможно, вам поможет, если вы расскажете больше о проблеме?


Примечание: пример код, который имеет ошибку на прошивке 9/MacOS 10.11 и более поздние версии, который препятствует эффекту брызг.Вы можете работать вокруг него, находя эту строку в AAPLGameViewController.m:

ball.physicsBody.collisionBitMask = ~(0x4); 

и добавьте эту строку после нее:

ball.physicsBody.contactTestBitMask = ~(0x4); 

Вы, вероятно, заметили, что в демо-версии, что через некоторое время, фоторамку скорость начинает падать - все большее количество спрайтов в сцене SpriteKit делает 2D-рендеринг съедающим все больше циклов рендеринга.

enter image description here (Возможно, это проблема, которая побудила ваш other question?)

Есть некоторые способы оптимизации для этого сценария, хотя, даже не имея возможности «скриншот» текстуру. Некоторые мысли для исследования:

  1. Использования SKEffectNode в качестве буфера в SpriteKit сцене - бросок брызгает в узел эффекта до тех пор, пока он получает до определенного числа детей, а затем включите его shouldRasterize варианта, так что он не повторно отрисуйте своих детей (и начните использовать новый узел эффекта для большего количества брызг).

  2. Многое из этого 2D-времени тратится впустую на живописные SK-спрайты, которые не видны, потому что они похоронены под другими спрайтами. (Или, что в основном, похороны, и имеют только несколько пикселей.) Так как ваша, «краска» - это один и тот же цвет, вы можете использовать некоторые простые методы, чтобы разбить сцену SpriteKit на области и решить, когда область была полностью охвачены - в этот момент вы можете удалить все спрайты из этой области, заменить их одним спрайтом «полного покрытия» и прекратить добавлять новые спрайты в этой области. A quadtree может быть хорошим инструментом для использования.

  3. Эффект SceneKit-hit-test для преобразования координат текстуры работает так же хорошо, если вы хотите сделать собственный рисунок с помощью модификаторов шейдеров вместо материала на основе SpriteKit, и вы сможете найти более эффективный способ отслеживание долгосрочного покрытия (возможно, некоторые из трюков в № 3).

  4. Если ваши брызги не происходят слишком часто, вы можете сделать их на процессоре и просто установить новое изображение на материале.

  5. Длинный выстрел из идеи, не идея, если она будет работать или быть производительным: использовать Core Image as an accumulation buffer рисовать брызгает, и делают это в то же MTLTexture, что содержание материала устанавливается в. (willRenderScene обратного вызова Используйте SceneKit для визуализации один раз за кадр.)

+0

У меня есть вопрос о SKScene внутри SCNMaterial - будет ли он игнорировать порядок sublimgs по умолчанию или я должен указать позицию Z для каждого узла? – ColdSteel