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ą.


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.


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.


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!


2

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.