2012-02-20 3 views
1

Время выполнения для создания пикселя по пикселям в GWT очень медленно. Для следующего кода цикл 2D для вызовов с «cpa.set (...)» очень медленный.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?

Спасибо.

+0

GWT связанные холст материал мертв простой (CanvasPixelArray это просто тип оверлея ничего в нем). Должно быть так же быстро, как это делать в vanilla JS. Вы пробовали использовать тот же код в vanilla JS для сравнения производительности? – Strelok

+0

Да, когда я заменяю код манипуляции пикселями с JS (используя JSNI GWT, как описано здесь [http://www.onaluf.org/en/entry/13]), он мгновенно загружает страницу. (Поскольку версия Java настолько ужасно медленная, я не использую точный метод для сравнения производительности. GWT Java - ~ 10 секунд, GWT JSNI мгновен) – aez

+3

Вы используете скомпилированную версию? То есть, вы не работаете в DevMode? DevMode может быть заведомо медленным для таких вещей. –

ответ

1

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

Прежде всего, как отметил Strelock, DevMode в Firefox намного быстрее. Лично я делаю все свое развитие в Firefox.

Похоже, что Devmode будет неуправляемым для вас при разработке/тестировании этого. Ваш единственный вариант - компиляция. К счастью, есть некоторые параметры, которые мы можем настроить, чтобы ускорить его, уменьшив его до отметки от 20 до 40 секунд, предполагая, что у вас есть проект приличного размера.

Учитывая основной ком/Foobar/MyApplication.gwt.xml файл следующим образом:

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

Позволяет создать другой ком/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> 
+0

спасибо, я попробую. Меня сегодня вызвали на Jury Duty (гражданский долг в США), поэтому я попробую, как только меня уволят. – aez

+1

ОК, все работает хорошо. Как выясняется, Firefox работает быстрее в режиме dev, а Chrome быстро развивается в режиме производства, по крайней мере, для этой проблемы манипуляции с пиксельными пикселями. – aez

Смежные вопросы