0

1 つのテクスチャ シートを考えると、1 つまたは複数の CCSpriteBatchNodes を持つ方が良いですか? または、これは、目に見えない CCSprite クワッドを処理する際の GPU 計算コストにまったく影響しませんか?

この質問と回答を参考に、パフォーマンスについて考えています。基本的に、ファイルが 1 つしかない場合でも、複数の CCSpriteBatchNode を使用する必要があることを示唆しています。CCSpriteBatchNode が 1 つではなく 2 つある場合でも、「バッチ処理されたスプライトが多すぎると、表示されていない場合や画面の外にある場合でも、パフォーマンスに悪影響を及ぼします」という文が当てはまるかどうかはわかりません。言い換えれば、この文は「GPU は、完全に画面の外にあるために表示されないクワッドの描画をキャンセルする責任があります。それらのクワッドを処理する必要があります。」ということですか? もしそうなら、同じテクスチャ シートを使用している CCSpriteBatchNode インスタンスの数は実際には問題ではないことを意味するはずですよね?

これを最適化するにはどうすればよいですか?つまり、GPU が目に見えないクワッドを処理しなくて済むようにするにはどうすればよいでしょうか?

少なくとも太字の質問に答えることができますか?

4

3 に答える 3

2

最初のケース:シーン内のノード (またはスプライト) が多すぎて、それらの多くが画面/可視領域の外にあります。この場合、スプライトごとに、GPU はスプライトが可視領域外にあるかどうかを確認する必要があります。スプライト ノードが多すぎるということは、GPU に負荷がかかりすぎることを意味します。

CCSpriteBatchNode をさらに追加しても、パフォーマンスには影響しません。スプライト シートのビットマップが GPU メモリに読み込まれ、個々のスプライトを描画するために座標の配列がアプリケーションによって保持されるためです。したがって、2 つの異なる CCSpriteBatchNode に 2 つの画像を配置するか、1 つの画像に 2 つの画像を配置すると、CPU と GPU の両方で同じになります。

最適化する方法は?最善の方法は、非表示のノード/スプライトを親から削除することです。ただし、それはアプリケーションによって異なります。

于 2012-09-24T12:24:50.160 に答える
1

FPS は、次の 2 つの理由で確実に低下します。

  • fillrate - 多くのスプライトが互いにオーバーラップする場合 (さらに、高解像度テクスチャを小さなスプライトにレンダリングする場合)
  • 冗長な状態変更- この場合、最も重いのはシェーダーとテクスチャーの切り替えです

画面外のスプライトを 1 回のバッチでレンダリングできますが、これによってパフォーマンスが大幅に低下することはありません。不透明度 0 (または透明テクスチャ) のスプライトのレンダリングは、透明でないスプライトと同じ時間がかかることに注意してください。

于 2012-09-24T11:28:27.490 に答える
0

まず第一に、これは時期尚早の最適化のケースのように聞こえます。画面に表示されると予想されるスプライトの数でテストを行い、いくつかを追加し、他のスプライトを削除します。サポートされている最も古いデバイスで 60 fps を取得できますか? はいの場合は、最適化する必要はありません。いいえの場合は、コードの設計を微調整して、実際に何が違いを生んでいるかを確認してください。

 I mean, how can I avoid the GPU having to process the non visible quads?

cocos2d がスプライト/バッチ スプライトの描画を処理する方法を書き直さない限り、できません。

it doesn't really matter how may CCSpriteBatchNode instances I have using the same texture sheet, right?

追加のスプライト バッチ ノードごとに、ドロー コールが追加されます。1 回の描画呼び出しにバッチ処理できるスプライトの数を考えると、利点は欠点をはるかに上回ります。スプライト バッチ ノードが 1 つ、2 つ、または 3 つある場合でも、まったく違いはありません。

于 2012-09-25T10:20:58.497 に答える