0

どこを間違えたのかわかりません。YouTubeで、約100万個の粒子をリアルタイムでレンダリングするデモを見たことがあります(驚くべきことです)。しかし、2500の小さなスクエア(Texture2D)だけをレンダリングしたい場合、システムはひざまずきます-すべてが遅くてぎくしゃくしています。ここでは、ループをそのまま表示します。単純なタイルからタイルへのレンダリングです。グリッドは50x50で、Texture2Dタイルは5x5の大きなpng画像とGridNode3x3のみです。私はXNAの初心者なので、あまり殴らないでください... :-)

誰か教えてもらえますか、私は何を間違えますか?

どうもありがとう

for (x = FromCol; x <= ToCol; x++)
            {
                for (y = FromRow; y <= ToRow; y++)
                {
                    Color aColor = new Color((byte)(x * 20), (byte)(y * 15), (byte)(60 + x));

                    CoordX = DisplayArea.Left + (int)Math.Round((x - FromCol) * zoomWidth - (restCol * ZoomingX) - indent_x);//
                    CoordY = DisplayArea.Top + (int)Math.Round((y - FromRow) * zoomHeight - (restRow * ZoomingY) - indent_y);//

                    dodraw = ((CoordX) > DisplayArea.Left) & (CoordX < (DisplayArea.Right - indent_x)) & ((CoordY) > DisplayArea.Top) & (CoordY < (DisplayArea.Bottom-indent_y));


                    l = CoordX + indent_x;
                    t = CoordY + indent_y; 
                    r = l + (int)Math.Round(ColWidth * ZoomingX);
                    b = t + (int)Math.Round(RowHeight * ZoomingY);

                    if (l < DisplayArea.Left) l = DisplayArea.Left;
                    if (t < DisplayArea.Top)  t = DisplayArea.Top;
                    if (r > (DisplayArea.Left + DisplayArea.Width)) r = DisplayArea.Left + DisplayArea.Width;
                    if (b > DisplayArea.Top + DisplayArea.Height) b = DisplayArea.Top + DisplayArea.Height;

                    SpriteBatch.Draw(Tile, new Rectangle(l, t, r - l, b - t), aColor);

                    if (dodraw) SpriteBatch.Draw(GridNode, new Vector2(CoordX, CoordY), Color.White);
                }
4

2 に答える 2

4

セスの答えはほぼ正しい。バッチをGPUに送信する場合、つまり何かを描画する場合、比較的多くのCPU時間を消費します。事実上、フレームごとに送信するバッチは数百に制限されています。これは「バッチ制限」です。

SpriteBatchできるだけ多くのスプライトを1つのバッチにパックすることで、この問題を回避します。実際にはEnd()[1]で物事を描くだけです。ただし、スプライトがテクスチャを共有している場合にのみ、スプライトをまとめてバッチ処理できます。

ここでは、最悪のシナリオがほぼ発生しています。テクスチャをインターリーブしているように見え、SpriteBatchスプライトごとに新しいバッチを開始する必要があります。

したがって、最初に行うことは、これが実際に問題の原因であるかどうかを確認することです。これを行う簡単な方法は、SpriteSortMode.Texture(でSpriteBatch.Begin)を設定し、パフォーマンスが向上するかどうかを確認することです。これにより、スプライトが描画順序でテクスチャごとにグループ化され、テクスチャの変更回数が減り、バッチが減ります。

その後、問題の修正に取り掛かることができます。を使い続けることができればSpriteSortMode.Texture、それで問題ありません。ループを2つの別々のループに変換することもできます。または、基本的にバッファとして機能するようにSpriteBatch、1つのループ内で2つの別々のオブジェクトを埋めることができます[1]SpriteBatch

または、これらのテクスチャをインターリーブする必要がある場合は、スプライトシートを使用します。

最後に、このトピックをより詳細にカバーするGameDevサイトでこのかなり人気のある回答を書きました。


[1]使用する場合を除くSpriteSortMode.Immediate

于 2012-09-01T08:34:58.900 に答える
1

Drawメソッドを2500回呼び出しています。CPUにGPUに命令を与えるように指示するたびに、処理のオーバーヘッドが非常に大きくなります。そのため、1回の描画呼び出しで100万個の粒子を描画するゲームよりもパフォーマンスが低下します。

1000個の三角形を1回描画する方が、1個の三角形を1000回描画するよりもはるかに高速です。

于 2012-09-01T03:40:33.453 に答える