SKEffectNode
SKEffectNode
возразите представляет его дочерние элементы в буфере и дополнительно применяет Базовый фильтр Изображения к этому представленному выводу. Используйте узлы эффекта, чтобы включить сложные специальные эффекты в сцену или кэшировать содержание статического поддерева для более быстрой производительности рендеринга.
Каждый раз, когда новый кадр представляется с помощью узла эффекта, узел эффекта выполняет эти шаги:
Узел эффекта вовлекает свои дочерние элементы в частный кадровый буфер.
Это применяет Базовый Эффект изображений к частному кадровому буферу. Этот этап является дополнительным; посмотрите
filter
иshouldEnableEffects
свойства.Это смешивает содержание своего частного кадрового буфера в кадровый буфер его родителя, с помощью одного из стандартных режимов смешивания спрайта.
Это отбрасывает свой частный кадровый буфер. Этот шаг является дополнительным; посмотрите
shouldRasterize
свойство.
Пример: применение специального эффекта
Одно возможное применение для узлов эффекта должно применить специальные эффекты к дочерним элементам узла, как показано на рисунке 1. В этом примере дочерние элементы узла эффекта являются двумя спрайтами, предоставляющими информацию освещения. Узел эффекта накапливает эффекты этих световых сигналов, применяет фильтр размытия для смягчения получающегося изображения, и затем использует умножить режим смешивания для применения этого освещения к стенной текстуре.
Вот то, как сцена генерирует этот эффект освещения:
Сцена имеет два дочерних элемента. Первым является текстурированный спрайт, представляющий землю. Вторым является узел эффекта для применения освещения.
self.lightingNode = [[SKEffectNode alloc] init];
Дочерние элементы узла эффекта являются представленным использованием узлов спрайта аддитивного режима смешивания.
SKSpriteNode *light = [SKSpriteNode spriteNodeWithTexture:lightTexture];
light.blendMode = SKBlendModeAdd;
...
[self.lightingNode addChild: light];
Узел эффекта включает эффект фильтра смягчить освещение.
- (CIFilter *)blurFilter { CIFilter *filter = [CIFilter filterWithName:@"CIBoxBlur"]; // 3 [filter setDefaults]; [filter setValue:[NSNumber numberWithFloat:20] forKey:@"inputRadius"]; return filter; }
self.lightingNode.filter = [self blurFilter];
При указании Базового фильтра Изображения это должен быть фильтр, берущий единственное входное изображение и производящий единственное выходное изображение.
Узел эффекта использует режим смешивания умножения для применения его эффекта освещения к кадровому буферу сцены.
self.lightingNode.blendMode = SKBlendModeMultiply;
Сцены являются узлами эффекта
SKScene
класс является подклассом SKEffectNode
. Это означает, что любая сцена может применить фильтр к своему содержанию. Несмотря на то, что применение фильтров может быть очень дорогим — не, все фильтры хорошо разработаны для интерактивных эффектов — экспериментирование может помочь Вам найти некоторые интересные способы использовать их.
Кэширование может улучшить производительность статического содержания
Узел эффекта обычно отбрасывает свой частный кадровый буфер после того, как рендеринг будет завершен. Рендеринг содержания необходим, потому что это обычно изменяет каждый кадр. Однако, если содержание статично, это является ненужным. Могло бы иметь больше смысла сохранять представленный кадровый буфер вместо того, чтобы отбросить его. Если содержание узла эффекта статично, установите узел shouldRasterize
свойство к YES
true
. Установка этого свойства вызывает следующие изменения в поведении:
Кадровый буфер не отбрасывается в конце растеризации. Это также означает, что больше памяти используется узлом эффекта, и рендеринг может взять немного дольше.
Когда новый кадр представляется, кадровый буфер представляется, только если изменилось содержание потомков узла эффекта.
Если узел эффекта имеет Базовый фильтр Изображения, изменения в его свойствах больше автоматически обновляют кадровый буфер. Можно вынудить его быть обновленным путем установки
shouldRasterize
свойство кNO
false
.
Можно использовать узлы эффекта для кэширования статического содержания, даже когда Вы не применяете фильтр к представленному изображению. Когда содержание поддерева является статичным и дорогим для рендеринга, этот метод может быть полезным.
Наследование
-
NSObject
-
NSResponder
-
SKNode
-
SKEffectNode
-
SKScene
-
NSObject
-
NSResponder
-
SKNode
-
SKEffectNode
-
SKScene
Соответствует
-
AnyObject
-
CVarArgType
-
Сопоставимый
-
Hashable
-
NSCoding
-
NSCopying
-
NSObjectProtocol
-
Печатаемый
-
NSCoding
-
NSCopying
-
NSObject
Оператор импорта
Swift
import SpriteKit
Objective C
@import SpriteKit;
Доступность
Доступный в OS X v10.9 и позже.
-
shouldEnableEffects shouldEnableEffects
СвойствоБулево значение, определяющее, применяет ли узел эффекта фильтр к своим дочерним элементам, поскольку они привлечены.
Объявление
Swift
var shouldEnableEffects: Bool
Objective C
@property(nonatomic) BOOL shouldEnableEffects
Обсуждение
Если значение этого свойства
YES
true
, узел эффекта применяет фильтр и смешивает результаты. Если значениеNO
false
, узел эффекта проигнорирован, и его дочерние элементы обычно представляются. Значение по умолчаниюNO
false
.Оператор импорта
Objective C
@import SpriteKit;
Swift
import SpriteKit
Доступность
Доступный в OS X v10.9 и позже.
-
Базовое Изображение фильтрует для применения.
Обсуждение
Базовый фильтр Изображения должен иметь сингл
inputImage
параметр и производит синглoutputImage
параметр. Значение по умолчаниюnil
. Если значениеnil
и узел эффекта включен, никакая фильтрация не имеет место. Однако его дочерние элементы все еще представляются в отдельной передаче и смешиваются к кадровому буферу родителя.Оператор импорта
Objective C
@import SpriteKit;
Swift
import SpriteKit
Доступность
Доступный в OS X v10.9 и позже.
См. также
-
shouldCenterFilter shouldCenterFilter
СвойствоБулево значение, определяющее, устанавливает ли узел эффекта автоматически центр изображения фильтра.
Объявление
Swift
var shouldCenterFilter: Bool
Objective C
@property(nonatomic) BOOL shouldCenterFilter
Обсуждение
Если значение этого свойства
YES
true
и фильтр имеетinputCenter
параметр, узел эффекта автоматически устанавливает входной центр фильтра в источник узла эффекта. Значение по умолчаниюYES
true
.Оператор импорта
Objective C
@import SpriteKit;
Swift
import SpriteKit
Доступность
Доступный в OS X v10.9 и позже.
-
Режим смешивания раньше вовлекал отфильтрованное изображение в кадровый буфер родителя.
Обсуждение
Значение по умолчанию
SKBlendModeAlpha
.Оператор импорта
Objective C
@import SpriteKit;
Swift
import SpriteKit
Доступность
Доступный в OS X v10.9 и позже.
-
Пользовательская программа построения теней, которую вызывают, когда узел эффекта смешивается в кадровый буфер родителя.
Обсуждение
Значение по умолчанию
nil
, подразумевать, что выполняется поведение смешивания значения по умолчанию. Если программа построения теней указана, ее вызывают, когда растеризированное изображение смешивается в кадровый буфер родителя.Оператор импорта
Objective C
@import SpriteKit;
Swift
import SpriteKit
Доступность
Доступный в OS X v10.10 и позже.
-
shouldRasterize shouldRasterize
СвойствоБулево значение, указывающее, должны ли кэшироваться результаты рендеринга дочерних узлов.
Объявление
Swift
var shouldRasterize: Bool
Objective C
@property(nonatomic) BOOL shouldRasterize
Обсуждение
Если значение этого свойства
YES
true
, узел эффекта кэширует отфильтрованное изображение для использования в будущих кадрах. Если значениеNO
false
, тогда Набор Sprite отбрасывает представленное изображение и перерисовывает его с нуля в следующий раз, когда узел представляется. Значение по умолчаниюNO
false
. Кэширование представленного изображения использует больше памяти и может занять больше времени для рендеринга. Однако, если потомки узла эффекта редко изменяются, кэширование может улучшить производительность.Когда кэширование включено, изменения в дочерних триггерных обновлениях узла эффекта до кэшируемого изображения в следующем кадре анимации. Однако изменение свойств фильтра не делает.
Оператор импорта
Objective C
@import SpriteKit;
Swift
import SpriteKit
Доступность
Доступный в OS X v10.9 и позже.