Яку перевагу мають OpenGL, SFML та SDL перед візуалізацією програмного забезпечення?


24

Я почав дивитися потік Herom Handmade Hero , де Кейсі Мураторі створює ігровий двигун, не використовуючи рамки тощо. Вчора я потрапив до тієї частини, де він показав, як зображення малюється на екрані. Наскільки я зрозумів, він просто виділив пам'ять, велику, як розмір екрана, на який він хоче звернути. А потім він створив растрову карту, яку передав у буферну пам'ять, яку він виділив, і намалював її на екрані за допомогою спеціальної функції os.

Це здається досить прямим вперед. Я використовував GameMaker, перейшов на Love2D, трохи працював зі Sprite Kit, але мені завжди було цікаво, що насправді відбувається під цим часом заплутаним шаром.

З огляду на це, навіщо навіть турбуватися використанням графічних бібліотек (OpenGL, SFML, SDL,…), коли все, що вам потрібно зробити, це просто виділити якийсь буфер, передати растрову карту і намалювати її на екран?

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


11
пізніше у своєму серіалі (близько 220 епізоду) він буде використовувати opengl. Причиною цього є швидкість.
щурячий вирод

5
Хитрість полягає у визначенні того, що намалювати на екрані. Всі матеріали текстури / затінення графічного процесора, трикутники, проекції камери тощо повинні бути виконані спочатку, щоб вирішити, яким кольором повинен бути кожен піксель. Натискання піксельних кольорів на екран - це легка частина.
користувач14146

2
Для запису, SDL та OpenGL не є взаємовиключними. SDL - це "апаратний рівень абстракції", який також обробляє вікна, події та введення, а не просто графічну бібліотеку. SDL також має підтримку, яка використовується разом із OpenGL, тому SDL може виконувати всі не графічні речі, поки OpenGL обробляє графіку. Також зауважте, що найчастіше OpenGL працює безпосередньо з графічним процесором, тоді як SDL може чи не може залежати від версії та системи, для якої складається.
Фарап

SFML використовує OpenGL для візуалізації, тому насправді все SFML - це спростити інтерфейс для використання OpenGL.
Cornstalks

2
Techcnailyl, що робить Кейсі, все ще використовує графічну бібліотеку. Бібліотека називається GDI , і хоча вона є частиною основного API ОС, технічно це все ще бібліотека графіки.
Фарап

Відповіді:


41

Йдеться не лише про швидкість виконання, а й про простоту. Хоча візуалізація програмного забезпечення, що використовується в цьому прикладі, буде набагато повільніше, ніж використання апаратного прискорення (тобто графічного процесора), малювання декількох растрових зображень на екрані є такою тривіальною задачею, що ви не помітили б зниження продуктивності.

Однак активність на низькому рівні, наприклад, трикутник трикутника, сортування глибин тощо, - це добре зрозумілі поняття, з якими GPU може неявно обробляти декілька команд. Повторна реалізація цих програм у режимі програмного забезпечення - це по суті, винахід колеса. Це добре, якщо ви хочете отримати розуміння того, як робиться візуалізація, я сам написав 3D-рендерінг лише для того, щоб трохи його вивчити, але для більшості випадків це марна трата часу, коли OpenGL може це зробити швидше з коробка.

Приклад, який ви подали, звучить надзвичайно елементарно, просто намалювавши одне зображення на екрані, отже, реалізація проста. Як тільки ви почнете розшаровувати складність, ви виявите, що стає все складніше, щоб все правильно відобразити. Те, що людям довелося робити ще в часи Quake 3D-рендерінга програмного забезпечення, було божевільним, хоча я ціную, що ти поки що не йдеш.


12
OpenGL знає такі терміни, як точки, лінії та трикутники. Більшу частину часу ти будеш працювати з трикутниками. Щоб дізнатися, як працювати з OpenGL, я можу порекомендувати opengl-tutorial.org . Щоб дізнатися, що OpenGL робить під кришкою, загляньте в офіційну вікі: opengl.org/wiki/Rendering_Pipeline_Overview
tkausl

1
Я збирався поставити +1, але мені не подобається трохи "винаходити колесо", тому що я вважаю, що це дає неправильне враження з точки зору історії обчислень. Відображення растрових зображень було першим, отже, OpenGL був тим, хто "винаходив колесо". Однак у них були дві вагомі причини: 1) стандартизація та 2) прискорення GPU. Повторно винаходити колесо - це не завжди погано, якщо нова версія - це вдосконалення (тобто колеса з шинами проти дерев’яних колісних коліс). Ключовим моментом тут не повинно бути те, що рендеринг програмного забезпечення відновлює колесо, а воно має поступатись візуалізації GPU.
Фарап

