Возможно ли кэширование WebGL Shader? - PullRequest
0 голосов
/ 31 мая 2019

Мой вопрос похож на Сохранение / загрузка скомпилированных шейдеров WebGL , но я не хочу предварительно компилировать мои шейдеры. Вместо этого я просто хочу, чтобы браузер сохранял шейдеры, которые он компилирует дольше, чем по умолчанию. Прямо сейчас, каждый раз, когда я обновляю страницу, шейдеры нужно перекомпилировать.

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

Принимая во внимание ту же комбинацию ОС + браузер + GPU + драйвер, есть ли способ сделать кеш браузера скомпилированным шейдерами таким образом, чтобы компиляция шейдеров не требовалась после каждого обновления страницы?

1 Ответ

1 голос
/ 01 июня 2019

Пользователь не может заставить браузер кэшировать шейдеры. Браузер должен реализовать кеширование шейдеров и решить, когда его использовать. Кроме того, браузер полагается на ОС, чтобы обеспечить способ кэширования шейдеров, поэтому, если ОС не поддерживает его, то, конечно, браузер тоже не может. Например, в настоящее время в MacOS WebGL работает поверх OpenGL, а OpenGL в MacOS не позволяет кэшировать шейдеры.

Например, найдите 'BINARY' в этой официальной таблице возможностей Apple OpenGL , и вы увидите, что количество форматов для кэширования равно 0. Другими словами, вы не можете кэшировать шейдеры OpenGL в MacOS

Я не очень хорошо знаю Metal, возможно, что какая-то будущая версия WebGL будет написана поверх Metal, и, возможно, Metal предоставит способ.

Chrome может кэшировать шейдеры. Вот код для их кеширования . Но не может, если ОС не поддерживает его.

Тогда возникает вопрос, когда очищать или не использовать кеш. Должен ли кеш очищаться, если пользователь нажимает «обновить». Обратите внимание, что «обновление» - это сигнал от пользователя, который НЕ кэширует страницу. Есть много способов вернуться. Во-первых, нажмите ссылку на страницу еще раз, выберите ее из закладки, введите ее в строку URL. Все это не очищает кэш. Нажатие кнопки «Обновить» AFAIK игнорирует кэш по крайней мере для конкретного запроса (т. Е. Самой страницы), но не для вещей, на которые ссылается страница.

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

Что касается Windows, я считаю, что DirectX позволяет кэшировать шейдеры, а Chrome через ANGLE кэширует их. Быстрый тест на Windows, кажется, обнажает это. Переход на shadertoy.com при первой загрузке страницы занимает некоторое время. В следующий раз это не так. Еще один тест. Подбери сложный шейдер на шадертой. Отредактируйте некоторую константу в шейдере, например, измените 1.0 на 1.01 и нажмите кнопку компиляции. Посмотрите на время компиляции. Теперь измените его обратно на 1.0 и нажмите compile. В моих тестах вторая компиляция занимает гораздо меньше времени, предполагая, что шейдер был кэширован.

Понятия не имею, кэширует ли Firefox шейдеры. Safari этого не делает, поскольку он работает только на платформах, которые не поддерживают кэширование.

...