Sprite kit SpriteKit textureFromNode返回黑色图像

Sprite kit SpriteKit textureFromNode返回黑色图像,sprite-kit,Sprite Kit,以下是示例代码: SKNode* node = [SKNode node]; node.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame)); [self addChild: node]; SKSpriteNode *sprite1 = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship"]; sprite

以下是示例代码:

    SKNode* node = [SKNode node];
    node.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
    [self addChild: node];

    SKSpriteNode *sprite1 = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship"];
    sprite1.position = CGPointMake(-900.0, -900.0);
    [node addChild: sprite1];

    SKSpriteNode *sprite2 = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship"];
    sprite2.position = CGPointMake(900.0, 900.0);
    [node addChild: sprite2];        

    [self runAction: [SKAction sequence: @[[SKAction waitForDuration: 3.0], [SKAction runBlock:^{

        SKTexture* texture = [self.view textureFromNode: node];
        SKSpriteNode* ts = [SKSpriteNode spriteNodeWithTexture: texture];
        ts.xScale = 1.0 / [UIScreen mainScreen].scale;
        ts.yScale = 1.0 / [UIScreen mainScreen].scale;
        [self addChild: ts];
    }]]]];

一旦我将两个精灵彼此相距较远,使容器节点的累积帧变大,我就会得到黑色纹理?

此方法生成的纹理大小基于场景坐标中节点的大小,而不是它所占据屏幕的像素大小。因此,如果节点占用10000x1000场景空间,此方法将尝试生成10000x1000纹理。这违反了4096x4096最大纹理大小限制,该方法返回黑色纹理,而不是失败

可以通过在调用textureFromNode之前将节点向下缩放,然后在调用之后将其向上缩放来控制生成的纹理的大小。例如:

//paintNode is 1000x1000 in scene coordinates
self.paintNode.setScale(0.5)
let texture = SKView().texture(from: self.paintNode)
//texture size is 500x500
self.paintNode.setScale(1)

当试图避免4096x4096限制时,考虑设备的比例系数也很重要。在比例因子为3(视网膜高清)的iPhone 6 plus上,大小为500x500px的SKTexture内部将为1500x1500px。我尝试为1600宽的场景生成纹理。除了高清视网膜设备外,它在所有设备上都能正常工作。为大于1365的场景空间生成的任何纹理都会导致黑色纹理。1365 x 3=4095,刚好低于4096x4096的最大值。

距离有多远?纹理的最大大小为2048x2048点。如果累积帧大于此值,则可能根本无法创建纹理。检查textureFromNode:是否返回nil。最大纹理大小实际上取决于设备,大多数当前ios设备可以处理4096,请参阅设备特定限制的详细概述: