Metal, новий графічний API для iOS 8

       
Настають чудові часи для графіки на iOS 8!
 imageНа нещодавній WWDC компанією Apple був представлений новий графічний API під назвою Metal, відмітною особливістю якого стала висока ефективність, низький рівень витрат і оптимізація під чіп A7. Це надає розробникам можливість скористатися всіма апаратними перевагами пристроїв на iOS і домогтися набагато більшого рівня реалістичності, деталізації та інтерактивності в іграх, ніж коли б то не було.
В даний момент процес реалізації підтримки Metal вже запущений, а поки ми б хотіли розповісти вам дещо про цю технологію і пояснити, чому ж це так круто.
 
 
Глянцевий Метал
У Metal закладено кілька ключових моментів, що дозволяють знизити завантаження CPU, прорахувати його продуктивність в певних умовах і оптимізувати всі процеси:
 • Створення і перевірка попередніх компонентів отрисовки. Шейдери можуть компілюватися і частково оптимізуватися в автономному режимі. Все, що пов'язано з рендерінговим Пайплайн: шейдери, вертекстние компоновки, режими блендінга, формати рендер Таргет і т.д. можуть бути створені і підтверджені ще навіть до того, як почнеться, власне, сам рендеринг. Тобто не треба перевіряти кожну складову отрисовки і потужність CPU вивільняється для інших цілей.
 • Обсепеченіе на порядок більш гнучкою багатопоточності. Ресурси можуть створюватися з будь-якого потоку, і доступний ряд можливих способів підготувати заявку на отрисовку з декількох паралельних потоків.
 • У всіх пристроїв на базі iOS єдина пам'ять для CPU і GPU. Немає необхідності уявляти, що дані з CPU повинні бути'' скопійовані'' в якусь відеопам'ять. Коли ви створюєте буфер обміну, то треба всього лише вказати, що в ньому знаходяться дані, і це рівно та ж пам'ять , яку буде використовувати і GPU.
 • Дайте користувачеві (движку) здійснювати синхронізацію. OpenGL ES стрибав через безліч милиць і про багатьох моментах'' здогадувався'', для того, щоб можна було реалізовувати всі можливі сценарії. У Metal синхронізація даних між CPU і GPU є прерогативою користувача. Движок адже і насправді краще знає, що йому треба робити!
 • Всі GPU в iOS-пристроях використовують архітектуру відкладеного рендеринга на основі тайлів. Це в ясному вигляді використовується в Metal API, особливо коли мова йде про цілі рендеринга. API тепер не намагається нічого передбачити — всі дії з буфером кадрів, типу завантажень і збережень тайлів, та реалізації згладжування, відбуваються в явному вигляді.
 • Всі пункти, перераховані вище, необхідні для того, щоб можна було значно знизити навантаження на процесор і набагато більш чітко прогнозувати ступінь його продуктивності і завантаження.
 • Нова мова на базі C / C + +11 призначений як для графічних, так і для обчислювальних шейдеров. А це означає, що iOS буде вміти працювати з обчислювальними шейдерами, атомарний, довільної записом у буфер та іншими фішками з прикольними назвами, які зараз доступні на GPU.
 • Ніякої поганої спадковості, новий API дуже простий і відмінно оптимізований. А, і ще у нього є супер-корисний опціональний'' шар налагодження'', який додатково все перевіряє і повідомляє про будь-яку помилку або омані, які ви зробили.
 
 А тепер давайте заглибимося в деталі ще глибше!
 
 
