Вы не можете проверить задержку изнутри браузера.Нет никакого способа узнать, когда изображение действительно появится на экране.Браузер может быть с двойной или тройной буферизацией, сама ОС часто имеет составной шаг и поэтому может добавить кадр, если пользователь находится на телевизоре с интерполяцией кадров, который также может добавить кадр.Возможно, вы на самом деле не имели в виду, что хотите измерить «задержку», но если вы имели в виду «задержку», вы можете сделать это только с внешним оборудованием.
Вы также не можете измерить время рендеринга, используя gl.finish
прямо даже в OpenGL.Вы не будете измерять время рендера.Вы будете измерять «время запуска» + «время рендеринга» + «время остановки», так что вы можете использовать gl.finish
, чтобы узнать, быстрее ли один метод, чем другой, но вы не можете использовать gl.finish
, чтобы узнать, какБыстрый кадр связан с тем, что при нормальной работе графика конвейерная, выполняется через несколько потоков или процессов.Вызов gl.finish
добавляет накладные расходы на синхронизацию тех потоков и процессов, которые могут быть намного больше накладных расходов, чем просто рендеринг.
Вы могли бы потенциально использовать синхронизацию gl.finish для рендеринга наименьшей возможной вещи (один 1 пиксель).треугольник со сплошным цветом).Используйте это, чтобы измерить накладные расходы на «синхронизацию» нескольких потоков и вычесть это время из более длительных периодов времени при более длительных рендерингах, но даже при этом возникают проблемы с графическими процессорами с мозаичной архитектурой, поскольку графические процессоры с мозаичной архитектурой используют методы, позволяющие избежать перерисовки.Другими словами, если вы рисуете 2 перекрывающихся непрозрачных треугольника на традиционном графическом процессоре, каждый пиксель обоих треугольников будет нарисован, но на мозаичном перекрывающемся пикселе будет нарисован только один раз.Это означает, что отдельные чертежи по времени не сообщают вам, насколько они быстры, когда объединены.
В любом случае вы можете смоделировать gl.finish
(остановка всех процессов), вызвав gl.readPixels
для чтения одного пикселя.поскольку для того, чтобы перевести этот пиксель в JavaScript, все процессы должны быть остановлены и синхронизированы.
Как уже упоминалось выше, сначала вы должны нарисовать один пиксель, чтобы измерить издержки синхронизации процессов и вычесть это время.из ваших измерений.
Вы также не должны использовать первые измерения и рисовать несколько раз, потому что многие вещи лениво инициализируются, поэтому ваш первый рендеринг чего-либо может быть медленнее, чем второй рендеринг.
Итакшаги будут выглядеть примерно так:
- init webgl и все ваши ресурсы
- нарисуют один пиксель с помощью простого шейдера
- нарисуйте то, что вы хотите измерить
- gl.readПиксели в один пиксель (чтобы очистить предыдущий материал)
- syncStart = performance.now ()
- рисование одного пикселя простым шейдером
- gl.readПиксели одного пикселя
- syncTime = performance.now () - syncStart
- drawStart = performance.now ()
- нарисуйте объект, который вы хотите измерить
- gl.readПиксели в один пиксель
- renderTime = (performance.now () - drawStart) - syncTime
Шаги 2 и 3 должны заставить любую скрытую инициализацию произойти, поэтому убедитесь, что все ресурсы используются на шагах 2 и 3, все текстуры визуализируются, все буферы доступны, и т. Д ....