Разница между поверхностью и текстурой (SDL / общая)
Может кто-нибудь объяснить мне простыми словами, в чем разница между текстурой и поверхностью? Я видел это используется в SDL2
как SDL_Surface
а также SDL_Texture
, SDL_Texture
создан из SDL_Surface
который в свою очередь создается из изображения / растрового изображения. Оба являются набором пикселей. Но я не вижу основной разницы между ними (что-то делать с GPU?)
Я пытался найти его в Google, но все объяснения, которые я нашел, были слишком сложными, чтобы понять их, не углубляясь в компьютерную графику.
4 ответа
В основном ваше предположение "что-то делать с графическим процессором?" правильно.
SDL_Surface
используется в программном рендеринге. С программным рендерингом, как правильно заметил saloomi2012, вы используете обычную оперативную память для хранения данных изображений. Таким образом, в большинстве случаев вы можете напрямую обращаться к буферу данных, связанному с поверхностью, изменяя его содержимое, т. Е. Он использует ЦП, отсюда и название программного обеспечения.
SDL_Texture
с другой стороны, используется при аппаратном рендеринге, текстуры хранятся в VRAM, и у вас нет прямого доступа к нему, как с SDL_Surface
, Операции рендеринга ускоряются с помощью графического процессора, внутри которого используется API OpenGL или DirectX (доступно только в Windows), которые, в свою очередь, используют ваше видеооборудование, отсюда и название аппаратного рендеринга.
Нет необходимости говорить, что аппаратный рендеринг на порядок быстрее, чем программный рендеринг, и его всегда следует рассматривать как основной вариант.
SDL_Texture
загружается в VRAM вашей видеокарты вместо обычной RAM.
Поверхности используют вашу оперативную память, а текстуры используют вашу видеокарту, которая работает быстрее, чем поверхности.
Больше информации об этом в:
https://thenumbat.github.io/cpp-course/sdl2/05/05.html
Как уже упоминалось в последнем уроке, текстуры являются графическим эквивалентом визуализации поверхностей. Следовательно, текстуры почти всегда создаются из поверхностей, используя функцию SDL_CreateTextureFromSurface(). Эта функция более или менее делает то, что вы ожидаете - параметры - это контекст рендеринга и поверхность, из которой создается текстура. Как и с другими функциями создания, он вернет NULL в случае неудачи.
Я надеюсь, что это поможет вам!