GWTでキャンバスをピクセル単位で構築する実行時間は非常に遅いです。次のコードでは、 "cpa.set(...)"を呼び出す2D forループが非常に遅いです。GWTキャンバスのピクセル操作が恐ろしく遅い
...
RootPanel.get().add(canvas);
context = canvas.getContext2d();
ImageData id = context.createImageData(canvasWidth, canvasHeight);
CanvasPixelArray cpa = id.getData();
for (int y=0; y<canvasHeight; y++){
for (int x=0; x<canvasWidth; x++){
cpa.set(y*canvasWidth*4 + x*4 + 0,r);
cpa.set(y*canvasWidth*4 + x*4 + 1,g);
cpa.set(y*canvasWidth*4 + x*4 + 2,b);
cpa.set(y*canvasWidth*4 + x*4 + 3,a);
}
}
context.putImageData(id, 0, 0);
たとえば、100x100キャンバスの場合、10秒かかります。私はいくつかの他のjavascriptの投稿で見てきましたhereは、forループで別の配列バッファを使用し、そのバッファと同じImageData配列を設定する方が効率的かもしれないことを示していますが、GWTはCanvasPixelArray CanvasPixelArrayまたはImageDataにピクセル配列バッファ全体をコピーするのではなく、GWTで1度に1つのピクセルしか設定できません。
GWTキャンバスで効率的なピクセル操作を行うためのアイデアはありますか?
ありがとうございました。
GWTキャンバスに関連するものが死んで簡単です(CanvasPixelArrayはそれで何もちょうどオーバーレイタイプです)。バニラJSでこれを行うのと同じくらい速くなければなりません。パフォーマンスを比較するためにvanilla JSで同じコードを試しましたか? – Strelok
はい、GWTのJSNI(ここでは[http://www.onaluf.org/en/entry/13])のようにJSでループするコードを操作するピクセルを置き換えると、ページが即座に読み込まれます。 (Javaのバージョンは非常に遅いので、パフォーマンスを比較するための正確な方法は使用していません.GWT Javaは約10秒です.GWT JSNIは即時です) – aez
コンパイル済みのバージョンを実行していますか?つまり、あなたはDevModeで動作していませんか? DevModeは、このようなことについては悪名高く遅くなる可能性があります。 –