GWT画布像素操作非常慢

GWT画布像素操作非常慢,gwt,html5-canvas,Gwt,Html5 Canvas,在GWT中逐像素构建画布的执行时间非常慢。对于下面的代码,调用“cpa.set(…)”的2D For循环非常慢 ... RootPanel.get().add(canvas); context = canvas.getContext2d(); ImageData id = context.createImageData(canvasWidth, canvasHeight); CanvasPixelArray cpa = id.getData(); for (int y=0; y<canv

在GWT中逐像素构建画布的执行时间非常慢。对于下面的代码,调用“cpa.set(…)”的2D For循环非常慢

...
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); 
。。。
RootPanel.get().add(画布);
context=canvas.getContext2d();
ImageData id=context.createImageData(画布宽度、画布高度);
CanvasPixelArray cpa=id.getData();

对于(int y=0;y,假设您已经诊断出问题是在Devmode中运行的,我将在这里详细介绍一些解决方案

首先,正如Strelock评论的那样,Firefox中的DevMode速度快得多。就我个人而言,我所有的开发都是在Firefox中完成的

尽管如此,在开发/测试Devmode时,Devmode对您来说仍然是不可管理的。您在这里的唯一选择是编译。谢天谢地,我们可以调整一些参数来加快它的速度,假设您有一个相当大的项目,可以将其缩短到20到40秒

给定一个主com/foobar/MyApplication.gwt.xml文件,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<module rename-to="myapplication">
   ...
</module>

鉴于您已将问题诊断为在Devmode中运行,我将在这里详细介绍一些解决方案

首先,正如Strelock评论的那样,Firefox中的DevMode速度快得多。就我个人而言,我所有的开发都是在Firefox中完成的

尽管如此,在开发/测试Devmode时,Devmode对您来说仍然是不可管理的。您在这里的唯一选择是编译。谢天谢地,我们可以调整一些参数来加快它的速度,假设您有一个相当大的项目,可以将其缩短到20到40秒

给定一个主com/foobar/MyApplication.gwt.xml文件,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<module rename-to="myapplication">
   ...
</module>

GWT画布相关的东西非常简单(CanvasPixelArray只是一个覆盖类型,里面没有任何内容)。应该和在vanilla JS中这样做一样快。你在vanilla JS中尝试过相同的代码来比较性能吗?是的,当我用JS替换像素操作循环代码时(使用GWT的JSNI,如上所述),它会立即加载页面。(由于Java版本非常慢,我没有使用任何精确的方法来比较性能。GWT Java大约10秒,GWT JSNI是即时的)您运行的是编译版本吗?也就是说,您没有在DevMode中运行?DevMode在这种情况下的运行速度是出了名的慢。@aez:根据经验,我可以告诉您,在开发模式下的画布比在生产模式(编译)下的画布慢很多。因此,如果您想检查性能,那么请在生产模式下进行检查。@Umit和Danny Kircheir:您是对的,当我部署到app engine时,页面会立即加载!在开发模式下,页面几乎不可用,是否存在任何问题?编译后的版本是否可以在开发模式下使用,或者从定义上看,这是不可能的?谢谢GWT canvas相关的东西非常简单(CanvasPixelArray只是一个覆盖类型,里面没有任何内容)。应该和在vanilla JS中这样做一样快。你在vanilla JS中尝试过相同的代码来比较性能吗?是的,当我用JS替换像素操作循环代码时(使用GWT的JSNI如上所述),它会立即加载页面。(由于Java版本非常慢,我没有使用任何精确的方法来比较性能。GWT Java大约10秒,GWT JSNI是即时的)您运行的是编译版本吗?也就是说,您没有在DevMode中运行?DevMode在这种情况下的运行速度是出了名的慢。@aez:根据经验,我可以告诉您,在开发模式下的画布比在生产模式(编译)下的画布慢很多。因此,如果您想检查性能,那么请在生产模式下进行检查。@Umit和Danny Kircheir:您是对的,当我部署到app engine时,页面会立即加载!在开发模式下,页面几乎不可用,是否存在任何问题?编译后的版本是否可以在开发模式下使用,或者从定义上看,这是不可能的?谢谢ks,我来试试。我今天被要求担任陪审团成员(美国的公民义务),所以我一被解雇就去试试。好的,一切都很好。事实证明,Firefox在开发模式下速度更快,Chrome在生产模式下速度更快,至少在画布像素操作问题上是如此。谢谢,我来试试。我今天被要求担任陪审团成员(美国公民责任)所以我一被解雇就试试。好吧,一切都很好。事实证明,Firefox在开发模式下速度更快,Chrome在生产模式下速度更快,至少在画布像素操作问题上是如此。
<target name="gwtc-firefox" depends="javac" description="GWT compile to JavaScript (for FireFox)">
  <java failonerror="true" fork="true" classname="com.google.gwt.dev.Compiler">
    <classpath>
      <pathelement location="src"/>
      <path refid="project.class.path"/>
      <pathelement location="${gwt.path}/validation-api-1.0.0.GA.jar" />
      <pathelement location="${gwt.path}/validation-api-1.0.0.GA-sources.jar" />
     </classpath>
    <jvmarg value="-Xmx256M"/>
    <arg line="-war"/>
    <arg value="war"/>
    <arg line="-draftCompile"/>
    <arg value="com.foobar.MyApplication-Firefox"/>
  </java>
</target>