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

Код: java
1.
2.
currentShotArray = new ByteArrayOutputStream();
ImageIO.write(currentShot, "bmp", currentShotArray);
...
Рейтинг: 0 / 0
Можно ли ускорить?
    #37887877
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а какова вообще логика? может можно вынести в отдельный поток все это io? но это в случае если последующая логика не зависит от результата этого вызова
...
Рейтинг: 0 / 0
Можно ли ускорить?
    #37887878
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну или как выход... Каким образом можно передать указатель на bmp данные в библиотеку на C++ через JNI?
...
Рейтинг: 0 / 0
Можно ли ускорить?
    #37887879
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) Задать ожидаемый размер в конструкторе ByteArrayOutputStream
2) Найти более быстрый энкодер, или написать свой
3) Рассмотреть варианты делать тоже самое нативно через JNI
...
Рейтинг: 0 / 0
Можно ли ускорить?
    #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
Можно ли ускорить?
    #37887890
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

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

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

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

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

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


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