Как узнать, когда WebGL закончил рисовать? - PullRequest
1 голос
/ 08 апреля 2020

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

Я хочу, чтобы мои измерения начались, когда запрос был отправлен, и остановились, как только закончился рендеринг. Пока что мой (возможно, наивный) подход был примерно таким:

ws.send(JSON.stringify(request));
start = performance.now();

ws.onmessage = (d) => {
   ...
   render(d); // here goes some typical plain WebGL code for preparing and plotting a 2D texture on a quad
   end = performance.now();
}
roundtrip = end - start;

Но я не уверен, что это точное измерение и действительно ли end относится к окончательно нарисованному холсту. Есть ли способ получить точный момент, когда кадр был визуализирован? Пока у меня нет типичного рендера l oop, но вместо этого я просто обновляю представление новым кадром, когда новый запрос запущен. Я знаю о gl.finish(), но это не кажется адекватным решением . Я также слышал о WebGLSyn c от API WebGL2, но сначала я использую WebGL1, а во-вторых, это не такая уж сложная проблема ...

1 Ответ

0 голосов
/ 09 апреля 2020

Что вы подразумеваете под "оказанным"? Вы имеете в виду «видимый пользователю» или «пиксели, помещенные в буферный буфер» или что-то еще?

Для «видимого пользователю» способа настройки камеры на другом компьютере не существует. смотреть на свой экран. Там может быть несколько кадров задержки в зависимости от всего, что происходит между WebGL и пользователем. Браузер, сочетающий вещи, будь то браузер с одиночной, двойной или тройной буферизацией. ОС и то, как она объединяет windows, обработку изображения на мониторе или телевизоре, независимо от того, использует ли пользователь HDMI, DisplayPort, VGA, DisplayLink, Airplay, Chromecast

Для "пикселей, помещаемых в буфер", например другой ответ, на который вы ссылаетесь, говорит с использованием gl.finish или аналогичным, как gl.readPixels, не скажет вам, сколько времени что-то заняло. Вместо этого он скажет вам, сколько времени что-то заняло + сколько времени потребовалось, чтобы остановить графический конвейер, и нет простого способа вычесть эту последнюю часть. С другой стороны, вы можете использовать его, чтобы сказать, быстрее ли один способ делать что-либо, чем другой.

...