4
@Pharap за винятком того, що зараз написання програмного рендеріра абсолютно винаходить колесо, незалежно від того, чи це було раніше.
porglezomp

1
Це лише половина відповіді. Наступна відповідь - друга половина, але повна відповідь (включаючи трохи пояснення різниці між OpenGL та іншими речами, які він згадує) буде правильною відповіддю на це питання.
Джаспер

1
@ user148013 "Чи знає opengl такі терміни, як точка, лінія, трикутник?" Сучасний OpenGL займається виключно цими примітивами. Ви не можете розсіяти нічого, крім них.
Nax 'vi-vim-nvim'

25

Моє запитання: чому навіть не турбуватися, використовуючи щось на кшталт відкритого gl, sfml, sdl, коли все, що вам потрібно зробити, це просто виділити якийсь буфер, передати растровий малюнок і намалювати його на екран?

Короткий: Тому що його швидко (OpenGL, DirectX).

Довго:

Ви можете подумати, що можете зробити це все самостійно. Намалюйте пікселі на екрані. Ви можете написати невелику бібліотеку для малювання фігур, як квадратики або трикутники. Це, звичайно, спрацює. Є багато бібліотек, які роблять саме це. Деякі з них навіть реалізують специфікацію OpenGL (тому вони схожі на програмне забезпечення для opengl), що буде робити саме те, що робить Кейсі Мураторі. Вони обчислюють все на стороні програмного забезпечення, встановлюють пікселі на стороні програмного забезпечення та записують результат на екран.

Однак це повільно . ЦП, який врешті-решт виконає всі ці речі, не був створений для цього сценарію. Ось для чого призначені графічні процесори. Що робить OpenGL (якщо, звичайно, це не програмне забезпечення), це взяти все, що вам сказати, і натиснути всі дані, всі дзвінки, майже все на відеокарту і сказати GPU виконати роботу. GPU створений спеціально для такої роботи. Множення чисел з плаваючою комою (ось що ви робите багато під час малювання 3D-сцени) та виконання шейдерів. І це паралельно. Тільки для того, щоб ви зрозуміли, наскільки швидкий графічний процесор, подумайте про просту сцену в 3D на повноекранному екрані з 1920x1080 пікселями. Це намальовано 2 073 600 пікселів для малювання. Для кожногопікселів, GPU запустить фрагмент-шейдер принаймні один раз , більшість разів більше, ніж один раз. Тепер, скажімо, ми працюємо зі швидкістю 60 кадрів в секунду. Це означає, що GPU запускає фрагмент-шейдер 2 073 600 * 60 = 124,416 000 разів в секунду . Як ви думаєте, ви можете зробити щось подібне на своєму процесорі? (Це досить спрощене пояснення. Є ще багато речей, які слід врахувати, як, на скільки пікселів ви перевищуєте ближчі об’єкти, скільки MSAA ви використовуєте і так далі, однак 124,416 000 разів за секунду - це, мабуть, найнижчий показник, і ви Ви легко матимете набагато більше 60 кадрів в секунду за допомогою простої сцени)

Це те, що роблять OpenGL та Direct3D, а які двигуни бачать відповідь @Uri Popovs.


8
Він створює 2D гру, це ще одна тема, як 3D. І якщо я кажу повільно, це не обов'язково означає, що у нього менше 60 кадрів в секунду, але це означає, що відеокарта виконає ту саму роботу за частину часу, який потребує процесор, принаймні, якщо мова йде про 3D-просторі.
tkausl

4
Ну і причина GPU краще в тому, що вони створені для паралельного виклику шейдерів.
храповик виродка

4
@ user148013 З того, що я бачив у цього хлопця, я б сказав, що він є прямо протилежною "дуже мудрому".
Bartek Banachewicz

4
Візуалізація не просто повільніше (візуалізація програмного забезпечення Casey була напрочуд швидкою). Це також багато даних, щоб продовжувати натискати від загальної ОЗУ до відео ОЗУ. Притискання гігантської растрової карти до відеокарти, залежно від типу шини, може зайняти значну частину кадру. Використовуючи GPU, ви періодично натискаєте текстури та використовуєте їх для кадру за кадром.
Адріан Маккарті

