SpriteKit作为SceneKit的叠加层SKShapeNode Crash

时间:2016-10-29 22:30:57

标签: objective-c sprite-kit scenekit

我在SKOverlayScene中遇到了一个奇怪的崩溃 当我使用SKScene Alone而不是叠加时,我没有同样的崩溃。

这是控制台输出。

修改 如果地址清理程序可用,则不会发生崩溃。

  

malloc: *对象0x610000670e00的错误:无效指针已出列   从免费清单   * 在malloc_error_break中设置断点以进行调试

有人可以帮忙吗?

覆盖下面的SKSceme代码:

- (instancetype)initWithSize:(CGSize)size
{
    if(self = [super initWithSize:size])
    {
        //[self setBackgroundColor:[SKColor greenColor]];

        _selectionNode = [SKShapeNode node]; // iVar
        [_selectionNode setLineWidth:1];
        [_selectionNode setStrokeColor:[SKColor whiteColor]];
        [_selectionNode setFillColor:[SKColor colorWithRed:0.2 green:0.5 blue:1 alpha:0.2]];
        ///[_selectionNode setZPosition:CGFLOAT_MAX-1];
    }
    return self;
}

- (void)mouseDragged:(NSEvent *)theEvent
{
    if(_selectionNode)
    {
        dispatch_async(dispatch_get_main_queue(), ^
        {
            @autoreleasepool
            {
                CGPoint point = [theEvent locationInNode:self];
                CGRect rect = CGRectMake(_selectionOrigin.x, _selectionOrigin.y, point.x - _selectionOrigin.x, point.y - _selectionOrigin.y);

                CGPathRef path = CGPathCreateWithRect(rect, NULL);
                if(path)
                {
                    [_selectionNode setPath:path]; //SIGABRT is sometimes shown here.
                    CGPathRelease(path);
                }
            }
        });
    }
    [super mouseDragged:theEvent];
}

- (void)mouseDown:(NSEvent *)theEvent
{
    if(_selectionNode)
    {
        dispatch_async(dispatch_get_main_queue(), ^
        {
            [self addChild:_selectionNode];
            _selectionOrigin = [theEvent locationInNode:self];
        });
    }

    [super mouseDown:theEvent];
}

- (void)mouseUp:(NSEvent *)theEvent
{
    if(_selectionNode)
    {
        dispatch_async(dispatch_get_main_queue(), ^
        {
            [_selectionNode removeFromParent];
            [_selectionNode setPath:nil];
        });
    }
    [super mouseUp:theEvent];
}

编辑2

在malloc_error_break中设置BreakPoint显示以下内容

  

libsystem_malloc.dylib`malloc_error_break:    - > 0x7fffba83e147< + 0>:pushq%rbp       0x7fffba83e148< + 1>:movq%rsp,%rbp       0x7fffba83e14b< + 4>:nop
      0x7fffba83e14c< + 5>:nopl(%rax)       0x7fffba83e150< + 9>:popq%rbp       0x7fffba83e151< + 10>:retq

每次来自各种线程。

编辑3 使用OpenGL渲染器时不会重新创建崩溃。

但我真的想使用Metal,因为它确实提供了两倍更好的性能,唯一的问题就是这种奇怪的崩溃......我能做些什么吗?

编辑4

我用SKSpriteNode代替SKShapeNode 问题似乎已经解决了。

- 这闻起来像一个Apple Bug:Metal SceneKit + SpriteKit和SKShapeNode。

我不会提交任何错误报告,因为Apple只是忽略了我的报告。

1 个答案:

答案 0 :(得分:0)

我发现的一件事是,在SceneKit中使用overlaySKScene会导致很多这样的随机崩溃。还要注意,将SKScene用作overlaySKScene时,从操作进行回调的操作不在主线程上(而在用作独立场景时则为回调)。

我的解决方案是使用普通的SKScene。只需将SKView添加为SCNScene的子视图,然后调用presentScene以正常方式使用SKScene。那为我停止了崩溃。