2016-09-09 5 views
0

SceneKit으로 게임을 만들고 있습니다. 추가 및 제거되는 SCNBoxes를 기반으로합니다. 끝에 30 개의 상자가 루트 노드에 추가됩니다.Scenekit : 여러 객체가 추가 된 후에 객체가 보이지 않습니다. (Objective-C)

// 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가 없습니다. 또 다른 부작용은 기존 블록의 오래된 textLayers가 더 이상 업데이트되지 않는다는 것입니다.

다음 단계에서 새로 추가 된 블록이 보이지 않게됩니다. 또는 말할 것도없이 - 그들은 CALayer를 얻지 못합니다. 하지만 물리학은 아직 작동 중입니다.

때때로보기가 충돌합니다. 디버거는 충돌 영역의 위치를 ​​찾을 수없는 것과 같은 것을 말합니다. 이 후에보기가 변형됩니다. 그러나 뷰를 지우고 게시 된 것처럼 이러한 블록이 아닌 모든 생성 된 개체를 표시하는 SCNActions를 호출 할 수도 있습니다. 이 블록들은 완전히보기에서 쫓겨납니다.

그런데이 블록에 대해 "phonglighttype"을 설정할 때이 도청 폭포가 일찍 발생합니다.

내가 눈치 챈 것이 한 가지 더 있습니다. 앱 중 I 탭 (아이폰 5에서 테스트)와 GPU 줄 파란색 줄에, 잠시 후 다시에

self.gameView.showsStatistics = YES; 

쇼를 탭합니다. 2 ~ 3 초 후 파란색 막대가 사라지고 녹색의 GPU 막대가 사용 준비가되었음을 나타냅니다. 그리고 모든 것은 그것이해야하는 것처럼 작동합니다. 잠시 후이 블록들은 다시 보이지 않게됩니다. 탭 아웃하고 다시 탭하면 새로 추가 된 블록이 다시 표시됩니다.

어쨌든 나는 앱 크래시가 발생할 때까지 내 장치 캐시를 스팸하고 있다고 생각합니다. 그러나 Xcode에서 유용한 힌트는 없습니다. viewControllers 캐시를 지우는 옵션이이 문제를 해결할 수 있는지 궁금합니다.

친절 감사

답변

0
이 한 나는 완전히 해결되지 않았다, 그러나 나는 (아이폰 6가 같은) 더 높은 해상도로 일반적인

material.diffuse.contents = [arrayOfTextures objectAtIndex:certainImage]; 

와의 CALayer 및 CATextLayer의 모든 부품을 교체하기로 결정

CALayer가 일종의 그래픽 오류를 유발하고 있음을 보여줍니다. 그러나 간단한 미리 작업 한 이미지 (imageArray의) 솔루션은 성능을 거의 향상시키고 충돌을 방지합니다.

CALayer 방식으로 해결할 방법이 없는지 확실하게 말할 수 없습니다. 그러나 이미지를 소재로로드하고 업데이트하면 가장 만족스러운 결과를 얻었습니다.