Производительность WebGL в Safari и Apple Vision Pro
Safari — особенно на iOS — всегда считался вершиной вызовов производительности для разработчиков, создающих приложения на базе 3D веб. Реализация WebGL на базе Metal, совместно с уникальными характеристиками производительности WebKit, делает работу с ними особенно интересной.
В этой статье мы предлагаем вам некоторые советы по улучшению производительности ваших приложений WebGL в Safari.
Apple Vision Pro
В последнее время с запуском Apple Vision Pro производительность WebGL в Safari приобрела еще большее значение, поскольку версия Safari от Apple Vision унаследовала все особенности производительности Safari на MacOS и iOS.
Вскоре мы опубликуем полную статью о WebXR с Apple Vision Pro. Подпишитесь на нашу рассылку, чтобы получить уведомление.
Wonderland Engine на Apple Vision Pro
Если вы уже используете Wonderland Engine, у нас есть хорошие новости: все оптимизации, которые мы сделали для нашего релиза 0.9.0, применимы и к Apple Vision Pro.
Разработчики, имеющие доступ к Apple Vision Pro, сообщают о высокой производительности своих приложений на основе Wonderland Engine:
Оптимизация для Safari
Если вы используете другую среду, не забудьте ознакомиться с нашим постом о профилировании производительности WebGL. Этот пост содержит советы о том, как найти узкие места в вашем приложении, чтобы понять, что именно нужно оптимизировать.
Кроме того, вот несколько замечаний о том, что вы можете обнаружить в Safari при профилировании. Это не универсальное решение, профилируйте своё приложение, чтобы выявить, что вызывает проблемы.
Узкие места
Вот несколько характерных проблем, с которыми вы можете столкнуться при работе с WebGL в Safari:
Униформ Буферы
Из-за различий между графическим API Apple Metal и WebGL, Safari приходится эмулировать униформ буферы в стиле WebGL. Эта эмуляция создает трудности в прогнозировании производительности UBO: в одних случаях всё работает нормально, в то время как в других может возникнуть задержка 150 мс при попытке загрузить данные в неподходящий момент времени.
Этот фрагмент кода из реализации Metal в Angle (используемой WebKit для реализации
API WebGL2) указывает на реализацию GLES, эквивалентную
WebGL bufferSubData
.
Он помогает понять, на какие усилия идут разработчики браузеров, чтобы создать согласованный графический API.
Он также показывает, до каких усилий доходит команда Wonderland Engine, чтобы помочь вам понять производительность браузера и оптимизировать её.
Многое вызывало недовольство по поводу долгого времени ожидания поддержки WebGL2 в Safari. Однако, вопреки предположениям, что такая поддержка никогда не будет реализована, они добавили поддержку WebGL2 в сентябре 2021 года с Safari 15. Чтение кода WebKit и Angle вызывает некоторое сопереживание, так как показывает, почему это могло быть трудной задачей.
Доступ к Состоянию WebGL
Функция WebGL getParameter
может преподнести вам несколько неприятных сюрпризов с точки зрения производительности. То, что кажется простым действием, может занять ресурсное время.
Ошибка WebGL
Хотя проверка ошибок с помощью getError
обычно является хорошей практикой, избегайте этого вне вашего frame callback, поскольку это может оказаться более ресурсозатратным, чем следует.
Память и ограничения
WebGL в Safari сообщает об ограничениях на размеры текстур, слоев, размеры униформ буферов и другие. Хорошим инструментом для проверки этих ограничений является webglreport.com.
Хотя в теории Safari позволяет выделять память до этих ограничений, вы можете столкнуться с ситуацией, при которой это приведет к сбою страницы.
Для более эффективного использования памяти на iOS, Wonderland Engine предлагает функцию, называемую Texture Streaming, которая динамически заменяет части текстур в памяти и из неё в зависимости от актуальных нужд в кадре. Эта функция включена по умолчанию.
Заключительные слова
В ближайшее время мы подготовим детальный пост о WebXR на Apple Vision Pro. Подпишитесь на нашу рассылку, чтобы получить уведомление о его выходе.
До тех пор мы надеемся, что вы дадите шанс Wonderland Engine! Особенно если вы уже знакомы с Unity, Wonderland Engine легко изучить.
Не забудьте присоединиться к нашему серверу в Discord, где мы будем рады помочь вам найти нужные ресурсы для начала работы.