Różnica między powierzchnią a teksturą (SDL / ogólna)

84

Czy ktoś może mi wyjaśnić prostymi słowami, jaka jest różnica między fakturą a powierzchnią? Widziałem, że jest używany w SDL2jako SDL_Surfacei SDL_Texture. SDL_Texturejest tworzony, z SDL_Surfacektórego z kolei jest tworzony z obrazu / bitmapy. Oba są zbiorem pikseli. Ale nie widzę głównej różnicy między nimi (czy ma coś wspólnego z GPU?)

Próbowałem to wygooglować, ale wszystkie znalezione wyjaśnienia były zbyt skomplikowane, aby je zrozumieć bez zagłębiania się w grafikę komputerową.

ps-aux
źródło
7
Spójrz na moją odpowiedź tutaj: stackoverflow.com/questions/21007329/what-is-a-sdl-renderer/… To wyjaśni, SDL_Texturea SDL_Surfacetakże SDL_Renderer. Ogólnie rzecz biorąc, SDL_Texturejest to , co jest używane do renderowania, ale kiedy SDL_ImageSDL_ttfSDL_Surface
ładujesz
@olevegard Ta odpowiedź jest prawie wklejana do kopiowania, naprawdę chciałbym otrzymać odpowiedź z pewną wiedzą.
to
3
Jak można zakładać, SDL_Surfacejest tylko zbiorem pikseli natomiast SDL_Texturejest an efficient, driver-specific representation of pixel datadzięki czemu można go stosować przez GPU wiki.libsdl.org/SDL_Texture . Czy to odpowiadało na twoje pytanie? Naprawdę powinieneś
zagłębić się
2
@olevegard Szkoda, że ​​nie napisałeś tego w swojej odpowiedzi. Oto Twoja szansa.
to

Odpowiedzi:

86

Zasadniczo twoje założenie "ma coś wspólnego z GPU?" jest w porządku.

SDL_Surfacejest używany w renderowaniu oprogramowania . Z renderowaniem programowym, jak słusznie zauważył saloomi2012 , używasz zwykłej pamięci RAM do przechowywania danych obrazu. W większości przypadków można więc uzyskać bezpośredni dostęp do bufora danych związanego z powierzchnią, modyfikując jego zawartość, tzn. Korzysta z procesora, stąd nazwa oprogramowania .

SDL_Texturez drugiej strony jest używany w renderowaniu sprzętowym , tekstury są przechowywane w pamięci VRAM i nie masz do nich bezpośredniego dostępu, jak w przypadku SDL_Surface. Operacje renderowania są przyspieszane przez procesor graficzny, używając wewnętrznie API OpenGL lub DirectX (dostępne tylko w systemie Windows), które z kolei używają sprzętu wideo, stąd nazwa renderowania sprzętowego .

Nie trzeba dodawać, że renderowanie sprzętowe jest o rząd wielkości szybsze niż renderowanie programowe i zawsze powinno być traktowane jako opcja podstawowa.

Petr Abdulin
źródło
4
Jeśli akceleracja sprzętowa jest dostępna, czy jest jakaś korzyść z używania SDL_Surface? Np. W przypadku małych operacji renderowania obciążenie związane z przejściem do sprzętu jest zbyt duże?
Timmos
3
@Timmos Renderowanie sprzętowe zawsze będzie szybsze niż oprogramowanie. Jednak powierzchnia oprogramowania ma jedną zaletę: ponieważ jest przechowywana w pamięci głównej dostępnej dla procesora, można bezpośrednio zapisywać w niej dane. Może to być przydatne, jeśli chcesz wygenerować teksturę w czasie rzeczywistym, na przykład jako treść generowaną proceduralnie w grach wideo. (Należy jednak pamiętać, że obecnie wiele rodzajów generowania proceduralnego można również wykonać na GPU za pomocą shaderów.)
cemper93 Kwietnia
1
@Timmos Masz pełną kontrolę nad sposobem pracy nad powierzchniami, generowaniem, pełną kontrolą odczytu i zapisu, mam na myśli naprawdę ... kontrolę daje Ci powierzchnia. OpenGL i takie API są wymagane do pracy z GPU, ponieważ producenci GPU nie pozwalają na bezpośredni dostęp do GPU, dlatego często można usłyszeć, jak ludzie narzekają na nieefektywność z OpenGL lub DX lub po prostu głupie rzeczy, które robią te API, ponieważ oni mogliby napisać coś szybszego lub wydajniejszego, ale nie mogą, ponieważ nie mają dostępu do GPU.
Trevor Hart
Możesz doradzić, dlaczego SDL_FillRectjest to szybsze SDL_RenderFillRect? P: stackoverflow.com/q/65450100/4632019
Eugen Konkov
10

SDL_Texture jest ładowany do pamięci VRAM karty graficznej zamiast zwykłej pamięci RAM.

saloomi2012
źródło
2

Więcej informacji na ten temat można znaleźć w:

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

Jak wspomniano w ostatniej lekcji, tekstury są odpowiednikiem renderowania powierzchni przez GPU. Dlatego tekstury są prawie zawsze tworzone z powierzchni za pomocą funkcji SDL_CreateTextureFromSurface (). Ta funkcja robi mniej więcej to, czego można się spodziewać - parametry to kontekst renderowania i powierzchnia, z której zostanie utworzona tekstura. Podobnie jak w przypadku innych funkcji tworzenia, w przypadku niepowodzenia zwróci NULL.

Mam nadzieję, że Ci to pomoże!

omotto
źródło
2

Powierzchnie używają pamięci RAM, a tekstury używają karty graficznej, która jest szybsza niż powierzchnie.

Evander
źródło