1

私はマルチスレッドが初めてなので、他のすべての問題はしばらく脇に置きます。スプライト バッチがより高速なスレッドによって終了し、次のスレッドによって「オブジェクト参照がオブジェクトのインスタンスに設定されていません」という問題を解決する方法がわかりません。

ああ、私のコードに他に何か問題がある場合は、遠慮なく私をばかだと感じさせてください ^^

spriteBatch.Begin();

// Draw Particles
List<Thread> threads = new List<Thread>();
for (int i = 0; i < CPUCores; i++)
{
    int tempi = i; // This fixes the issue with i being shared
    Thread thread = new Thread(() => DrawParticles(tempi + 1, CPUCores));
    threads.Add(thread);
    thread.Start();
}
foreach (var thread in threads)
{
    thread.Join();
}

// ..More Drawing Code..

spriteBatch.End(); // <-- This is where the program crashes

PS [コード] [/コード] の代わりにコードを表すために 4 つのスペースを使用することをお勧めしたのは誰ですか? ¬_¬

4

2 に答える 2

3

SpriteBatchあなたの問題は、スレッドセーフではないという事実から来ています。複数のスレッドから 1 つのスプライト バッチに書き込むと、それが破損します。

SpriteBatchImmediate(モードを除いて)スプライトの一種List(複数のスレッドからそれらの1つにアクセスすることはありませんか?)またはスプライトのバッファのように機能します。したがって、これに対する可能な解決策は、SpriteBatchスレッドごとに 1 つ持つことです。Drawその中でスレッドを呼び出して、各スプライト バッチの「バッファ」を埋めます。

次に、メインスレッドでしか描画できないため(つまり、内部で呼び出すGraphicsDevice.Draw*メインスレッドでのみ呼び出すことができます)、ワーカースレッドが各バッチの入力を完了するのを待ってから、それぞれをSpriteBatch.End呼び出しますEndメインスレッド。これにより、スプライトが画面に描画されます。

もちろん、膨大な数のパーティクルを描画したい場合は、すべてを GPU にオフロードする方がよい手法かもしれません。これは、どのようにそれを行うかについての大まかなガイドを提供する回答です。

于 2012-09-30T11:48:52.340 に答える
0

グラフィックス デバイスには一度に 1 つのスレッドしかアクセスできず、SpriteBatch はスレッド セーフではないため、ドロー コールはメイン スレッドから送信する必要があります。

より多くのオブジェクトを描画するためにコードを最適化したい場合は、DrawInstancedPrimitives がよりクリーンになります。

http://blogs.msdn.com/b/shawnhar/archive/2010/06/17/drawinstancedprimitives-in-xna-game-studio-4-0.aspx

http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.graphics.graphicsdevice.drawinstancedprimitives.aspx

于 2012-09-29T15:08:13.713 に答える