2014-01-27 5 views
53

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

Ich versuchte, es zu googeln, aber alle Erklärungen, die ich fand, waren zu komplex, um sie zu verstehen, ohne tiefer in Computergrafiksachen zu graben.

+6

Werfen Sie einen Blick auf meine Antwort hier: http://stackoverflow.com/questions/21007329/what-is-a-sdl-renderer/21007477#21007477 Es wird 'SDL_Texture' und' SDL_Surface' sowie '' erklären SDL_Renderer'. Im Allgemeinen wird 'SDL_Texture' für das Rendern verwendet, aber wenn Sie Texturinformationen mit' SDL_Image' oder 'SDL_ttf' laden, erhalten Sie die Daten als' SDL_Surface' – olevegard

+0

@olevegard Diese Antwort ist eigentlich eine Kopie einfügen Ich hätte gerne eine Antwort mit etwas Wissen. – this

+3

Nun, wie Sie annehmen, 'SDL_Surface' ist nur eine Sammlung von Pixeln, während' SDL_Texture' ist eine effiziente, treiberspezifische Darstellung von Pixeldaten, was bedeutet, dass es von der GPU http: //wiki.libsdl verwendet werden kann.org/SDL_Textur. Hat das deine Frage beantwortet? Sie sollten wirklich tiefer in Computergrafiken graben, um mehr zu verstehen – olevegard

Antwort

7

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

56

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

SDL_Surface wird in Software Rendering verwendet. Mit dem Software-Rendering, wie saloomi2012 richtig bemerkt, verwenden Sie normalen RAM, um Bilddaten zu speichern. Daher können Sie in den meisten Fällen direkt auf den mit der Oberfläche verbundenen Datenpuffer zugreifen und dessen Inhalt modifizieren, d. H. Er verwendet die CPU, daher die Software Name.

SDL_Texture auf der anderen Seite, in einem Hardware verwendet wird Rendering, sind Texturen in VRAM gespeichert und Sie haben keinen Zugriff auf sie direkt als mit SDL_Surface. Die Rendering-Vorgänge werden von der GPU beschleunigt, wobei entweder die OpenGL- oder die DirectX-API (nur unter Windows verfügbar) verwendet werden, die wiederum Ihre Grafikhardware verwenden, daher hardware Rendering-Name.

Unnötig zu sagen, dass Hardware-Rendering um Größenordnungen schneller ist als Software-Rendering und sollte immer als primäre Option betrachtet werden.

+2

Wenn Hardwarebeschleunigung verfügbar ist, gibt es einen Vorteil, SDL_Surface zu verwenden? Z.B. Für kleine Rendering-Operationen ist der Overhead für die Hardware zu groß? – Timmos

+2

@Timmos Hardware-Rendering wird immer schneller als Software sein. Es gibt jedoch einen Vorteil für eine Softwareoberfläche: Da sie im CPU-zugänglichen Hauptspeicher gespeichert ist, können Sie direkt Daten in sie schreiben. Dies kann nützlich sein, wenn Sie eine Textur in Echtzeit generieren möchten, zum Beispiel als prozedural generierten Inhalt in Videospielen. (Allerdings können heutzutage viele Arten von prozeduraler Generierung auch mit Shadern auf der GPU durchgeführt werden.) – cemper93

+0

@Timmos Sie haben die volle Kontrolle über die Art und Weise, wie Oberflächen bearbeitet werden, generierte, volle Lese-Schreib-Kontrolle, meine ich wirklich. ..control ist, was eine Oberfläche Ihnen gibt. OpenGL und solche APIs sind erforderlich, um mit einer GPU zu arbeiten, da GPU-Hersteller keinen direkten Zugriff auf die GPU erlauben. Deshalb werden Sie oft über Ineffizienzen mit OpenGL oder DX oder über dumme Dinge, die diese APIs tun, klagen könnte etwas schneller oder effizienter schreiben, aber sie können nicht, weil sie keinen Zugriff auf die GPU haben. –

2

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

0

gibt weitere Informationen über das ist in:

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

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

Ich hoffe, es hilft Ihnen!