各フレームを生の ImageData 形式 (RGBA 順でピクセルあたり 4 バイト) で送信することにより、WebSocket 経由でビデオをストリーミングしています。クライアントで各フレームを ( として) 受け取ったら、 putImageDataArrayBuffer
を使用して、この画像をできるだけ効率的にキャンバスに直接ペイントしたいと考えています。
これは私の現在の解決策です:
// buffer is an ArrayBuffer representing a properly-formatted image
var array = new Uint8ClampedArray(buffer);
var image = new ImageData(array, width, height);
canvas.putImageData(image, 0, 0);
しかし、それはかなり遅いです。理由についての私の理論:
配列 (サイズは ~1MB) は、フレームごとに 3 回、 に 1 回、 に 1 回、最後にキャンバスに 3 回 (1 秒あたり 30 回)
Uint8ClampedArray
コピーされます。ImageData
new
フレームごとに 2 回使用していますが、これはガベージ コレクターにとって問題になる可能性があります。
これらの理論は正しいですか?もしそうなら、これをできるだけ速くするためにどのようなトリックを採用できますか? ブラウザ固有の回答を喜んで受け入れます。