Я пишу интерфейсное приложение с Angular и grpc-web stream.Цель состоит в том, чтобы визуализировать полезную нагрузку изображения из потока со скоростью 60-100 кадров в секунду.Ранее он был реализован в WPF, но теперь мне нужно переключиться на веб-интерфейс.Я заметил, что хотя двоичное изображение было передано в браузер, мне все еще нужно создать URL-адрес большого двоичного объекта для загрузки.
Моя текущая стратегия:
URL.revokeObjectURL(this.ImageSrc);
const blob = new Blob([res.getImage_asU8()], {type: res.getType()});
this.ImageSrc = URL.createObjectURL(blob);
Однако,Есть две основные проблемы с производительностью 1. Загрузка процессора очень высока.Я профилировал его с помощью CDT и обнаружил, что new Blob()
составляет больше всего времени сценария.2. Несмотря на то, что объект уже находится в памяти, после того, как я создал URL-адрес большого двоичного объекта, элемент img
, казалось, снова загружал большой двоичный объект из памяти.Из сетевого мониторинга CDT я обнаружил, что для загрузки каждого двоичного объекта в памяти требуется 10-30 мс. (ОБНОВЛЕНИЕ: возможно, из-за того, что CDT замедляет производительность)
Помимо создания URL-адреса для большого двоичного объекта, я также попытался использовать base64 для рендеринга изображения.Изображение имеет размер 800 * 600, монохромный png, и, как и ожидалось, base64 в этом случае не поможет.
Интересно, могу ли я напрямую визуализировать двоичное изображение, переданное потоком, в элемент (img, canvas илиsvg) без создания большого двоичного объекта или повторной загрузки большого двоичного объекта из памяти.Спасибо!
Обновление 10 апреля
Я сделал тестовый проект для сравнения скорости обновления изображения.Я хотел сравнить три варианта использования, но я не знаю, как эффективно декодировать двоичный файл png / jpeg в RGBA в JavaScript браузера, поэтому я пропустил это.
Сравнение нескольких изображений
<img> + createObjectURL:

<canvas> + putImageData:

Таким образом, когда 10 изображений передаются в потоковом режиме параллельно, решение «картинка + блоб» кажется быстрее, чем метод на основе холста.
Сравнение одного изображения
<img> + createObjectURL:

<canvas> + putImageData:

Удивительно, но IMG можно идти в ногу с такой скоростью.Холст кажется слишком тяжелым, чтобы обновлять его с такой скоростью.
Заключение
<img> + createObjectURL
должно соответствовать большинству ситуаций с высоким FPS.** Не доверяйте времени в CDT, потому что CDT замедлит выполнение **.Здесь я не очень тщательно сравниваю, пожалуйста, дайте мне знать, если я не правильно использую элемент canvas.Кроме того, использование кучи для <img> + createObjectURL
намного ниже, чем при использовании canvas, если URL.revokeObjectURL
вызывается во времени.