IOS 12 на iPhone X отображает OpenGL ES поверх Metal? И есть ли способ избежать этого? - PullRequest
5 голосов
/ 08 марта 2019

Итак, у меня странная проблема.Я портирую современный исходный порт старого игрового движка на iOS и tvOS.Он был написан с использованием OpenGL, и я нашел fork , в котором используется OpenGL ES, и я смог Франкенштейну объединить эти два варианта с тем, где он на самом деле теперь будет успешно работать на устройствах iOS и tvOS.

Вот странная часть - части игры не отображаются правильно на моем iPhone X, но они корректно отображаются на моем iPad Air 2 и Apple TV (4-го поколения).

Я заметил в потоке сообщений в окне вывода, что место, где движок выводит информацию рендерера, на iPhone X говорит:

OpenGL version: OpenGL ES 2.0 Metal 58.4

, тогда как наскажем, на iPad Air 2 написано:

OpenGL version: OpenGL ES 2.0 A8X GPU - 130.1

"OpenGL ES Metal" для меня звучит как "Jumbo Shrimp", поскольку это, очевидно, не одно и то же.Если бы я догадался, я бы сказал, что на iPhone X драйверы OpenGL ES работают поверх какого-то уровня перевода металла, что может быть долгосрочным планом Apple по созданию своего рода перспективных решений послеOpenGL ES не рекомендуется.

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

Очевидно, что правильный ответ - исправить все, что вызывает проблему, но в качестве кратковременного исправления мне интересно, есть ли способ заставить игру на iOS не использовать OpenGL ES наверх Металла?(если это действительно то, что происходит)


Итак, как сказал Брэд Ларсон ниже, ответы были такими: да, OpenGL ES работает поверх Metal, и нет, его нельзя избежать.Однако для дальнейшего использования, если кто-то еще сталкивается с этой проблемой, я решил реальную проблему с помощью другого SO-ответа:

Фрагментный шейдер WebGL GLSL не работает на iOS

По сути, точность шейдеров с плавающей точкой необходимо повысить с lowp и mediump до highp

1 Ответ

6 голосов
/ 09 марта 2019

Да, OpenGL ES по сути является интерфейсом для Metal в последних версиях iOS (так как я считаю 10, если я не ошибаюсь).

Из ретроспективы Roblox Metal :

Стоит также отметить, что на новейших iPhone нет драйвера GL на iOS 10, по-видимому.GL реализован поверх Metal, что означает, что использование OpenGL действительно экономит вам лишь немного усилий при разработке - не так уж много, учитывая, что обещание «пиши один раз, беги куда угодно», которое есть у OpenGL, на самом деле не работает на мобильных устройствах.

Вы можете убедиться в этом сами, профилировав код OpenGL ES на современных версиях iOS:

Profile of OpenGL ES code, showing AppleMetalGLRenderer

В дополнение к вышеизложенномувы увидите специфичные для металла операции, такие как -[MTLIOAccelCommandQueue submitCommandBuffers:count:], появляющиеся при профилировании ваших приложений OpenGL ES.

Насколько я могу судить, способа обойти это невозможно, это способ рендеринга в современных версиях iOS.,Тем не менее, я не видел, чтобы это изменило поведение моего кода OpenGL ES.Я видел, что разные графические процессоры iOS производят немного другое поведение рендеринга из-за их аппаратного обеспечения, поэтому возможно, что вы сталкиваетесь с чем-то специфичным для устройства.- на ноль в шейдерах и т. д. и посмотрите, не испортил ли один из них ваш рендерингЭто все места, где я видел, как новые поколения устройств нарушают мой рендеринг.

...