GWT Canvas像素操作非常慢

时间:2012-02-20 03:56:53

标签: 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<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画布进行高效像素操作的想法吗?

感谢。

1 个答案:

答案 0 :(得分:1)

鉴于您已将在Devmode中运行诊断出您的问题,我将在此详细介绍一些解决方案。

首先,就像Strelock评论的那样,Firefox中的DevMode更快。就个人而言,我在Firefox中进行了所有开发。

但是,在开发/测试时,听起来Devmode对你来说是无法管理的。你唯一的选择是编译。值得庆幸的是,我们可以调整一些参数以加快速度,假设你的项目规模合适,可以将其降低到20到40秒。

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

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

让我们创建另一个 com / foobar / MyApplication-Firefox.gwt.xml

<?xml version="1.0" encoding="UTF-8"?>
<module rename-to='myapplication'>
   <inherits name='com.foobar.MyApplication'/>
   <!-- If you want to compile for a different browser, substitute this value. -->
   <set-property name="user.agent" value="gecko1_8"/>
</module>

现在编译时,请确保使用-draftCompile参数。编译版本可能效率稍低,但它会更快地编译。如果您使用默认的 build.xml 文件,则可以添加其他目标,如下所示:

<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>