Как нарисовать большое количество спрайтов (500+) для построения изометрической мозаичной карты в DirectX 10? - PullRequest
1 голос
/ 30 мая 2011

Итак, я возился с несколькими книгами по 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 Ответ

3 голосов
/ 30 мая 2011

Весь смысл DrawSpritesImmediate заключается в том, что вы хотите вызывать его с массивом из сотен или тысяч спрайтов, а не по одному спрайту за раз.

В качестве альтернативы попробуйте изменить свой «немедленный» вызов на использование DrawSpritesBuffered, за которым следует ID3DX10Sprite :: Flush (вне циклов, непосредственно перед End ()).

Но даже с этим... 5 сек / кадр звучит ужасно медленно ... Вы уверены, что не используете программный "эталонный растеризатор" вместо HW?

...