SDL мерцает, когда присутствует несколько текстур, но стабилен, когда присутствует только одна

#c #textures #sdl #render #free

#c #Текстуры #sdl #визуализация #Бесплатно

Вопрос:

В настоящее время я по существу воссоздаю оригинальный Mario для задания. Я настроил его так, чтобы игра использовала ScreenManager и в настоящее время по умолчанию загружает Level1 при запуске. Затем Level1 загружает фон и символ, оба с использованием класса Texture2D, который я создал ранее. Если одна из них загружена, а другая закомментирована, они отображаются на экране нормально и выглядят нормально, однако, если я отображаю их обе на экране, они начинают непрерывно мерцать.

Функция Level1 Render():

 void GameScreenLevel1::Render()
{
    mBackgroundTexture->Render(Vector2D(), SDL_FLIP_NONE);
    myCharacter->Render();
}
  

Класс Texture2D:

 #include <iostream>
#include <SDL_image.h>
#include "Texture2D.h"
using namespace::std;

Texture2D::Texture2D(SDL_Renderer* renderer)
{
    mRenderer = renderer;
    SDL_Texture* mTexture = NULL;
    SDL_Texture* vTexture = NULL;

    int             mWidth = 0;
    int             mHeight = 0;
}

Texture2D::~Texture2D()
{
    Free();
    mRenderer = NULL;
}

bool Texture2D::LoadFromFile(string path)
{
    Free();

    //Loadtheimage
    SDL_Surface* pSurface = IMG_Load(path.c_str());
    if (pSurface != NULL)
    {
        SDL_SetColorKey(pSurface, SDL_TRUE, SDL_MapRGB(pSurface->format, 0, 0xFF, 0xFF));
        mTexture = SDL_CreateTextureFromSurface(mRenderer, pSurface);

        if (mTexture == NULL)
        {
            cout << "Unable to create texture from surface. Error:" << SDL_GetError() << endl;
        }

        else
        {
            mWidth = pSurface->w;
            mHeight = pSurface->h;
        }
    }

    else
    {
        cout << "Unable to create texture from surface. Error: " << IMG_GetError() << endl;
    }

    //vTexture = mTexture;
    return mTexture != NULL;
}

void Texture2D::Render(Vector2D newPosition, SDL_RendererFlip flip, double angle)
{
    //clear the screen
    SDL_SetRenderDrawColor(mRenderer, 0x00, 0x00, 0x00, 0x00);
    SDL_RenderClear(mRenderer);

    //set where to render the texture
    SDL_Rect renderLocation = {newPosition.x, newPosition.y, mWidth, mHeight};

    //render to screen
    SDL_RenderCopyEx(mRenderer, mTexture, NULL, amp;renderLocation, 0, NULL, flip);
    SDL_RenderPresent(mRenderer);
}

void Texture2D::Free()
{
    if (mTexture != NULL)
    {
        SDL_DestroyTexture(mTexture);
        mTexture = NULL;
        SDL_DestroyTexture(vTexture);
        vTexture = NULL;
        mHeight = 0;
        mWidth = 0;
    }
}
  

Мне кажется, что код увлекается очисткой экрана и рендерингом текстур снова и снова в каждом кадре, вызывая мерцание, и из-за наличия нескольких текстур на экране это замедляет процесс до такой степени, что он виден, но я не уверен, как исправить проблему.

Ответ №1:

Кажется, что в вашей функции рендеринга вы очищаете экран для каждой загружаемой текстуры, поэтому экран очищается, затем загружается и отображается первая текстура, но перед тем, как также отображается вторая текстура, экран снова очищается, и вместо того, чтобы вторая текстура накладывалась поверхво-первых, он будет мерцать между двумя текстурами

Комментарии:

1. Это верно. Просто чтобы исключить возможное неправильное толкование, решение не «не очищать» (иногда приходится), а «не представлять, пока не будет выполнен весь кадр».