0

全て。私は現在、スプライト キットを使用して iOS ゲームを開発しています。ゲームの仕組みには、スプライトを上から下に無限にスクロールするものが含まれます。

私のゲーム シーンには、上、中、下の 3 つのスプライトしかありません。私は何十ものスプライト画像を持っているので、私の解決策は動的に3つのスプライトを作成することです(スプライトが画面全体を埋めることができるように)。新しいスプライト ノードを作成し、下、中、上のスプライトを交換します。

疑似コード: インターフェイス ファイル内:

 - GameScene:SKScene
 {
      ...
      SKSpriteNode *_topSprite;
      SKSpriteNode *_middleSprite;
      SKSpriteNode *_bottomSprite;
      ...
 }

実装ファイルで:

- (void)update:(CFTimeInterval)currentTime 
{
   // 1 compute time interval


   // 2 update sprite node
    _topSprite.position move down  100*timeInterval
   _middleSprite.position move down  100*timeInterval  
   _bottomSprite.position move down    100*timeInterval 

   // 3 crop the off-screen bottom sprite node
   if (_bottomSprite is offScreen)
   {
       [_bottomSprite removeFromParent]
   }

   // 4 check the highest sprite position visible
   // if the highest position is below the frame top,then create new sprite
   _bottomSprite = _middleSprite;  
   _middleSprite = _topSprite;
   _topSprite    = [self createNewNode]; // random a sprite image 
}

ゲームの fps は 60 で、ノード数は増加していません。すべて問題ないように見えますが、ゲームで突然ショット チョークが発生し、フレームの移動が連続しなくなることがあります。私の直感では、主な原因は手順 4 にあると思いましたが、解決する方法がわかりません。任意の提案をいただければ幸いです。

createNewNode メソッドは次のとおりです。

- (SKSpriteNode *)createNewNode {
    NSString *blockName = [self randomImageName];

    SKSpriteNode *sprite = [[SKSpriteNode alloc] initWithImageNamed:blockName];
    sprite.position = _highestPosition;
    sprite.anchorPoint = CGPointMake(0.5, 0);
    NSLog(@"putAnotherNodeOnTop %@", blockName);
    [self addChild:sprite];
    return sprite;
}
4

1 に答える 1

0

いくつかの提案。

同じ 3 つの画像を使用しているため、毎回スプライトを再作成する必要はありません。hidden 値を YES に設定し、スプライトをどこかに移動し、テクスチャを設定してから、hidden を NO にして再度表示する方がコストがかからないはずです。SpriteKit は非表示のノードや画面外のノードを描画しません。

createNewNode: が呼び出されると、コードは基本的に、更新のフレームごとにディスク上の PNG を要求します。テクスチャをメモリにロードし、必要に応じてスプライトに割り当てる方がパフォーマンスが向上するはずです。数が少ない場合は、それらを SKTexture インスタンス変数にするのが簡単な方法です。

スプライト シート (テクスチャ アトラス) を使用します。毎回ディスクからイメージをロードするよりも、マップされた座標でメモリからイメージを描画する方がはるかに高速です。たとえば、スプライトシートに 3 つの画像がある場合、これは 1 回の描画呼び出しになります。ディスクからは、これは 3 つの個別の描画呼び出しです。

スプライトを返し、createNewNode: メソッドでシーンに追加しています。何らかの理由でそれを望んでいるのかもしれません。可能な限り重複した努力が際立っていました。

于 2014-07-12T06:09:43.400 に答える