Frage

Ich beginne mit SDL2 und habe einige Probleme zu verstehen, was ein SDL_Renderer ist.

Was ist das?Was macht es?Was ist der Unterschied zwischen SDL_Renderer, SDL_Window, SDL_Surface und SDL_Texture und wie hängen sie zusammen?

Ich hatte Probleme damit, als ich versuchte, diesen Einführungscode zu verstehen:

#include <iostream>
#include <SDL2/SDL.h>

int main()
{
    /* Starting SDL */
    if (SDL_Init(SDL_INIT_EVERYTHING) != 0) {
        std::cout << "SDL_Init Error: " << SDL_GetError() << std::endl;
        return 1;
    }

    /* Create a Window */
    SDL_Window *window = SDL_CreateWindow("Hello World!", 100, 100, 640, 480, SDL_WINDOW_SHOWN);
    if (window == nullptr) {
        std::cout << "SDL_CreateWindow Error: " << SDL_GetError() << std::endl;
        return 1;
    }

    /* Create a Render */
    SDL_Renderer *render = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
    if (render == nullptr) {
        std::cout << "SDL_CreateRenderer Error: " << SDL_GetError() << std::endl;
        return 1;
    }

    /* Load bitmap image */
    SDL_Surface *bmp = SDL_LoadBMP("./Tutorial/res/Lesson1/hello.bmp");
    if (bmp == nullptr) {
        std::cout << "SDL_LoadBMP Error: " << SDL_GetError() << std::endl;
        return 1;
    }

    /* Upload surface to render, and then, free the surface */
    SDL_Texture *texture = SDL_CreateTextureFromSurface(render, bmp);
    SDL_FreeSurface(bmp);
    if (texture == nullptr){
        std::cout << "SDL_CreateTextureFromSurface Error: " << SDL_GetError() << std::endl;
        return 1;
    }

    /* Draw the render on window */
    SDL_RenderClear(render); // Fill render with color
    SDL_RenderCopy(render, texture, NULL, NULL); // Copy the texture into render
    SDL_RenderPresent(render); // Show render on window

    /* Wait 2 seconds */
    SDL_Delay(5000);

    /* Free all objects*/
    SDL_DestroyTexture(texture);
    SDL_DestroyRenderer(render);
    SDL_DestroyWindow(window);

    /* Quit program */
    SDL_Quit();
    return 0;
}

Ich habe das Twinklebear-Tutorial verwendet (vorgeschlagen im SDL-Wiki) und mir auch die SDL-Wiki-Dokumentation und einige Bücher angesehen.Aber alle gehen davon aus, dass ich diese Definitionen kenne.

War es hilfreich?

Lösung

SDL_Window

SDL_Window ist die Struktur, die alle Informationen über das Fenster selbst enthält:größe, position, Vollbild, Rahmen usw.


SDL_Renderer

SDL_Renderer ist eine Struktur, die das gesamte Rendern übernimmt.Es ist an a gebunden SDL_Window es kann also nur innerhalb davon gerendert werden SDL_Window.Es verfolgt auch die Einstellungen für das Rendering.Es gibt mehrere wichtige Funktionen, die mit dem verbunden sind SDL_Renderer

  • SDL_SetRenderDrawColor(renderer, r, g, b, a);
    Dies legt die Farbe fest, auf die Sie den Bildschirm löschen ( siehe unten )

  • SDL_RenderClear(renderer);
    Dadurch wird das Renderziel mit der oben eingestellten Zeichenfarbe gelöscht

  • SDL_RenderCopy(
    Dies ist wahrscheinlich die Funktion, die Sie am häufigsten verwenden werden, sie wird zum Rendern eines verwendet SDL_Texture und hat die folgenden Parameter :

    • SDL_Renderer* renderer,
      Der Renderer, den Sie zum Rendern verwenden möchten.
    • SDL_Texture* texture,
      Die Textur, die Sie rendern möchten.
    • const SDL_Rect* srcrect, Der Teil der Textur, den Sie rendern möchten, NULL, wenn Sie die gesamte Textur rendern möchten
    • const SDL_Rect* dstrect)
      Wo Sie die Textur im Fenster rendern möchten.Wenn die Breite und Höhe dieses SDL_Rect ist kleiner oder größer als die Abmessungen der Textur selbst, wird die Textur entsprechend gedehnt SDL_Rect
  • SDL_RenderPresent(renderer);
    Die anderen SDL_Render * -Funktionen zeichnen auf ein verstecktes Ziel.Diese Funktion nimmt all das auf und zeichnet es in das Fenster, das an den Renderer gebunden ist.

SDL_Textures und SDL_Surface

Der SDL_Renderer Rendering SDL_Texture, das die Pixelinformationen eines Elements speichert.Es ist die neue Version von SDL_Surface was ziemlich gleich ist.Der Unterschied besteht hauptsächlich darin, dass SDL_Surface ist nur ein struct pixelinformationen enthalten, während SDL_Texture ist eine effiziente, treiberspezifische Darstellung von Pixeldaten.

Sie können eine SDL_Surface * in SDL_Texture konvertieren mit

SDL_Texture* SDL_CreateTextureFromSurface(SDL_Renderer* renderer,
                                          SDL_Surface*  surface)

Danach sollte die SDL_OBERFLÄCHE freigegeben werden mit

SDL_FreeSurface( SDL_Surface* surface )

Ein weiterer wichtiger Unterschied ist, dass SDL_Surface verwendet Software-Rendering (über CPU), während SDL_Texture verwendet Hardware-Rendering (über GPU).


SDL_Rect

Die einfachste Struktur in SDL.Es enthält nur vier Shorts. x, y der die Position hält und w, h welches Breite und Höhe enthält.

Es ist wichtig zu beachten, dass 0, 0 ist die obere linke Ecke in SDL.Also eine höhere y-wert bedeutet niedriger und die untere rechte Ecke hat die Koordinate x + w, y + h


Sie können mehr über SDL2 auf meinem lesen Blog.

Andere Tipps

Denken Sie an SDL_Window als physikalische Pixel und SDL_Renderer und ein Ort zum Speichern von Einstellungen / Kontext.

Sie erstellen also eine Reihe von Ressourcen und hängen sie vom Renderer ab;und wenn es fertig ist, weisen Sie den Renderer an, alles zusammenzusetzen und die Ergebnisse an das Fenster zu senden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top