Unterschied zwischen Oberfläche und Textur (SDL / allgemein)

83

Kann mir jemand in einfachen Worten erklären, was der Unterschied zwischen Textur und Oberfläche ist? Ich sah es SDL2als SDL_Surfaceund verwendet SDL_Texture. SDL_Texturewird erstellt, aus SDL_Surfacedem wiederum aus Bild / Bitmap erstellt wird. Beide sind eine Sammlung von Pixeln. Aber ich sehe nicht den Hauptunterschied zwischen ihnen (hat etwas mit der GPU zu tun?)

Ich habe versucht, es zu googeln, aber alle Erklärungen, die ich fand, waren zu komplex, um sie zu verstehen, ohne mich eingehender mit Computergrafiken zu befassen.

ps-aux
quelle
7
Schauen Sie sich meine Antwort hier an: stackoverflow.com/questions/21007329/what-is-a-sdl-renderer/… Es wird erklären SDL_Textureund SDL_Surfacesowie SDL_Renderer. Im Allgemeinen SDL_Texturewird es für das Rendern verwendet, aber wenn Sie Texturinformationen mit SDL_Imageoder laden SDL_ttf, erhalten Sie die Daten alsSDL_Surface
olevegard
@olevegard Diese Antwort ist so ziemlich ein Copy Paste, ich hätte wirklich gerne eine Antwort mit etwas Wissen.
dieser
3
Nun , wie Sie davon ausgehen, SDL_Surfaceist nur eine Ansammlung von Pixeln , während SDL_Texturesie das an efficient, driver-specific representation of pixel dataheißt es kann durch die GPU verwendet werden wiki.libsdl.org/SDL_Texture . Hat das deine Frage beantwortet? Sie sollten wirklich tiefer in die Computergrafik
eintauchen
2
@olevegard Schade, dass du das nicht in deine Antwort geschrieben hast. Hier ist deine Chance.
dieser

Antworten:

83

Grundsätzlich Ihre Annahme "hat etwas mit GPU zu tun?" ist richtig.

SDL_Surfacewird beim Rendern von Software verwendet . Beim Software-Rendering verwenden Sie, wie saloomi2012 richtig bemerkt hat, normalen RAM, um Bilddaten zu speichern. In den meisten Fällen können Sie daher direkt auf den mit der Oberfläche verknüpften Datenpuffer zugreifen und dessen Inhalt ändern, dh die CPU wird verwendet, daher der Name der Software .

SDL_TextureAuf der anderen Seite wird in einem Hardware- Rendering verwendet, Texturen werden im VRAM gespeichert und Sie haben keinen direkten Zugriff darauf wie bei SDL_Surface. Die Rendering-Vorgänge werden von der GPU beschleunigt, indem intern entweder die OpenGL- oder die DirectX-API (nur unter Windows verfügbar) verwendet wird, die wiederum Ihre Videohardware verwenden, daher der Name des Hardware- Renderings.

Es ist unnötig zu erwähnen, dass das Hardware-Rendering um Größenordnungen schneller ist als das Software-Rendering und immer als primäre Option betrachtet werden sollte.

Petr Abdulin
quelle
4
Gibt es einen Vorteil bei Verwendung von SDL_Surface, wenn Hardwarebeschleunigung verfügbar ist? ZB für kleine Rendervorgänge ist der Aufwand für das Aufrufen der Hardware zu groß?
Timmos
3
@Timmos Hardware-Rendering ist immer schneller als Software. Eine Softwareoberfläche hat jedoch einen Vorteil: Da sie im CPU-zugänglichen Hauptspeicher gespeichert ist, können Sie Daten direkt darauf schreiben. Dies kann nützlich sein, wenn Sie eine Textur in Echtzeit generieren möchten, z. B. als prozedural generierter Inhalt in Videospielen. (Beachten Sie jedoch, dass heutzutage viele Arten der prozeduralen Generierung auch auf der GPU mit Shadern durchgeführt werden können.)
cemper93
1
@Timmos Sie haben die volle Kontrolle darüber, wie Oberflächen bearbeitet, generiert und vollständig gelesen und geschrieben werden. Ich meine wirklich ... Kontrolle ist das, was eine Oberfläche Ihnen gibt. OpenGL und solche APIs müssen mit einer GPU zusammenarbeiten, da GPU-Hersteller keinen direkten Zugriff auf die GPU zulassen. Deshalb werden Sie häufig Leute hören, die sich über Ineffizienzen bei OpenGL oder DX beschweren oder einfach nur dumme Dinge, die diese APIs tun, weil sie könnte etwas schneller oder effizienter schreiben, aber sie können nicht, weil sie keinen Zugriff auf die GPU haben.
Trevor Hart
8

SDL_Texture wird anstelle des normalen RAM in den VRAM Ihrer Grafikkarte geladen.

saloomi2012
quelle
2

Oberflächen verwenden Ihren RAM und Texturen verwenden Ihre Grafikkarte, die schneller als die Oberflächen ist.

Evander
quelle
1

Weitere Informationen dazu finden Sie in:

https://thenumbat.github.io/cpp-course/sdl2/05/05.html

Wie in der letzten Lektion erwähnt, sind Texturen das GPU-Rendering-Äquivalent von Oberflächen. Daher werden Texturen fast immer aus Oberflächen mit der Funktion SDL_CreateTextureFromSurface () erstellt. Diese Funktion macht mehr oder weniger das, was Sie erwarten - die Parameter sind der Renderkontext und eine Oberfläche, aus der die Textur erstellt werden kann. Wie bei anderen Erstellungsfunktionen wird bei einem Fehler NULL zurückgegeben.

Ich hoffe es hilft dir!

Omotto
quelle