如何在DirectX 10中绘制大量(500+)个精灵来构建等距平铺地图?

时间:2011-05-30 06:57:20

标签: c++ directx sprite directx-10 isometric

所以,我一直在为一些关于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);

1 个答案:

答案 0 :(得分:3)

DrawSpritesImmediate的重点是你要用数百或数千个精灵的数组来调用它......一次不是一个精灵。

或者,尝试将“立即”调用更改为使用DrawSpritesBuffered,然后使用ID3DX10Sprite :: Flush(在循环之外,在End()之前)。

但即便如此...... 5s /帧听起来非常慢......你确定你没有使用软件“reference rasterizer”而不是HW吗?