我在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只是忽略了我的报告。
答案 0 :(得分:0)
我发现的一件事是,在SceneKit中使用overlaySKScene会导致很多这样的随机崩溃。还要注意,将SKScene用作overlaySKScene时,从操作进行回调的操作不在主线程上(而在用作独立场景时则为回调)。
我的解决方案是使用普通的SKScene。只需将SKView添加为SCNScene的子视图,然后调用presentScene以正常方式使用SKScene。那为我停止了崩溃。