1

私はOpenTKを使用してC#で簡単なレイキャスターを書いています。ビューを1秒間に60回更新したいので、Render()関数を呼び出すタイマーがあり、画面にテクスチャが表示されます。

再帰関数を使用して、シーンを小さな長方形に分割し、長方形のサイズが1pxになるまでそれぞれをレンダリングすることで、シーンをレンダリングしたいと思います。私の再帰は、ピクセルの色をバイト配列に書き込みます。これをテクスチャに変換する必要があります。再帰はかなり遅いので、シーンが変わるたびにバックグラウンドスレッドで実行したいと思います。

一方がテクスチャ配列に書き込むようにスレッドを同期する正しい方法は何ですか(約1秒かかります)が、もう一方のスレッドは1/60秒ごとにそれを読み取り、画面に印刷しますか?

    byte[, ,] texture;

再帰:

    public void RenderAdaptively(int top, int left, int width, int height)
    {
        Color color = getColor(top, left);
        for (int i = top; i < top + width + 1; i++)
        {
            for (int j = left; j < left + height; j++)
            {
                texture[i, j, 0] = color.R;
                texture[i, j, 1] = color.G;
                texture[i, j, 2] = color.B;
            }
        }

        int halfw = width / 2;
        int halfh = height / 2;
        int newwidth = width - halfw;
        int newheight = height - halfh;

        if (width > 1 && height > 1)
        {
            RenderAdaptively(top, left, halfw, halfh, false);
            RenderAdaptively(top + halfw, left + halfh, newwidth, newheight, false);
            RenderAdaptively(top, left + halfh, halfw, newheight, false);
            RenderAdaptively(top + halfw, left, newwidth, halfh, false);
        }
    }

別のスレッドで:

    raycasting_texture = TexUtil.CreateRGBTexture(width, height, texture);
4

1 に答える 1

1

いくつかのオプションを試すことができますが、私は次のようにします。

  • テクスチャをバイト配列として格納するための 2 つのバッファ、たとえば01

  • 1 つのバッファでテクスチャ計算を行い、

  • volatile int updated_buffer完了したら、更新されたバッファ インデックスにa を設定して通知します。

  • 他のスレッドupdated_bufferに定期的に読み取らせ、最新の値のコピーを保持します。そのコピーと int が同期していない場合は、コピーを更新してテクスチャをメモリにアップロードし、

このソリューションは、いくつかのことに依存していることに注意してください。

  1. バイト配列バッファを処理するスレッドは 2 つだけです。

  2. updated_buffer(テクスチャ)消費者スレッドによってのみ読み取られ、生産者スレッドによって書き込まれます。

  3. 最も重要なのは、テクスチャのアップロードが計算よりもかなり高速であることです。

2 番または 3 番が壊れている場合は、ミューテックスなどのテクスチャ バッファに対してより厳密な同期アプローチを使用して、アップロード中にテクスチャ バッファが上書きされないようにする必要があります。

最後に、1px まで下げるのではなく、特定のしきい値 (たとえば 8*8 ピクセル ブロック) を下回る反復に移動することで、再帰計算をわずかに向上させることができます。実際、ピクセルを計算するためのアルゴリズムに大きく依存しますが、すべてを繰り返し実行する方が高速になるはずです (シングル コアのシングル スレッドで実行する場合)。

于 2013-03-10T14:01:28.150 に答える