私は現在、HTML5 キャンバス上に多くの 2D パス (数百、数千の小さなセグメントで構成されている)を表示するアプリケーションを作成しています。通常、数百万ポイントです。これらのポイントは、サーバーからバイナリにダウンロードされますArrayBuffer
。
現実の世界ではおそらくそれほど多くのポイントを使用することはないでしょうが、パフォーマンスを向上させる方法にちょっと興味があります. 必要に応じて、それを好奇心と呼ぶことができます ;)
とにかく、私は次の解決策をテストしました:
gl.LINES
またはWebGLを使用gl.LINE_STRIP
して、GPU 上のシェーダーですべてを計算します。現在最速で、Macbook Air でひるむことなく最大10M のセグメントを表示できます。しかし、速度の遅い JavaScript での処理を避けたい場合、バイナリ形式には非常に厳しい制約があります。Canvas2Dを使用して、1 回の呼び出しですべてのセグメントを含む巨大なパスを描画し
stroke()
ます。100kポイントを超えると、キャンバスが更新される前にページが数秒間フリーズします。だから、ここで働いていません。Canvas2Dを使用しますが、各パスを独自の
stroke()
呼び出しで描画します。他の人がインターネットで言っていることにもかかわらず、これは 1 回の呼び出しですべてを描画するよりもはるかに高速ですが、それでも WebGL よりもはるかに低速です。約500k セグメントに達すると、状況が悪化し始めます。
2 つの Canvas2D ソリューションでは、JavaScript のすべてのパスのすべてのポイントをループする必要があるため、これは非常に遅くなります。ArrayBuffer での JavaScript の反復速度、または一般的な処理速度を向上させる方法を知っていますか?
しかし、奇妙なことに、すべてのキャンバス ドロー コールが終了した直後に画面が更新されません。パフォーマンスの限界に達し始めると、描画呼び出しの終了とキャンバスの更新の間に顕著な遅延が生じます。それがどこから来ているのか、それを減らす方法はありますか?