GWT Canvas пиксель манипулирует ужасно медленно - PullRequest
1 голос
/ 20 февраля 2012

Время выполнения построения пикселя за пикселем холста в GWT чрезвычайно медленное. Для следующего кода двумерный цикл for с вызовами "cpa.set (...)" очень медленный.

...
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 здесь , показывающих, что может быть более эффективно использовать отдельный буфер массива в цикле for, а затем просто установить массив ImageData равным этому буферу, но GWT этого не делает кажется, что это позволяет CanvasPixelArray, вы можете установить только один пиксель за один раз в GWT, а не копировать весь буфер массива пикселей в CanvasPixelArray или ImageData.

Есть идеи для эффективной работы с пикселями с помощью GWT canvas?

Спасибо.

1 Ответ

1 голос
/ 21 февраля 2012

Учитывая, что вы диагностировали свою проблему как Запуск в Devmode , я подробно опишу некоторые решения здесь.

Прежде всего, как прокомментировал Стрелок, DevMode в Firefox намного быстрее,Лично я делаю всю свою разработку в 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>
...