Что подобное Apple Metal API

    AAEAAQAAAAAAAAbZAAAAJGE5MzJmZTQ1LWUzNDQtNDU4Ny1iMDAzLTQyYzMxYTlkZjRhMg.jpg

    Еще мало-мальски лет назад Apple представила новое графическое API — Metal. Отличие его от такого же Scene Kit было в том, что он явялется не высокоуровневым API, работающим поверх OpenGL ES (подвижной версии OpenGL), а низкоуровневым API для рендеринга и вычислений, который может заступить собой OpenGL. По словам Apple, Metal на порядок быстрее OpenGL ES (право, на деле в 10 раз быстрее происходят только вызовы отрисовки — draw calls, передавание данных на GPU). Этот API доступен для всех устройств, работающих на процессоре A7 и новее, а так же на Mac начиная с 2012 года.

    Принципы работы графических API



    Для начала — что подобное API? Расшифровывается это как Application Programming Interface, программный интерфейс приложения. Разговаривая простым языком — это готовый код, который позволяет существенно облегчить житье программисту при написании программ. По сути это некоторый полуфабрикат — основываясь на текущем коде можно гораздо быстрее и проще написать свою програмку.

    Теперь разберемся с тем, как собственно сам GPU работает с API. Неверно думать, что вызов API откровенно работает с GPU, и тем более неверным является то, что GPU заканчивает обработку вызова при возвращении итога API. К примеру, если бы драйвер выполнял команды рендеринга в тот момент, иногда они были созданы, то простаивал бы CPU, ожидая выполнения рендеринга. А после исполнения было бы наоборот — простаивал бы GPU, ожидая пока придут новые распоряжения от драйвера.

    По этой причине CPU и GPU работают асинхронно: графический драйвер прежде собирает все вызовы отрисовки для всего кадра, и только потом пускает их на GPU. Далее, когда приходит команда на отрисовку следующего кадра, сей кадр уже будет обработан GPU. То есть мы получаем задержку в один эпизод: пока CPU готовит вызов для текущего кадра, на GPU рендерится прошлый. На бою можно буферизировать и больше одного кадра, и тем самым получать огромную частоту кадров: все зависит только от производительности процессора и видеокарты.

    Нововведения в API Metal



    В чем же смотрит в гроб метод, описанный выше? Он плох в том, что между GPU и API есть посредник — парус. И именно он управляет задержками. В API Metal же буферы команд открыты, и программа может само их заполнять и отправлять их в очередь команд для выполнения на GPU. Подобным образом, приложение имеет полный контроль над заданием и может править задержками. Более того — теперь можно легко параллелить правила и помещать их в буфер в определенном порядке, так как для программиста становится более явным то, какие результаты в каком порядке будут доступны. 

    Еще одна важное нововведение уже аппаратное: на процессорах Apple A7 и выше Metal очинен под работу с общей памятью, то есть CPU и GPU могут получать доступ к один-одинехонек данным без необходимости перебрасывать их по шине PCI. Metal дает прямой пропуск для программы к буферам CPU, и программист вполне может «смешивать» вычисления на GPU и CPU, что вероятно существенно ускорить программу.

    Реальный выигрыш от API Metal



    Как я объяснял превыше, каждый вызов отрисовки занимает некоторое время на CPU и GPU. Ренденринг на GPU делать быстрее нельзя по очевидным причинам (он завязан только на производительность наиболее GPU), но можно выиграть в другом: во-первых, можно уменьшить время на передачу предоставленных (так как Metal работает с общей памятью), во-вторых — уменьшить время отделки вызова на CPU. Время обработки вызова на CPU уменьшается за счет отсутствия посредника-драйвера и за кредит параллельного построения буфера команд.

    И тут возникает вопрос — а про какое десятеричное увеличение производительности вела речь Apple? Да вот именно про то, что промежуток времени вызова на CPU теперь сильно меньше. Но вот GPU тут почти не затрагивается, так что в итоге непосредственно улучшить графику за счет API Metal увы — нельзя. Но так как освободился процессор — его дозволено загрузить физикой: обсчетом физики частиц, взаимодействия множества предметов (все помнят сотню летающих обезьян на презентации iPhone 7?), обсчетом результатов ткани и воды, и так далее. И так как этим раньше занимался GPU, то мы его освобождаем, и выходит что косвенно он теперь может выводить лучшую картинку, что мы в играх (в том же Asphalt 8) и видим (обратите внимание на детализацию брусчатки и эффекты):

    Снимок.PNG

    Взаимодействие OpenGL и Metal



    Как следовательно из вышенаписанного — реально Metal улучшает жизнь процессору. Поэтому Когда система не поддерживает Metal, но имеет очень мощный процессор, то специального труда переписать игру под OpenGL нет — и именно это мы и видим в Vainglory под Android — для извлечения максимальной графики (уровень Apple A9) на OpenGL требуется топовый CPU уровня Snapdragon 820, который по голой производительности (во FLOPS-ах) сильнее A9 в два с копейками раза.

    Apple Metal 2



    На июньской презентации Apple показала новую версию Metal. Основные улучшения — это поддержка VR, машинного учебы и внешних GPU, что в теории позволит портировать под Mac игры с PC без всякого ухудшения графики (на переданный момент порты большинства игр представляют собой по сути пуск Wine, что достаточно сильно снижает производительность и очень сильно отображается на и без того достаточно слабых GPU в Mac). Но как это будет реальности — увидим уже только в находящемся.