Scenekit:添加几个对象后,对象变得不可见(Objective-C)

时间:2016-09-09 23:11:28

标签: objective-c calayer scenekit scnnode catextlayer

我正在使用SceneKit构建游戏。它基于SCNBoxes,可以添加和删除。最后,根节点添加了30个框。

// Prepare Surface Layer for Blocks
    self.colorOfBlock = [CALayer layer];
    self.colorOfBlock.frame = CGRectMake(0, 0, 1000, 1000);
    self.colorOfBlock.backgroundColor = [UIColor colorWithHue:0 saturation:1 brightness:1 alpha:1].CGColor;

    self.textLayer = [CATextLayer layer];
    self.textLayer.frame = self.colorOfBlock.bounds;
    self.textLayer.fontSize = 750;//self.colorOfBlock.bounds.size.height;
    self.textLayer.string = @"2";
    self.textLayer.alignmentMode = kCAAlignmentCenter;
    self.textLayer.foregroundColor = [UIColor blackColor].CGColor;

    [self.textLayer display];
    [self.colorOfBlock addSublayer:self.textLayer];

    // Prepare Material for the Block
    SCNMaterial *material = [SCNMaterial material];
    material.diffuse.contents = self.colorOfBlock;

    // Create the Block
    self.blockNode = [SCNNode node];
    self.blockNode.geometry = [SCNBox boxWithWidth:0.95 height:0.95 length:0.95 chamferRadius:0.1];
    self.blockNode.geometry.firstMaterial = material;
    self.blockNode.position = position;

    // Setup the physics body
    self.blockNode.physicsBody = [SCNPhysicsBody dynamicBody];
    self.blockNode.physicsBody.affectedByGravity = NO;
    self.blockNode.physicsBody.categoryBitMask = CollisionCategoryBlock;
    self.blockNode.physicsBody.contactTestBitMask = CollisionCategoryBorder | CollisionCategoryBlock;
    self.blockNode.physicsBody.collisionBitMask = CollisionCategoryBorder | CollisionCategoryBlock;
    self.blockNode.physicsBody.angularVelocityFactor = SCNVector3Make(0, 0, 0);

    [self addChildNode:self.blockNode];

    self.gameValue = 2;
    if (position.z < 1) {
        self.name = @"Front";
    } else {
        self.name = @"Back";
    }

一段时间后,textLayer似乎消失了。如果添加了新块,则它们不再具有textLayer。另一个副作用是现有块上的旧textleay不再更新。

在下一步中,新添加的块变得不可见。或者更好的说 - 他们永远不会得到一个CALayer。但物理团体仍在工作。

有时视图会崩溃。调试器表示无法找到崩溃区域的位置。在此之后,视图变形。但我仍然可以调用清除视图的SCNActions,并显示所有创建的对象,这些对象不像我发布的那样。这些街区完全被踢出了视野。

顺便说一下,当我为这些块设置“phonglighttype”时,这种窃听级联发生得更早。

还有一件事我注意到了。当我退出应用程序(从iPhone 5测试)并在一段时间后再次选中时,

self.gameView.showsStatistics = YES;

在GPU栏上显示蓝线。 2或3秒后,蓝色条消失,全绿色GPU条显示已准备好使用。一切都像它应该做的那样。过了一会儿,这些块再次变得不可见。如果我再次选中并重新标记,则会再次显示新添加的块。

不知怎的,我想到我在发送应用程序崩溃之前发送了垃圾邮件。但Xcode没有任何有用的提示。我想知道清除viewControllers缓存的选项是否可以解决这个问题 - 如果有这个选项。

亲切的问候

1 个答案:

答案 0 :(得分:0)

我没有完全解决它,但我决定用常见的

替换CALayer和CATextLayer的每一部分
material.diffuse.contents = [arrayOfTextures objectAtIndex:certainImage];

具有更高的分辨率(如Iphone 6所示),它确实显示CALayer导致某种图形故障。但是简单的预制图像(来自imageArray)解决方案可以提高性能并防止崩溃。

我无法确定是否有办法用CALayer方法解决它。但是将图像作为材质加载并更新它们会带来最令人满意的结果。