2
@ user148013 Існує різниця між кричущим та хорошим програмуванням. Вони можуть перетинатися, але часто вони конфліктують. Я поставив би "Я можу відображати програмне забезпечення [точно так, як MESA може ...]" під кричущим, і, звичайно, недобрим .

11

Те, що він робить, називається програмним рендерінгом , те, що робить OpenGL, називається рендерінгом GPU

Яка різниця між ними? Швидкість і пам'ять.

Растерізація (заповнення трикутників на екрані) займає певний час. Якщо ви робите це на процесорі, ви по суті відводите цей час від логіки гри, особливо якщо це не добре оптимізовано.

І не важливо, наскільки зображення мало, йому потрібно виділити певну кількість пам'яті. Для цього GPU мають відеопам'ять.


Чи можливо також відображення програмного забезпечення на OS X? Тому що, здається, все, що стосується графіки, зробив OpenGl зараз Metal.
користувач148013

2
@ user148013 У вас є деякі непорозуміння. OpenGL - це мультиплатформенний API, тому він може працювати на OS X, адже він може працювати на всьому, використовуючи «сучасний» (після 2000 р.) GPU. Metal - це окремий API лише для пристроїв Apple. Візуалізація програмного забезпечення - це теж окрема річ від обох, і так, це можна зробити і на OS X. Це в основному лише встановлення пікселів вручну на екрані за допомогою процесора.
Балінт

Саме тому я запитав, тому що, наскільки я знаю, рендерінг програмного забезпечення не може бути здійснено на OS X. Какао тягнеться до OpenGl, Quarz використовує OpenGl, Core Framework використовує OpenGl. Зараз усі вони використовують Метал як швидше. Але я не знайшов жодної функції, яка малює буфер на екрані без використання GPU (OpenGl, Metal).
користувач148013

1
@ user148013 Оскільки це не характерно для ОС, а також для реалізації. Скажімо, ви хочете реалізувати його в Java, тому що це відомий вибір для розробки багатоплатформ. З java ви можете це зробити, спершу створивши вікно (JFrame), потім замість прямого малювання на ньому малюєте зображення, після чого ставите це зображення на кадр. Однак він не знатиме термінів "трикутник" або "лінія". Тільки кольори. Вам потрібно реалізувати це самостійно за допомогою алгоритму растерізації. Ось чому ми віддаємо перевагу OpenGL, він швидший і трохи простіший у використанні. Це в основному API растерізації.
Балінт

2
@ user148013 Чому вони не могли? Якщо вони можуть відкрити вікно, і вони можуть намалювати на ньому 1 зображення без API, тоді вони можуть.
Балінт

8

Хоча відповіді інших правдивіші за будь-яку відповідь, яку я міг би дати, я хочу вказати на принципове непорозуміння щодо того, як працює розробка програмного забезпечення, яке, на мою думку, лежить в основі вашого питання. Незважаючи на те, що завжди можна робити «самостійно» без рамок, і від цього часто є велика користь для освіти, реальність полягає не в тому, як створюється сучасне програмне забезпечення.

Хтось створив обладнання та мовні машини, які працюють на ньому. Хтось інший створює мови та компілятори вищого рівня, драйвери та операційні системи, графічні бібліотеки та ввімкнення. Кожен з них спирається на роботу своїх попередників. Це не тільки "добре", це вимога.

Ви малюєте лінію того, що "прийнятно" чи ні, у довільній точці ланцюжка інструментів. Ви можете так само легко сказати: «навіщо використовувати C ++, коли ти можеш робити те ж саме в монтажі?», Або «навіщо покладатися на драйвери клавіатури, коли ти можеш так само легко прочитати напруги, що відходять від його проводів, і обчислити їх самостійно». У день не вистачає годин або років у житті, щоб кожен міг все робити сам.

Це стосується не лише розробки програмного забезпечення, але й сучасного життя загалом. Ви коли-небудь чули про хлопця, який сам побудував тостер, з нуля? http://www.thomasthwaites.com/the-toaster-project/ . Це зайняло дійсно багато часу та чимало зусиль. Для тостеру. Спробуйте все побудувати що потрібно для актуалізації відеоігри з ефіру, все самостійно!


2
Я думаю, що це хороша відповідь, оскільки в ньому зазначається, чому використання рамок добре, не принижуючи ідеї винаходити колесо для освітніх цілей.
Фарап

3

