Обновить

Я строил не 3D‑мир, а базовый слой под ним: три узких места в браузерном 3D

Время на прочтение7 мин
Охват и читатели5.9K
Рейтинг0
Комментарии3

Комментарии 3

Тема интересна, но через ЛЛМ-слоп стайл не продраться(

Хороший разбор, особенно про visible и onBeforeRender. Про прогрев шейдеров: пробовали KHR_parallel_shader_compile? В WebGL2 компиляцию всех программ можно запустить заранее и опрашивать COMPLETION_STATUS_KHR, тогда долгая рефлексия в ANGLE не блокирует кадр. На нём же построен renderer.compileAsync в Three.js. Интересно, как это соотносится с вашим бюджетом в 170 мс на кадр: на каких машинах он оказался нужен.

Спасибо! KHR_parallel_shader_compile мы используем — весь прелоад построен на renderer.compileAsync. Но оказалось, что расширение параллелит только линковку: дорогая часть — синхронная рефлексия uniform’ов (WebGLUniforms) при первом реальном draw call, 160–340 мс на программу в ANGLE/D3D11 и её нельзя прервать. Поэтому мы перед показом модели принудительно вызываем getUniforms() в рамках бюджета 170 мс/кадр. Замеры — только Windows/ANGLE+D3D11 (GTX 960); вопрос про Metal/Mesa справедливый, там预热, скорее всего, не нужен вообще — планируем делать адаптивный порог.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации