在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画布进行高效像素操作的想法吗?
感谢。
答案 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>