Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Можно ли ускорить? / 13 сообщений из 13, страница 1 из 1
21.07.2012, 14:28:44
    #37887874
GorloPavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли ускорить?
В моем коде очень сильно тормозят процесс вот эти строки. Выполняются примерно 400мс. Это очень долго. Можно ли как-то быстрее преобразовать bmp в массив байт? Заранее огромное спасибо!

Код: java
1.
2.
currentShotArray = new ByteArrayOutputStream();
ImageIO.write(currentShot, "bmp", currentShotArray);
...
Рейтинг: 0 / 0
21.07.2012, 14:33:38
    #37887877
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли ускорить?
а какова вообще логика? может можно вынести в отдельный поток все это io? но это в случае если последующая логика не зависит от результата этого вызова
...
Рейтинг: 0 / 0
21.07.2012, 14:33:42
    #37887878
GorloPavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли ускорить?
Ну или как выход... Каким образом можно передать указатель на bmp данные в библиотеку на C++ через JNI?
...
Рейтинг: 0 / 0
21.07.2012, 14:33:56
    #37887879
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли ускорить?
1) Задать ожидаемый размер в конструкторе ByteArrayOutputStream
2) Найти более быстрый энкодер, или написать свой
3) Рассмотреть варианты делать тоже самое нативно через JNI
...
Рейтинг: 0 / 0
21.07.2012, 14:45:00
    #37887886
GorloPavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли ускорить?
Весь код.

забыл ник,

Весь код.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
public class ScreenAnalyzer implements Runnable{

NativeCls compare = new NativeCls();
BufferedImage currentShot = null;//Текушее изображения региона
ByteArrayOutputStream currentShotArray=null;
BufferedImage previousShot = null;//Предыдущее изображение региона
ByteArrayOutputStream previousShotArray=null;
Thread checkTh=null;
Rectangle screen =new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
Robot robot=null;
boolean start = false;

public ScreenAnalyzer() {
	try {
	robot= new Robot();
	previousShot=robot.createScreenCapture(screen);
	previousShotArray= new ByteArrayOutputStream();
	ImageIO.write(previousShot, "bmp", previousShotArray);
	} catch (Exception e) {
	e.printStackTrace();
	}		
}

public void start()
{
	checkTh= new Thread(this);
	checkTh.setPriority(Thread.MAX_PRIORITY);
	start=true;
	checkTh.start();
}

public void run() {
	while(start)
	{
		try
		{
			long start = System.currentTimeMillis();

			currentShot =robot.createScreenCapture(screen);
            
			//Медленно(~500мс)
			currentShotArray = new ByteArrayOutputStream();
			ImageIO.write(currentShot, "bmp", currentShotArray);
                       //Медленно(~500мс)
			
			//Вызов native функции(~30мс)
			List<Rect> rects =compare.sendArray(currentShotArray.toByteArray(), previousShotArray.toByteArray(), (int)screen.getWidth(), (int)screen.getHeight());

			for (Rect rect : rects) {
				Rect rrr= rect;
			}

			if (rects.size() > 0)
			{
				previousShot = currentShot;
				previousShotArray.close();
				
				//Медленно(~500мс)
				previousShotArray= new ByteArrayOutputStream();
				ImageIO.write(previousShot, "bmp", previousShotArray);
				//Медленно(~500мс)
			}

			currentShotArray.close();

			long end = System.currentTimeMillis();

			System.out.print(end-start+"\r\n");
		}
		catch (Exception e) {
		
		}
	}
}

}
...
Рейтинг: 0 / 0
21.07.2012, 14:52:49
    #37887890
GorloPavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли ускорить?
Blazkowicz,

А не подскажете как получить указатель на данные изображения в памяти и передать в JNI? Спасибо!
...
Рейтинг: 0 / 0
21.07.2012, 15:00:36
    #37887894
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли ускорить?
GorloPavelА не подскажете как получить указатель на данные изображения в памяти и передать в JNI? Спасибо!
Т.е. первые два наиболее разумных способа вы просто отмели?
...
Рейтинг: 0 / 0
21.07.2012, 15:03:35
    #37887897
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли ускорить?
Можно попробовать сдампить данные вот так
http://stackoverflow.com/a/2826123
и добавить BMP заголовок, будет BMP без компрессии.
...
Рейтинг: 0 / 0
21.07.2012, 15:07:44
    #37887900
GorloPavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли ускорить?
Blazkowicz,

А вы уверены что это будут сырые данные изображении? BMP заголовок не нужен. У меня всегда смещение 54 байта. Нужны только данные пикселов.
...
Рейтинг: 0 / 0
21.07.2012, 15:20:13
    #37887911
GorloPavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли ускорить?
Blazkowicz,

Метод который вы посоветовали к сожалению не подходит. Там не в BMP формате возвращает.
...
Рейтинг: 0 / 0
21.07.2012, 15:22:36
    #37887914
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли ускорить?
GorloPavelНужны только данные пикселов.
GorloPavelМетод который вы посоветовали к сожалению не подходит. Там не в BMP формате возвращает.
Вы друг с другом сначала договоритесь.
...
Рейтинг: 0 / 0
21.07.2012, 15:24:43
    #37887915
GorloPavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли ускорить?
Blazkowicz,

Ок. Договорился. Нужен BMP массив... Можно без заголовка. Есть варианты? Или придется изобретать через JNI?
...
Рейтинг: 0 / 0
21.07.2012, 16:56:31
    #37887956
GorloPavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли ускорить?
Ускорил в 5 раз! Плюс стал сравнивать не байты BMP, а значения пикселов в int. В итоге размер массива сократился в 3 раза! так как теперь один элемент массива = один пиксель! Но этого недостаточно. Нужно добиться хотя бы 50мс. Сейчас 100 мс.

Код: java
1.
currentShotArray = ((DataBufferInt) currentShot.getRaster().getDataBuffer()).getData();
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Можно ли ускорить? / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]