Чому у нас є такі графічні рамки, як OpenGL та DirectX, коли ігри можуть просто малювати пікселі безпосередньо?


16

Ігри та інші графічно інтенсивні програми використовують такі рамки, як OpenGL та DirectX. Також вони вимагають таких функцій, як піксельний шейдер і DX12.

Але навіщо нам потрібні всі ці рамки та функції графічного процесора, коли ми могли просто намалювати все піксель за пікселем?

По-перше, гра повинна складатись таким чином, щоб вона була намальована пікселем за пікселем. Це, швидше за все, зробить гру великою, але чи буде вона швидшою та працюватиме на будь-якому 32-бітному кольоровому графічному процесорі (навіть на старих)?

Я знаю, що перші 3D-ігри були намальовані пікселем за пікселем, але чому вони не роблять це зараз?


Взагалі, робити одну операцію над багатьма речами є більш ефективною і простішою, ніж думати, ніж робити кожну річ окремо.
користувач541686

2
Тому що кожну гру потрібно було б переписати для кожної відеокарти. Якщо б вони не використовували відеокарту, але тоді вони будуть повільними.
користувач253751

Я думаю, що компанії GPU повинні створити власні драйвери DirectX
Suici Doga

1
"Але навіщо нам потрібні всі ці рамки та функції графічного процесора, коли ми могли просто намалювати все піксель за пікселем?" ось так це було зроблено у добрі дні. Wolfenstein 3D, Doom, Duke Nukem 3D, Quake та більшість інших ігор кінця 90-х використовували чисте програмне відображення (Quake пропонував рендерінг OpenGL як опцію).
el.pescado

1
@MatthewRock Ви не корисні. Ви, звичайно, можете поєднати ОС з грою всередині докерного контейнера і розподілити контейнер. Таким чином, користувачеві не потрібно встановлювати бібліотечні залежності для їх дистрибуції.
Навін

Відповіді:


23

Швидкість - найпоширеніша причина, чому цього не робиться. Насправді ви можете робити те, що пропонуєте, якщо ви зробите свою власну операційну систему, її просто буде дуже повільно з архітектурних причин. Тож припущення, що його швидше, дещо хибно. Навіть якщо це буде швидше, воно було б менш ефективним з точки зору розвитку (наприклад, збільшення на 1% швидкості в 10 разів більше роботи).

Копіювання даних із центрального процесора на відеокарту - відносно повільна робота. Чим менше ви копіюєте, тим швидше може бути швидкість оновлення. Тож в ідеалі ви мали б мати більшість даних у своєму графічному процесорі та оновлювати лише невеликі куски даних. Існує різниця у світі між копіюванням понад 320x200 пікселів порівняно з 1920x1200 або більше. Дивіться, що кількість пікселів, необхідних для оновлення, зростає квадратично, коли збільшуються сторони.

Приклад: дешевше сказати графічному процесору перемістити зображення в 10 пікселів праворуч, ніж копіювати пікселі вручну у відеопам'ять у різних місцях.

Чому вам потрібно пройти API? Просто тому, що це не ваша система. Операційна система не може дозволяти вам робити все, що завгодно, з міркувань безпеки. По-друге, оскільки операційній системі потрібно відмовитися від апаратного забезпечення, навіть ОС розмовляє з драйвером через якусь абстраговану систему, API, якщо ви хочете.

Насправді я би оцінив ймовірність того, що ваша система буде швидшою, якби ви просто виконали всю роботу самостійно, майже до нуля. Це трохи схоже на порівняння C і складання. Звичайно, ви можете писати збірку, але компілятори в наші дні досить розумні і весь час оптимізують все краще і краще. Важко бути кращим вручну, навіть якщо ви зможете, ваша продуктивність знизиться.

PS: API не робить неможливим зробити це оновлення так, як це робили старі ігри. Це просто неефективно. Не через розум API, а тому, що це неефективний період.

PPS: Ось чому вони розгортають Вулкан.


6
See the number of pixels you need to update grows exponetially when the sides grow.Квадратно, я думаю.
Cthulhu

"Копіювання даних із центрального процесора на відеокарту - це відносно повільна робота." Це правда, але не має значення. Скопіювати більше декількох мільйонів пікселів при 60 кадрів в секунду легко досяжно навіть при скромних посиланнях PCI-E (на це потрібно лише кілька сотень мегабайт в секунду.)
Coxy

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

2
х22х

1
Ви говорите про копіювання та переміщення, але найважливіше - власне створення зображення. Ви повинні визначити, який об’єкт буде видно в який момент, як він буде запалюватися, якими будуть наслідки диму тощо, тощо. Графічні процесори вкрай оптимізовані для виконання цих операцій швидко та паралельно. API дозволяє легко виражати звичайні операції.
ІМіль

15

працювати над будь-яким 32-розрядним кольоровим графічним процесором (навіть із старими)?

Трохи історії тут: ось як на ПК працювали ігри, поки в середині 90-х не стали доступні графічні прискорювачі. Це дійсно працювало на всьому апаратному забезпеченні, тому що апаратне забезпечення мало працювало.

Графічний прискорювач дозволяє малювати пікселі значно швидше, ніж процесор, за допомогою спеціалізованого обладнання та паралелізму. Прискорювач містить ряд ядер процесора. Настільний ПК матиме від 1 до 8 ядер залежно від віку. Моя відеокарта GTX970Ti має 1664 (тисяча шістсот шістдесят чотири!) Ядра. Це, очевидно, перемагає ПК за швидку швидкість в режимі сирого часу.

Однак прискорювачі не стандартизовані і часто включають дивні хитрощі комп'ютерної архітектури, щоб досягти їх швидкості. Для того, щоб написати гру, яка не налаштована на конкретний марку та модель картки, API повинен існувати. І саме для цього використовують DirectX, GL та мови шейдерів. Насправді, написання шейдерів є найбільш близьким до написання програми, яка малює пікселі безпосередньо - це просто те, що карта буде паралельно виконувати тисячу примірників цієї програми, по одній на піксель.


APU мого ноутбука має 256 шейдерних ядер @ 686MHZ, а мій планшет - 192.
Suici Doga

Гей, Titan X має 5760 ядер у ньому.
Даніель

@Daniel Чи є ігри, що Titan X надмірно високий <30 кадрів в секунду. Titan X дуже потужний
Suici Doga

Ummm, Одне з таких, можливо: maxpc.com/10-most-graphically-demanding-pc-games
Даніель,

@Daniel Для розробників цих ігор повинно бути близько 2-4 карт Titan X :)
Suici Doga

14

Просто щоб додати відповідь joojaa в , речі будуть по- , як і раніше звертаються піксель за пікселем. Ви просто генеруєте пікселі за допомогою вершинного шейдера / асемблера / растерізатора, потім текстуруєте та освітлюєте їх за допомогою фрагмента шейдера. Це все було зроблено з програмним забезпеченням у 90-х, коли ваша відеокарта була не набагато більше, ніж блистер та рамковий буфер, але це було повільно, як пекло. Звідси винахід сучасних графічних процесорів.

Математика малювання, що відбувається, в основному така ж, як і в дні Doom, але зараз вона працює на сотнях / тисячах шейдерних АЛУ, а не на горщику ядер процесора. API відображаються до того ж набору інструкцій GPU за кадром. Вони якраз там, щоб зупинити вас, коли вам доведеться записати тону складної GPU-монтажу на різних платформах постачальників.

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