0

CCSpriteBatchNode を使用して、基本的に一度に 1 ピクセルずつ (1x1 スウォッチを使用して) 線を描画しています。ユーザーが線の行き先をリアルタイムで制御しているため、これを行う必要があります (描画アプリではありませんが、私が行っていることは同等だと思います)。

15 ~ 16k の子を batchNode に追加すると、新しい子の登録が停止することがわかりました。基本的に、ペンのインクがなくなったようです。

私は cocos2d コードを少しいじりましたが、何か問題があるようには見えません。新しい子ノードの登録を停止するだけです。これがなぜなのか誰か知っていますか?

4

1 に答える 1

1

まず第一に、これは非常に控えめな表現です。

痛い!

次に、技術的な理由。スプライトは、16.384 個をバッチ処理するとすぐにレンダリングに失敗します。各スプライトはクワッド (4 つの頂点) を使用してスプライトを画面にレンダリングするため、バッチ操作ごとに 65.536 頂点の頂点制限に達します。

バッチ操作ごとにそれ以上の頂点が描画されません ( VBO バッファー制限)。これは技術的な制限です。追加のスプライトに別の CCSpriteBatchNode を使用することもできますが、真剣に、ここではどこにも行きません。

線を引くことだけが必要な場合、これはおそらく私が想像できる最悪のアプローチです。線画 (ccDrawLine)、個々のピクセル (ccDrawPixel も存在すると思いますが、15k ピクセルは非常に遅くなります)、またはシェーダーを使用して、同じまたは類似の効果を実現することを検討してください。CCDrawNode を使用して、cocos2d 2.1 で描画プリミティブをバッチ処理することもできます。

私がYETIPIPIで成功裏に使用したもう 1 つの解決策は、限られた数 (たとえば 20 ~ 200) のスプライトを使用し、それらを CCRenderTexture に描画することです。新しいスプライトを追加するたびに、使用頻度の最も低いスプライトが再利用されます。rendertexture をクリアしないことで、以前に描画されたすべてのものを残したまま、はるかに少ないスプライトで描画を続けることができます。不透明度の低いスプライトを描画すると、その領域をより不透明にするために、同じ位置に長時間描画する効果さえ得られます。

于 2013-04-17T22:22:43.123 に答える