Разница между поверхностью и текстурой (SDL / общие)

84

Может ли кто-нибудь объяснить мне простыми словами, в чем разница между текстурой и поверхностью? Я видел это использовалось в SDL2качестве SDL_Surfaceи SDL_Texture. SDL_Textureсоздается, из SDL_Surfaceкоторого, в свою очередь, создается из изображения / растрового изображения. Оба представляют собой набор пикселей. Но я не вижу между ними основной разницы (причем тут что-то с GPU?)

Я попытался погуглить, но все объяснения, которые я нашел, были слишком сложными, чтобы понять их, не углубляясь в компьютерную графику.

ps-aux
источник
7
Посмотрите на мой ответ здесь: stackoverflow.com/questions/21007329/what-is-a-sdl-renderer/... Это будет объяснить SDL_Textureи SDL_Surfaceтак же , как SDL_Renderer. В общем, SDL_Textureэто то , что используется для рендеринга, но когда вы загружаете информацию о текстуре с помощью SDL_Imageили SDL_ttf, вы получаете данные какSDL_Surface
olevegard
@olevegard Этот ответ в значительной степени скопирован, мне бы очень хотелось получить ответ с некоторыми знаниями.
это
3
Как вы думаете, SDL_Surfaceэто просто набор пикселей, а SDL_Textureэто an efficient, driver-specific representation of pixel dataозначает, что он может использоваться графическим процессором wiki.libsdl.org/SDL_Texture . Это ответило на ваш вопрос? Вам действительно стоит углубиться в компьютерную графику, чтобы понять больше
olevegard
2
@olevegard Жаль, что вы не написали этого в своем ответе. Вот твой шанс.
это

Ответы:

86

В основном ваше предположение "имеет какое-то отношение к GPU?" верно.

SDL_Surfaceиспользуется в программном рендеринге. При программном рендеринге, как правильно заметил saloomi2012 , вы используете обычную оперативную память для хранения данных изображения. Таким образом, в большинстве случаев вы можете напрямую обращаться к буферу данных, связанному с поверхностью, изменяя его содержимое, т.е. он использует CPU, отсюда и название программного обеспечения .

SDL_Textureс другой стороны, используется при аппаратном рендеринге, текстуры хранятся во VRAM, и у вас нет прямого доступа к нему, как с SDL_Surface. Операции рендеринга ускоряются с помощью графического процессора с использованием внутреннего API OpenGL или DirectX (доступного только в Windows), которые, в свою очередь, используют ваше видеооборудование, отсюда и название аппаратного рендеринга.

Излишне говорить, что аппаратный рендеринг на порядки быстрее, чем программный, и его всегда следует рассматривать как основной вариант.

Петр Абдулин
источник
4
Если доступно аппаратное ускорение, есть ли преимущество в использовании SDL_Surface? Например, для небольших операций рендеринга накладные расходы на аппаратное обеспечение слишком велики?
Timmos 08
3
@Timmos Аппаратный рендеринг всегда будет быстрее программного. Однако у программной поверхности есть одно преимущество: поскольку она хранится в доступной для ЦП основной памяти, вы можете напрямую записывать в нее данные. Это может быть полезно, если вы хотите сгенерировать текстуру в реальном времени, например, как процедурно созданный контент в видеоиграх. (Однако помните, что в настоящее время многие типы процедурной генерации также могут выполняться на графическом процессоре с использованием шейдеров.)
cemper93,
1
@Timmos У вас есть полный контроль над тем, как поверхности обрабатываются, генерируются, полный контроль чтения и записи, я имею в виду, действительно ... контроль - это то, что вам дает поверхность. OpenGL и подобные API необходимы для работы с графическим процессором, потому что производители графических процессоров не разрешают прямой доступ к графическому процессору, поэтому вы часто будете слышать, как люди жалуются на неэффективность OpenGL или DX или просто на глупые вещи, которые делают эти API, потому что они могли написать что-то более быстрое или эффективное, но они не могут, потому что у них нет доступа к графическому процессору.
Trevor Hart
Может посоветуйте, почему SDL_FillRectтогда быстрее SDL_RenderFillRect? Вопрос: stackoverflow.com/q/65450100/4632019
Евгений Конков,
10

SDL_Texture загружается в VRAM вашей видеокарты вместо обычной RAM.

saloomi2012
источник
2

Подробнее об этом можно прочитать в:

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

Как упоминалось в последнем уроке, текстуры - это эквивалент поверхностей при визуализации графическим процессором. Следовательно, текстуры почти всегда создаются из поверхностей с помощью функции SDL_CreateTextureFromSurface (). Эта функция более или менее выполняет то, что вы ожидаете - параметры - это контекст визуализации и поверхность, из которой будет создаваться текстура. Как и в случае с другими функциями создания, в случае ошибки он вернет NULL.

Надеюсь, это вам поможет!

омотто
источник
2

Поверхности используют вашу оперативную память, а текстуры используют вашу видеокарту, которая работает быстрее, чем поверхности.

Эвандер
источник