Cos'è un renderer SDL?


103

Sto iniziando con SDL2 e ho qualche problema a capire cosa sia un SDL_Renderer.

Che cos'è? Che cosa fa? Qual è la differenza tra SDL_Renderer, SDL_Window, SDL_Surface e SDL_Texture e come sono correlati?

Ho avuto problemi con questo durante il tentativo di comprendere questo codice introduttivo:

#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;
}

Stavo usando il tutorial Twinklebear (suggerito su SDL Wiki) e ho guardato anche la documentazione Wiki di SDL e alcuni libri. Ma tutti presumono che io conosca queste definizioni.

Risposte:


196

SDL_Window

SDL_Window è la struttura che contiene tutte le informazioni sulla finestra stessa: dimensione, posizione, schermo intero, bordi ecc.


SDL_Renderer

SDL_Rendererè una struttura che gestisce tutto il rendering. È legato a un SDL_Windowquindi può essere visualizzato solo all'interno di esso SDL_Window. Inoltre tiene traccia delle impostazioni relative al rendering. Ci sono diverse importanti funzioni legate alSDL_Renderer

  • SDL_SetRenderDrawColor(renderer, r, g, b, a);
    Questo imposta il colore a cui ripulisci lo schermo (vedi sotto)

  • SDL_RenderClear(renderer);
    Questo cancella la destinazione di rendering con il colore di disegno impostato sopra

  • SDL_RenderCopy(
    Questa è probabilmente la funzione che utilizzerai di più, è usata per il rendering di a SDL_Texturee ha i seguenti parametri:

    • SDL_Renderer* renderer,
      Il renderer che vuoi usare per il rendering.
    • SDL_Texture* texture,
      La texture che vuoi rendere.
    • const SDL_Rect* srcrect, La parte della trama che vuoi renderizzare, NULL se vuoi renderizzare l'intera trama
    • const SDL_Rect* dstrect)
      Dove vuoi rendere la texture nella finestra. Se la larghezza e l'altezza di questo SDL_Rectè minore o maggiore delle dimensioni della trama stessa, la trama verrà allungata in base a questoSDL_Rect
  • SDL_RenderPresent(renderer);
    Le altre funzioni SDL_Render * attingono a una destinazione nascosta. Questa funzione prenderà tutto questo e lo disegnerà nella finestra legata al renderer.

SDL_Textures e SDL_Surface

Il SDL_Rendererrendering SDL_Texture, che memorizza le informazioni sui pixel di un elemento. È la nuova versione di SDL_Surfacecui è più o meno la stessa. La differenza è principalmente che SDL_Surfaceè solo structun'informazione pixel contenente, mentre SDL_Textureè una rappresentazione efficiente e specifica del driver dei dati pixel.

È possibile convertire una SDL_Surface * in SDL_Texture utilizzando

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

Dopodiché, SDL_Surface dovrebbe essere liberato usando

SDL_FreeSurface( SDL_Surface* surface )

Un'altra importante differenza è che SDL_Surfaceutilizza il rendering software (tramite CPU) mentre SDL_Textureutilizza il rendering hardware (tramite GPU).


SDL_Rect

La struttura più semplice di SDL. Contiene solo quattro cortometraggi. x, yche mantiene la posizione e w, hche mantiene larghezza e altezza.

È importante notare che 0, 0è l'angolo superiore sinistro in SDL. Quindi un valore più yalto significa più basso e l'angolo in basso a destra avrà la coordinatax + w, y + h


Puoi leggere di più su SDL2 sul mio blog.


1
Quindi quello che quando chiami SDL_RenderPresent è prendere quel renderer con tutte le sue impostazioni e le trame che sono state caricate su di esso e fargli visualizzare queste informazioni sulla finestra a cui è legato?
prcastro

3
@olevegard, ottima risposta. Solo per chiarire la differenza tra SDL_Texture e SDL_Surface, vorrei sottolineare che SDL_Texture esegue il rendering utilizzando la GPU e SDL_Surface utilizza il redering software, che è meno efficiente ma consente di manipolare liberamente le informazioni sui pixel. Inoltre, ottimo blog, lo leggerò sicuramente :)
Fabio Picchi

L'affermazione "Questo cancella la destinazione di rendering con il colore di disegno impostato sopra" , credo, è corretta ma non riesco a capire la frase "cancella" nell'istruzione. Il doc usa sempre questa frase. Potresti spiegare cosa significa esattamente "chiaro" qui? Significa "dipingere" (più o meno) con il colore di disegno corrente del renderizzatore?
Nawaz

C'è qualche motivo per usare SDL_Surfacesopra SDL_Renderer?
Stevoisiak

La risposta in alto ha qualche imprecisione, SDL_Renderer può anche essere legato alla superficie, non solo alla finestra, controlla il link: wiki.libsdl.org/SDL_CreateSoftwareRenderer
dmitro

9

Pensa SDL_Windowa pixel fisici SDL_Renderere un luogo in cui memorizzare impostazioni / contesto.

Quindi crei un mucchio di risorse e le appendi al renderer; e poi quando è pronto, dici al renderer di mettere tutto insieme e inviare i risultati alla finestra.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.