3

私は小さなiPadゲームを作成しましたが、スプライトシートとバッチノードはいたるところにあります。ただし、実際にどのように機能するのか、いつスプライトシートを追加するのか、いつスプライトバッチノードにスプライトを追加するのかなどはわかりません。

これは私が最初の画面(メインメニュー)で行うことです:

CCSpriteBatchNode *spriteSheet  = [CCSpriteBatchNode batchNodeWithFile:@"sprites.png"];
screenSize = [CCDirector sharedDirector].winSize;    
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"sprites.plist"];
[self addChild:spriteSheet];

他のクラスでは-私は常に同じバッチノードを使用する必要があります->"sprites.png"-私は呼び出します

CCSprite *someSprite = [CCSprite spriteWithSpriteFrameName:someSpriteFrameName.png]; 

に追加しselfます。

[self addChild:someSprite]; // I do not understand why I would add my sprite to the batch node instead of self 

したがって、状況は次のとおりです。

  • すべてのスプライトがオンになっている「sprites.png」というファイルが1つあります。

    1. シーンを変更するたびに新しいバッチノードを作成しますか?spriteframecacheは同じままである必要がありますか?
    2. 2つのスプライトシートファイルがある場合、スプライトフレームキャッシュをどのように処理する必要がありますか?
    3. バッチノードに子を追加するのはいつですか。その理由は何ですか。

コンセプトを完全に把握しているわけではないようです。私はそれを使用する理由をおおよそ知っています。でも、誰かが私にすべてを素人の言葉でもう一度説明してくれたら本当にありがたいので、私は自分が何をしているのか100%確信しています。基本的に説明してみてください。

  • どうもありがとうございました-マーティン
4

2 に答える 2

8
  1. CCSpriteBatchNodeはCCNodeの後継であるため、シーンごとに個別のインスタンスを作成する必要があります。複数のテクスチャファイルがある場合は、シーンで複数のバッチノードを使用できます。

    CCSpriteFrameCacheはシングルトンであるため、アプリケーションの存続期間中は同じままです。

  2. 両方をに追加しCCSpriteFrameCacheます。CCSpriteFrameCacheシングルトンには、すべてのシーンのすべてのスプライトフレームをキャッシュするloadedFilenames_フィールド(のインスタンス)があります。NSMutableSet

  3. 同様のテクスチャを持つスプライトが大量にあると予想される場合は、バッチノードを使用する必要があります。たとえば、2秒ごとに100枚のコインを生成するとします。通常CCNodeを使用してスプライトを作成する場合、アプリケーションはこれらの100個のCCSpriteオブジェクトを2秒ごとに割り当てます。CCSpriteBatchNodeパフォーマンスとより良いメモリ使用量を対象としています。UITableView再利用可能なセルと同じように機能します。

    再利用可能なセルを使用してテーブルビューをスクロールしても、新しいセルは作成されません。新しいセルを画面に表示する必要がある場合、テーブルビューは、同じ再利用識別子を持つセルを画面外で見つけて、そのコンテンツを新しいコンテンツに置き換えるだけです。CCSpriteBatchNode同じように機能します。新しいスプライトを追加しようとすると、ノードは未使用のスプライトを画面外で見つけようとし、そのコンテンツを置き換えます。

    追加するスプライトCCSpriteBatchNodeは、このバッチノードの作成に使用されたテクスチャファイルのテクスチャを使用する必要があることに注意してください。

    次の例は、質問のコードに基づいています。

CCSpriteBatchNode *batchNode  = [CCSpriteBatchNode batchNodeWithFile:@"sprites.png"];
screenSize = [CCDirector sharedDirector].winSize;    
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"sprites.plist"];
[self addChild:batchNode];
CCSprite *someSprite = [CCSprite spriteWithSpriteFrameName:@"someSpriteFrom_sprites.png_.png];
[batchNode addChild:someSprite]; // add sprite to batch node to get all advantages of it

CCSpriteBatchNodeのパフォーマンスに関する優れた記事は次のとおりです。http://www.learn-cocos2d.com/2011/09/cocos2d-spritebatch-performance-test/

于 2012-08-11T11:34:11.800 に答える
0

最新 のレンダラーレンダラーを最初から書き直しました。レンダリンググラフはシーングラフから切り離されました。つまり、自動バッチ処理がサポートされ、最終的に:-)そして、新しいレンダラーは非常に高速であるため、SpriteBatchNodeの使用は推奨されなくなりました。

スプライトには自動カリングもあります。

そして、良い点は、古い機能を犠牲にしなかったことです。カスタムOpenGLコマンドは引き続きサポートされています。

このリンクを参照してください

お役に立てば幸いです

于 2014-11-14T02:41:50.343 に答える