1

そこで、私は DirectX に関する本 (特に 10 冊) を何冊か読んで、それを使用するゲームを作成しようとしていますが、どの本にも言及されていないように見える問題に悩まされています。スプライトを使用してアイソメトリック マップを作成すると、ボードが大きくなるにつれて、プログラムの速度が劇的に低下します。各タイルは 64x45 で、スプライトを使用して 36x19 (684) のタイル マップを構築するまでに、アプリケーションのロードに約 6 秒、各フレーム間に約 5 秒かかります。ブレークポイントを使用したデバッグでは良い手がかりが得られなかったので、現在のコードで問題がこの特定のセクションにある領域を絞り込みました。

どんな助けでも大歓迎です。

    const FLOAT clearcolor[4] = {0.0f, 0.0f, 0.0f, 0.0f}; 
    pD3DDevice->ClearRenderTargetView(pRenderTargetView, clearcolor);
    if(spriteObject != NULL){
        spriteObject->Begin(D3DX10_SPRITE_SORT_TEXTURE);        
        pD3DDevice->OMGetBlendState(&pOriginalBlendState10, OriginalBlendFactor, &OriginalSampleMask);
        if(pBlendState10)
        {
            FLOAT NewBlendFactor[4] = {0,0,0,0};
            pD3DDevice->OMSetBlendState(pBlendState10, NewBlendFactor,0xffffffff);
        }
        D3DXMatrixScaling(&matScale, 64, 45, 1.0f);

        for(int y = 0;y < 36;y++){
            px=0;
            if(y % 2 == 1)
                px-=32;
            for(int x = 0;x < 19;x++){  
                D3DXMatrixTranslation(&matTrans, px, viewport.Height - py, 0.1f);
                testTile.matWorld = (matScale * matTrans);
                spriteObject->DrawSpritesImmediate(&testTile, 1, 0, 0);
                px+=64;
            }
            py+=23;
        }
        spriteObject->End();
        pD3DDevice->OMSetBlendState(pOriginalBlendState10, OriginalBlendFactor, OriginalSampleMask);
4

1 に答える 1

3

DrawSpritesImmediate の全体的なポイントは、一度に 1 つのスプライトではなく、数百または数千のスプライトの配列で呼び出したいということです。

または、"Immediate" 呼び出しを DrawSpritesBuffered を使用するように変更し、続いて ID3DX10Sprite::Flush (ループの外側、End() の直前) を使用してみてください。

しかし、それでも... 5秒/フレームは非常に遅く聞こえます...ハードウェアの代わりにソフトウェアの「参照ラスタライザー」を使用していませんか?

于 2011-05-30T07:53:20.287 に答える