Пользовательский шейдерный материал, который нужно вечно инициализировать? - PullRequest
0 голосов
/ 28 января 2019

Я работаю над проектом raymarched в three.js чуть более года, и по мере увеличения сложности увеличивается и время инициализации.Теперь загрузка проекта в браузере может занять более 40 секунд, однако после загрузки он работает со скоростью + 60 кадров в секунду.Я выследил функцию преступника с помощью тестов производительности, и она, похоже, зависла в функции InitMaterial в библиотеке трех человек.Кто-нибудь имеет какие-либо идеи относительно того, что может быть причиной этого зависания?Лично я считаю, что это может быть связано с количеством униформ, которые мы используем в шейдере, поскольку их довольно много.

Вы можете найти рассматриваемый код здесь .Обратите внимание, что в globalsinclude.glsl находится список униформы.

1 Ответ

0 голосов
/ 29 января 2019

Это вообще проблема с DirectX в Windows.Я подозреваю, что если вы попробуете ту же страницу в Linux или Mac или запустите Chrome с --use-angle=gl в Windows, вы увидите падение времени.

В качестве примера вы можете попробовать этот смешной шейдер ,Компиляция в OpenGL занимает около 3 секунд, но в DirectX браузер, скорее всего, решит, что он занимает слишком много времени, и перезагрузит процесс графического процессора.

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

Говорят о добавлении асинхронных функций компиляции шейдеров в WebGL.Для компиляции шейдеру все равно потребуется 40 секунд, просто он не заблокирует страницу.На данный момент это вряд ли произойдет.

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

...