Was ist ein SDL Renderer?
-
21-12-2019 - |
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.
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öschtSDL_RenderCopy(
Dies ist wahrscheinlich die Funktion, die Sie am häufigsten verwenden werden, sie wird zum Rendern eines verwendetSDL_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öchtenconst SDL_Rect* dstrect)
Wo Sie die Textur im Fenster rendern möchten.Wenn die Breite und Höhe diesesSDL_Rect
ist kleiner oder größer als die Abmessungen der Textur selbst, wird die Textur entsprechend gedehntSDL_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.