Двойният буфер SDL2 не работи, все още се разкъсва

Имам нужда от двоен буфер, защото започвам да забелязвам разкъсване, когато искам да преместя моята текстурирана карта с плочки около екрана чрез щракване на мишката.

Използвам SDL2 и това е специфичен въпрос за SDL2, вижте моя код, който произвежда разкъсване, какво не е наред?

//set up buffer and display
bufferTexture = SDL_CreateTexture(renderer,SDL_PIXELFORMAT_RGBA8888,SDL_TEXTUREACCESS_STREAMING,800,600);
displayTexture = SDL_CreateTexture(renderer,SDL_PIXELFORMAT_RGBA8888,SDL_TEXTUREACCESS_TARGET,800,600);


while(running)
{
    handleEvents();

    SDL_SetRenderTarget(renderer,bufferTexture); // everything goes into this buffer
    SDL_RenderClear(renderer); // clear buffer before draw

    gTileMovement.updateMapCoordinates();

    for(int i = 0; i < MAP_ROWS; i++)//rows
    {
        for(int j = 0; j < MAP_COLUMNS; j++)//columns
        {
            x = (j * 100) - (i * 100);
            y = ((i * 100) + (j * 100)) / 2;
            drawTiles(i,j,x,y);
        }
    }
    //move from buffer to display texture
    memcpy(&displayTexture,&bufferTexture,sizeof((&bufferTexture)+1));

    //change render target back to display texture
    SDL_SetRenderTarget(renderer,displayTexture);

    //show it all on screen
    SDL_RenderPresent(renderer);
}

за всичко, което има значение тук е и моята функция drawTiles, това не е ли конвенционално? :

void drawTiles(int i,int j,int x,int y)
{
    //updates based on a mouse clicks xy coords
    gTileMovement.updateMapCoordinates();

    if(tileMap[i][j] == 1) // grass?
    {
         gSpriteSheetTexture.render(x+gTileMovement.getUpdatedX(),y+gTileMovement.getUpdatedY(),&gSpriteClips[1]);
    }
    if(tileMap[i][j] == 0) // wall?
    {
           gSpriteSheetTexture.render(x+gTileMovement.getUpdatedX(),y+gTileMovement.getUpdatedY(),&gSpriteClips[0]);
    }
    if(tileMap[i][j] == 2) // tree?
    {
       gSpriteSheetTexture.render(x+gTileMovement.getUpdatedX(),y+gTileMovement.getUpdatedY(),&gSpriteClips[2]);
    }
}

Което следва в начина, по който SDL_RenderCopy плочките през клас. Това копира текстурите върху текущия целеви рендър, нали? Което е буферната текстура, ако не греша.

void LTexture::render(int x, int y, SDL_Rect * clip)
{
SDL_Rect renderQuad = {x, y, mWidth, mHeight};

if(clip != NULL)
{
    renderQuad.w = clip->w;
    renderQuad.h = clip->h;
}

SDL_RenderCopy(renderer, mTexture, clip, &renderQuad); 

}

person doomglhfcn    schedule 05.02.2015    source източник
comment
Опитахте ли да изобразите bufferTexture до displayTexture, като използвате SDL_RenderCopy вместо memcpy?   -  person emlai    schedule 05.02.2015
comment
да Опитах този метод, преди да използвам memcpy - същият резултат.   -  person doomglhfcn    schedule 05.02.2015
comment
Опитахте ли да зададете подсказката SDL_HINT_RENDER_VSYNC с SDL_SetHint?   -  person emlai    schedule 05.02.2015
comment
...също има проблеми с разкъсването на SDL2, само на някои платформи. Dell + nvidia 730 всички AOK. Всички mac AOK. Лаптоп Alienware + nvidia 965, много къса.   -  person david van brink    schedule 17.02.2016