Питання заявок на отрисовку
Якщо ви займаєтеся створенням ігор, особливо для мобільних пристроїв, то напевно знаєте, що велика кількість заявок на отрисовку сильно навантажує процесор. Кожен і будь-який об'єкт рендеринга вимагає для себе деяку кількість процесорної потужності, і в реальності на мобільних пристроях ви не зможете одноразово реалізувати отрисовку більше декількох сотень видимих ​​об'єктів за один раз. У реальності ж ви напевно дуже захочете використовувати ресурси CPU і для інших потреб — геймплейная логіка, фізика, AI, анімацію персонажів і все інше. У Unity є якісь оціночні параметри для мінімізації кількості зроблених заявок на отрисовку — статичний і динамічний батчінг (або смішний російськомовний термін -'' дозування'' — прим. Перекл.), Occlusion culling (ще один смішний термін'' окклюзівном обрізання'' — прим. перекл.), LOD (рівні деталізації) і distance-based layer culling (видалення шарів в залежності від їх віддаленості); крім того, можна об'єднувати близькі об'єкти, які стоять один поруч з одним, і поміщати текстури в атласи для зменшення кількості матеріалів.
Хороший питання полягає в тому, чому повинен використовуватися ресурс CPU, щоб щось малювати? Зрештою, це ж те, чим реально повинен займатися GPU.
Деякі витрати відбуваються на стороні'' движка'' — процесору необхідно управляти видимими об'єктами, з'ясовувати, який шейдер зараз треба рендерить, з яким із об'єктів якого джерела світла необхідно взаємодіяти, який параметр матеріалу зараз треба застосувати і таке інше. Щось з цього закешовану, щось виконується в декількох потоках; і в цілому, це незалежний від платформи код. У кожному релізі Unity ми намагаємося оптимізувати цю частину, і Metal, загалом, на це ніяк не впливає.
Однак, в решті частини процесорних витрат можна викрити саме'' графічний API і драйвер''. Залежно від гри, ця частина може бути дуже важливою. Metal — це спроба вирішити питання з цією частиною, будучи набагато більш підходящої для сучасного заліза, на дещо нижчому рівні, і виконуючи жахливо меншу кількість здогадок, ніж зазвичай робив OpenGL ES. Попереджуючий рендеринг, його створення та валідація; явна завантаження і збереження рендер-Таргет; відсутність тацев з бубнами для синхронізації на стороні API — всі ці речі сприяють зниженню навантаження на процесор.
Наскільки ми вже встигли протестувати, нові API + драйвер завантажують CPU всього лише на кілька відсотків. Це істотне зниження, особливо в порівнянні з тим, що раніше цей показник був на рівні 15-40% від повного завантаження CPU! Це означає, що решта ховається десь у нашому коді. І мені здається, що нам треба продовжувати його оптимізацію (смайл).
Ну і не терпиться познайомитися з можливостями Metal з об'єднання рендеринга з декількох потоків; це також відкриває для нас дуже цікаві можливості для оптимізації.
 
 
Можливості обчислень
Завдяки Metal можна буде використовувати GPU для обчислень за межами типових сценаріїв: не тільки для вершинних + фрагментарних шейдеров — але й для шейдеров, відомих під назвою "обчислювальні". В принципі, це дає можливість запускати будь-який тип'' паралельних обчислень'' на безлічі маленьких процесорів всередині GPU. Обчислювальні шейдери так само використовують концепт'' локального сховища'' — дуже швидкої виділеної частини пам'яті-на-GPU, яка може бути використана для обміну даними між паралельними робочими елементами. Така ділянка пам'яті дозволяє використовувати GPU для речей, які дуже не просто було б реалізувати за допомогою старих добрих вершинних і фрагментарних шейдеров.
Є купа цікавих областей, для яких можна буде використовувати обчислювальні шейдери — оптимізація пост-процесингових ефектів, системи частинок, робота з вибірками і відрізанням світла і тіні, і все в цьому дусі.
Водночас, в Unity поки ще не використовуються обчислювальні шейдери, ми всі з нетерпінням чекаємо, що їх можна буде вжити для безлічі, величезної безлічі класних штук. Захоплюючі часи грядуть!
 
 
FAQ
 Коли я зможу цим скористатися?
Нам не терпиться почати відвантаження, але назвати конкретних дат ми поки не можемо. Ми вже зробили багато чого, але потрібно ще працювати і працювати до того, як все буде готово. Наш поточний план — інтегрувати всі частини Metal, що забезпечить потужний приріст продуктивності процесора. Сподіваємося, що це відбудеться в Unity 5.0. А трохи пізніше ми хочемо додати підтримку обчислювальних шейдеров (цей момент трохи складніше і тред більшої уваги з нашого боку).
 
 Які будуть системні вимоги?
Metal працюватиме на iOS 8 і пристрої з процесором не слабкіше A7 (iPhone 5S, iPad Air, iPad Mini Retina).
 Що мені потрібно буде зробити, щоб отримати переваги від оптимізації завантаження CPU за допомогою Metal?
Загалом, нічого. Як тільки ми додамо підтримку Metal в Unity, все запрацює само. Всі ваші існуючі проекти, всі ваші шейдери і графічні ефекти будуть просто працювати. Просто насолоджуйтеся низьким рівнем завантаження процесора!
 
 Але що з приводу шейдеров, адже в Metal для них використовується інша мова?
Ми подбаємо і про це. Зараз ви, швидше за все, пишете шейдери на Cg / HLSL, а ми конвертуємо це в GLSL для OpenGL ES за лаштунками. Для Metal ми будемо конвертувати все це приблизно таким же чином.
 
 Ще разок, що ж мені можна буде зробити завдяки тому, що завантаження CPU буде оптимізована, і у мене з'являться вільні ресурси?
Поліпшити фізику, AI або зробити ще складніше і комплексніша логіку і геймплей. Розмістити і отрісовать більше об'єктів на екрані. Або просто насолоджуватися економією акумулятора пристрою. Все залежить від вас!
  
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.