在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 ,您只能在GWT中一次設置一個像素,而不是將整個像素數組緩衝區複製到CanvasPixelArray或ImageData中。
使用GWT畫布進行高效像素處理的任何想法?
謝謝。
GWT的帆布相關的東西是死的簡單(CanvasPixelArray只是一個覆蓋型與什麼也沒有)。應該和在香草JS中做這個一樣快。你有沒有嘗試在香草JS相同的代碼來比較性能? – Strelok 2012-02-20 05:34:32
是的,當我用JS替換像素操作循環代碼時(使用GWT的JSNI,如[這裏](http://www.onaluf.org/en/entry/13)所述),它立即加載頁面。 (由於Java版本速度非常慢,我沒有使用任何準確的方法來比較性能,GWT Java約爲10秒,GWT JSNI是即時的) – aez 2012-02-20 12:21:32
您是否正在運行編譯版本?那就是說,你沒有在DevMode中運行?對於像這樣的事情,DevMode可能會非常慢。 – 2012-02-20 16:02:38