CCSpriteBatchNode の使用を最適化する方法を知りたいです。言い換えれば、私は次のことを理解しています:
- 1) 各 CCSpriteBatchNode インスタンスは draw メソッドの呼び出しを 1 回実行するため、OpenGL 呼び出しが減少し、パフォーマンスが大幅に向上します。
- 2) 各 CCSpriteBatchNode は、テクスチャ アトラスを 1 つだけ参照できます。
私は100%確信が持てませんが、あなたの答えは次のとおりです。
3) game-art-hd.png などの 1 つのテクスチャ アトラスがあり、さまざまなクラスでいくつかの CCSpriteBatchNode を作成すると、複数の描画呼び出しが発生しますか? 言い換えると、CCSpriteBatchNode の各インスタンスが独自の描画メソッドを呼び出すと想定しているため、複数の GL 描画呼び出しが発生し、1 つの共有バッチ ノードを使用する場合よりもパフォーマンスが低下します。私は正しいですか?
- 4) スプライトで複数のフレームからなるアニメーションを使用している場合、アニメーション フレームをスプライト バッチ ノードに追加する必要があると思います。どうすればそうできますか?
以下は、通常スプライトをアニメーション化する方法に関するコード スニペットです。お気づきのように、スプライト フレームはスプライト バッチ ノードに追加されません。パフォーマンスを向上させるには、おそらく初期化時にこれを行う必要があります。これは正しいです?
NSMutableArray* frames = [[NSMutableArray alloc]initWithCapacity:2]; for (int i = 0; i < 4; i++) { NSString*bulletFrame = [NSString stringWithFormat:@"animation-%i.png", i]; CCSpriteFrame* frame = [[CCSpriteFrameCache sharedSpriteFrameCache]spriteFrameByName:bulletFrame]; [frames addObject:frame]; } CCAnimation* anim = [CCAnimation animationWithFrames:frames delay:0.1f]; CCAnimate* animate = [CCAnimate actionWithAnimation:anim]; CCRepeatForever* repeat = [CCRepeatForever actionWithAction:animate]; [self runAction:repeat]; }
5) 部分的に 4. を参照していますが、実行時にスプライト バッチ ノードにスプライトを追加したり削除したりすることは避けたいと思いますか?
6) CCSpriteBatchNode は、visible が true に設定されているスプライト、または実際に画面領域の外に位置するスプライトのみを考慮しますか?
3に関するその他の考慮事項
3. での私の仮定に対処し、CCSpriteBatchNode インスタンスの数を減らすために、私の解決策は、この回答で @Suboptimus によって提案されたものに従います。私は、self.parent.parent.(...).parent.finallysharedbatchNode 経由で MainScene にアクセスさせるのではなく、MainScene クラスと同じバッチ ノードを共有したいクラスを初期化するという提案されたアプローチが好きです。
代わりに、self.parent.....parent を使用して MainScene を参照し、正しくキャストすることを提案する人もいます。
これは、ソフトウェア エンジニアリングの観点からも最善のアプローチですか?
MainScene クラスへの明示的な参照を使用して、スプライトが追加される場所を明確にすることを好みます。これは、チームで作業している場合やクラス階層を変更する場合に役立ちます。しかし、これの欠点は、後でスプライトをバッチ ノードに追加したい場合に参照を保存する必要があり、維持するコードが増えることです。
私がこの質問をしている理由は、私の従来の「ソフトウェア エンジニアリング」の考え方と「Cocos2d 親ノード」階層アプローチとの間にわずかな衝突を見つけた場合です。私はゲームプログラミングが初めてで、大規模なチームで働く経験豊富なゲーム開発者がどのアプローチを使用しているかを理解したいと思います:)。H