0

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 がなくなります。もう 1 つの副作用は、既存のブロックの古い textLayers が更新されなくなることです。

次のステップでは、新しく追加されたブロックが見えなくなります。または、より良い言い方をすれば、CALayer を取得することはありません。しかし、physicsBodies はまだ機能しています。

また、ビューがクラッシュすることもあります。デバッガーは、クラッシュ領域の位置のようなものを見つけることができないと言います。この後、ビューが変形されます。しかし、ビューをクリアし、投稿したようなこれらのブロックではないすべての作成済みオブジェクトを表示する SCNActions を呼び出すことはできます。これらのブロックは、ビューから完全に追い出されます。

ちなみに、これらのブロックに「phonglighttype」をセットアップすると、このバグカスケードが以前に発生します。

また、もう一つ気になったことがあります。アプリからタブで移動し (iPhone 5 でテスト済み)、しばらくしてから再びタブで移動すると、

self.gameView.showsStatistics = YES;

GPU バーに青い線が表示されます。2 ~ 3 秒後、青色のバーが消え、完全な緑色の GPU バーが使用できる状態になったことを示します。そして、すべてが正常に機能します。しばらくすると、これらのブロックは再び見えなくなります。タブアウトしてもう一度タブインすると、新しく追加されたブロックが再び表示されます。

どういうわけか、アプリがクラッシュするまでデバイスのキャッシュをスパムしていると思います。しかし、Xcode からの有用なヒントはありません。viewControllers キャッシュをクリアするオプションがこの問題を解決するかどうか疑問に思います-これにオプションがある場合。

敬具

4

1 に答える 1

0

完全に解決したわけではありませんが、CALayer と CATextLayer のすべての部分を共通のものに置き換えることにしました。

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

より高い解像度 (Iphone 6 のように) では、CALayer が何らかのグラフィック障害を引き起こしていることがわかりました。しかし、単純な作業済みイメージ (imageArray からの) ソリューションは、パフォーマンスを大幅に改善し、クラッシュを防ぎます。

CALayer のアプローチで解決する方法がないと、一概には言えません。しかし、画像をマテリアルとして読み込んで更新すると、最も満足のいく結果が得られました。

于 2016-09-13T00:29:20.597 に答える