Різниця між поверхнею та текстурою (SDL / загальне)


83

Хто-небудь може пояснити мені простими словами, в чому різниця між текстурою і поверхнею? Я бачив, як він використовується в SDL2як SDL_Surfaceі SDL_Texture. SDL_Textureстворюється, з SDL_Surfaceякого в свою чергу створюється зображення / растрове зображення. Обидва - це колекція пікселів. Але я не бачу головної різниці між ними (має щось робити з графічним процесором?)

Я спробував погуглити, але всі знайдені мною пояснення були надто складними, щоб зрозуміти їх, не заглиблюючись глибше в комп'ютерну графіку.


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 Шкода, що ти не написав цього у своїй відповіді. Ось ваш шанс.
цього

Відповіді:


84

В основному ваше припущення "має щось робити з графічним процесором?" правильно.

SDL_Surfaceвикористовується при отриманні програмного забезпечення. За допомогою програмного візуалізації, як правильно помітили saloomi2012 , ви використовуєте звичайну оперативну пам’ять для зберігання даних зображень. Таким чином, у більшості випадків ви можете отримати доступ до буфера даних, пов'язаного з поверхнею, безпосередньо, змінюючи його вміст, тобто він використовує центральний процесор, звідси і назва програмного забезпечення .

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

Само собою зрозуміло, що апаратне надання на порядок швидше, ніж програмне забезпечення, і його слід завжди розглядати як основний варіант.


4
Якщо доступне апаратне прискорення, чи є якась перевага у використанні SDL_Surface? Наприклад, для невеликих операцій візуалізації, накладні витрати на перехід на обладнання занадто великі?
Тіммос

3
Апаратне відтворення @Timmos завжди буде швидшим, ніж програмне забезпечення. Однак є одна перевага програмної поверхні: оскільки вона зберігається в центральній пам'яті, доступній для процесора, ви можете безпосередньо писати на неї дані. Це може бути корисно, якщо ви хочете генерувати текстуру в режимі реального часу, наприклад, як процедурно створений вміст у відеоіграх. (Однак пам’ятайте, що сьогодні багато типів процедурної генерації також можна зробити на графічному процесорі за допомогою шейдерів.)
cemper93,

1
@Timmos Ви маєте повний контроль над тим, як поверхню обробляється, генерується, повний контроль читання, я маю на увазі насправді ... контроль - це те, що дає вам поверхня. OpenGL та подібні API необхідні для роботи з графічним процесором, оскільки виробники графічних процесорів не дозволяють прямий доступ до графічного процесора, саме тому ви часто чуєте, як люди скаржаться на неефективність роботи з OpenGL або DX або просто безглузді речі, які роблять ці API, оскільки вони могли написати щось швидше або ефективніше, але вони не можуть, оскільки вони не мають доступу до графічного процесора.
Тревор Харт,

8

SDL_Texture завантажується у VRAM відеокарти замість звичайної оперативної пам'яті.


2

Поверхні використовують вашу оперативну пам’ять, а текстури використовують вашу відеокарту швидше, ніж поверхні.


1

Більше інформації про це є в:

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

Як згадувалося в минулому уроці, текстури - це графічний процесор, що відображає еквівалент поверхонь. Отже, текстури майже завжди створюються з поверхонь за допомогою функції SDL_CreateTextureFromSurface (). Ця функція більш-менш робить те, що ви очікували - параметри - це контекст візуалізації та поверхня, з якої створюється текстура. Як і у випадку з іншими функціями створення, він поверне значення NULL при відмові.

Сподіваюся, це допоможе вам!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.