2009-03-30 12 views
3

Я ищу быстрый и простой способ построения произвольно окрашенных пикселей в холсте SWT. До сих пор я использую что-то вроде этого:Быстрое построение пикселов с использованием SWT?

// initialization: 
GC gc = new GC(canvas); 

// inside the drawing loop: 
Color cc = new Color(display, r, g, b); 
gc.setForeground(cc); 
gc.drawPoint(x, y); 
cc.dispose(); 

Это ужасно ужасно медленно. для заполнения холста 300x300 пикселями требуется около полутора секунд. Я мог бы создать изображение за кадром, установить в него пиксели и затем нарисовать изображение. Это будет быстрее, но я специально хочу, чтобы постепенный эффект рисования изображения пикселя по пикселям на холсте.

ответ

1

Вы можете нарисовать несколько заставку, где вы постепенно заполняете область 300x300. Таким образом вы можете контролировать, как быстро изображение должно появиться.

+0

Это на самом деле то, что я в конечном итоге делает. заполняя линию сканирования за один раз и вытягивая линии сканирования. этот метод примерно в 10 раз быстрее. совершенно удивительно. – shoosh

4

Держу пари, что то, что убивает производительность, выделяет и освобождает 90 000 Color объектов. Помните, что в SWT каждый объект Color выделяет собственные ресурсы, поэтому у вас есть dispose(). Это означает, что каждый раз, когда вы выделяете и удаляете объект Color, вам необходимо перейти с JVM на собственный код и обратно.

Можете ли вы кэшировать свои Color экземпляры в цикле 300x300 пикселей, а затем удалять объекты после цикла? Вам понадобится несколько интеллектуальный кеш, который вмещает максимум столько объектов, и после этого удалит некоторые из его записей, но это должно ускорить работу до значительно.

-3

Создать BufferedImage объект:

BufferedImage bi = new new BufferedImage(300, 300, BufferedImage.TYPE_INT_RGB); 

внутри цикла рисования установить ваши пиксели:

bi.setRGB(x, y, int_rgb); 
... 

и, наконец, отображающие буферизованного изображение:

g.drawImage(bi, 0, 0, null); 

Если вы нашли setRGB () медленно, вы можете напрямую получить данные битмапа:

int[] raster = ((DataBufferInt)bi.getRaster().getDataBuffer()).getData(); 

, а затем

raster[y * 300 + x] = int_rgb; 
+1

'BufferedImage' работает только с AWT/Swing. – pvorb

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

  • Нет связанных вопросов^_^