我尝试将SKEffectNode与CIFilter和子SKSpriteNode结合使用,尽管它似乎可以工作片刻,但结果是所有设备内存都被消耗掉了,而我的iPad Retina(A7 GPU)刚刚重新启动。我有时还会看到打印到调试器日志中的“来自调试器的消息:由于内存问题而终止”。完整的源代码位于github上的SKEffectNodeFiltered。
我正在创建过滤器,如下所示:
// Pixelate CoreImage filter
CIFilter *pixellateFilter = [CIFilter filterWithName:@"CIPixellate"];
[pixellateFilter setDefaults]; // Remember to setDefaults...
[pixellateFilter setValue:@(25.0) forKey:@"inputScale"];
SKEffectNode *effectNode = [[SKEffectNode alloc] init];
effectNode.shouldEnableEffects = TRUE; // enable CoreImage filtering
effectNode.shouldRasterize = FALSE; // generate and then discard tmp framebuffer
effectNode.shouldCenterFilter = TRUE;
effectNode.filter = pixellateFilter;
self.effectNode = effectNode;
[effectNode addChild:background];
[self addChild:effectNode];
effectNode.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
我看了看分配工具,我确实看到了CoreSurface对象的三重缓冲集,但是没有明显的内存泄漏。内存使用量非常大,总计约140 Meg,这很大,但这正在测试使用最大4096x4096(这是最大纹理大小)的非常大的输入图像。这里发生了什么?如果我不使用过滤器,则性能为60 FPS,并且内存使用没有问题。