SDL - Ungültiger Texturfehler in SDL_DestroyTexture ()

Ich mache ein kleines 2D-Plattformspiel im Retro-Stil mit SDL in C ++. Ich dachte mir, dass der beste Weg, um das Spiel auf einer niedrigen Auflösung zu halten, während Leute mit Monitoren unterschiedlicher Größe das Spielfenster dehnen können, um sie an ihre Einrichtung anzupassen, darin besteht, alles auf eine niedrig aufgelöste Textur zu rendern und diese Textur dann auf die zu rendern gesamtes Fenster (mit der vom Benutzer festgelegten Fenstergröße / Auflösung).

Wenn ich dieses Setup ausführe, funktioniert das Spiel genau so, wie es sollte, und es wird einwandfrei wiedergegeben (sowohl im Vollbildmodus als auch im Fenstermodus). Wenn ich jedoch SDL_DestroyTexture () verwende, um meine niedrig aufgelöste Rendertextur freizugeben, gibt die Konsole "FEHLER: Ungültige Textur" aus. Ich habe bestätigt, dass hier der Fehler mit einem Debugger auftritt. Nachfolgend finden Sie den relevanten Code, der die Textur erstellt, verwendet und zerstört. Warum ist die Textur plötzlich ungültig, wenn ich sie sonst normal verwenden kann?

// SDL is initialized

// "proxy" is the texture used for render-to-texture
// it is set to the "logical" low resolution (lxres, lyres) (usually 320x240)
// renderer is an SDL_Renderer* that initializes with no problems
SDL_Texture* proxy = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888,
                         SDL_TEXTUREACCESS_TARGET, lxres, lyres);

SDL_SetRenderDrawColor(renderer, 0, 0, 0, SDL_ALPHA_OPAQUE);

// game runs fine
while (!quit) {
    SDL_SetRenderTarget(renderer, proxy);
    render();
    SDL_SetRenderTarget(renderer, nullptr);
    // stretch the low resolution texture onto the at-least-as-high resolution
    // renderer (usually 640x480)
    SDL_RenderCopy(renderer, proxy, nullptr, nullptr);
    SDL_RenderPresent(renderer);
    SDL_RenderClear(renderer);
    updateLogic();
}

// Time to quit
SDL_SetRenderTarget(renderer, nullptr);
if (proxy != nullptr)
    SDL_DestroyTexture(proxy);    // "ERROR: Invalid texture"

// Clean up other resources

// close SDL

Antworten auf die Frage(1)

Ihre Antwort auf die Frage