2016-09-09 15 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"を設定すると、このバグのカスケードは早く発生します。

もう1つ気がついたことがあります。ときにアプリケーション(iPhone 5からテスト)のうちIタブとGPUバーの

self.gameView.showsStatistics = YES; 

ショーブルーライン、しばらく後に再度タブ付き。 2〜3秒後、青色のバーが消え、完全な緑のGPUバーが使用可能になったことが示されます。そして、それはすべきことのようにすべて機能します。しばらくすると、これらのブロックは再び見えなくなります。タブアウトして再びタブインすると、新しく追加されたブロックが再び表示されます。

何とか私は、アプリケーションがクラッシュするまで私のデバイスキャッシュをスパムしていると思います。しかし、Xcodeからのヒントはありません。 viewControllersキャッシュをクリアするオプションがこの問題を解決できるかどうかは疑問です。

種類よろしく

答えて

0
それがなかった私はそれを完全には解決しませんでしたが、私は(iPhoneの6は持っているように)高い解像度で共通

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

でのCALayerとCATextLayerのすべての部分を交換することを決めた

CALayerがある種のグラフィカルフォールトを引き起こしていたことを示しています。しかし、(imageArrayからの)単純な事前加工済みの画像は、パフォーマンスをかなり向上させ、クラッシュを防止します。

CALayerアプローチで解決する方法がないのかどうかは確信できません。しかし、イメージをマテリアルとして読み込んで更新することは、最も満足のいく結果をもたらしました。

関連する問題