Двигуни роблять набагато більше, ніж просто малюють зображення на екрані. Вони обробляють освітлення, тіні, вхід, виявлення зіткнень. Навіть просто частина візуалізації набагато складніше, ніж просто натискання буфера на екран. Особливо для 3d сцен потрібно зробити багато обчислень на набагато складніші дані, ніж растрові. Дозвольте навести аналогію з автомобілем: те, що ви описуєте як просте, - це вихлоп автомобіля. Ви просто зробите трубу потрібного розміру, а потім виштовхуєте газ з одного кінця в інший. Однак це далеко не єдине, що відбувається в механізмі автомобіля.


3

Наведені вище відповіді є чудовими, але насправді жодна не перекриває найважливішу причину того, чому перевагу OpenGL та подібних. Основна причина полягає у використанні спеціального обладнання, призначеного спеціально для роботи з такими речами, як ренделінг мільйонів пікселів на екрані, GPU .

За допомогою програмного рендерингу, використовуючи процесор, візуалізатор буде циклічно, по черзі, за всіма пікселями в растровій карті та видавати накази показувати кожного на екрані. Тож якщо ви надаєте зображення розміром 1000х1000, то для вашого процесора буде 1 000 000 циклів. Зрештою, вони розроблені з урахуванням контролю; багато умов, якщо умови, стрибки з одного набору інструкцій в інший і строгий напрямок потоку управління. Однак графічний процесор розроблений з знаннями, які він буде робити багато подібних циклів за пікселями на екрані.Графічний процесор взяв би цикл із 1000000 ітерацій і розділив роботу на величезну кількість ядер, щоб кожен працював ** паралельно і незалежно один від одного **. Отже, на відміну від процесора, кожен раз, коли GPU наштовхується на умову if-else, він буде обробляти обидві гілки коду на два ядра самого себе, а потім, в самому кінці, він буде дивитися на те, що умова оцінює, і відкидає результат непотрібної гілки (саме тому багато умов "if-else" в шейдерах GPU нахмурилися; вони завжди відповідають за відходи).

Так, так, GPU побудовані навколо паралелізму . Це робить роботу над пікселями для них набагато швидшими порівняно з процесорами.


0

Див. Чи справді мені потрібно використовувати графічний API?

Звичайно, ви можете попросити буфер, встановити в ньому кілька біт і записати його на екран. Це було по суті єдиним способом зробити графічне програмування на ПК до появи графічних прискорювачів у середині 90-х від 3DFX. Навіть у Windows DirectX був розроблений для прямого доступу до відеопам'яті.

Але на апаратному забезпеченні, не призначеному для ПК, спеціалізованих ігрових автоматах, завжди існували методи прискорення графіки, вивантажуючи роботу з процесора. Навіть Atari 2600 мав "апаратні спрайти", почасти тому, що у нього не вистачало оперативної пам'яті для фреймбуфера.

Пізніше (середина 80-х років) ігрові консолі були оптимізовані для ігор на платформах. Знову ж таки, ніякого фреймбуфера; натомість програміст може вказати сітки плиток :

Графічне обладнання Genesis складається з двох площин, що прокручуються. Кожна площина складається з плитки. Кожна плитка - це квадрат 8х8 пікселів з 4 бітами на піксель. Кожен піксель може мати 16 кольорів. Кожна плитка може використовувати 1 з 4 кольорових таблиць, тому на екрані ви можете отримати 64 кольори одночасно, але лише 16 в будь-якій конкретній плитці. Плитки потребують 32 байти. Є 64K графічної пам’яті. Це дозволило б отримати 2048 унікальних плиток, якби пам'ять використовувалася ні для чого іншого.


-2

Сучасні процесори досить швидкі для того, щоб робити будь-яку 2d гру в програмному забезпеченні, тому для 2d графіки OpenGL / DirectX не запропонував би жодних переваг, крім того, щоб додати ще одну залежність та складність шару для вашого проекту, наприклад встановити матрицю 3d проекції, щоб намалювати купу спрайтів та завантаження даних у GPU.

OpenGL також змусить вас упакувати всі свої спрайти всередині текстур 512x512 (артефакт старих консолей, таких як PSX, упаковка графіки на сторінки відеопам'яті), вимагаючи від вас написати досить складний код упаковки спрайт.

З іншого боку, якщо ви робите 3d, створюючи мільйони трикутників зі складним затіненням, то GPU неминучий. Здавна існувала більш проста 2d версія версії Direct3d, звана DirectDraw, яка GPU пришвидшила малювання спрайтів, але тепер Microsoft вже не підтримує це, можливо, тому що процесори досить швидкі, щоб робити 2d без будь-якого прискорення, якщо вам не байдуже енергозбереження .

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