Самый быстрый способ очистить группу с большим количеством фигур/многопоточностьюJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Гость
 Самый быстрый способ очистить группу с большим количеством фигур/многопоточностью

Сообщение Гость »


В моем проекте JavaFX я использую множество фигур (например, 1 000 000) для представления географических данных (таких как контуры участков, улицы и т. д.). Они хранятся в группе, и иногда мне приходится их очищать (например, когда я загружаю новый файл с новыми географическими данными). Проблема: их очистка/удаление занимает много времени. Поэтому моя идея заключалась в том, чтобы удалить фигуры в отдельном потоке, что, очевидно, не работает из-за однопотока JavaFX.

Вот упрощенный код того, что я пытаюсь сделать:

HelloApplication.java

пакет com.example.javafxmultithreading; импортировать javafx.application.Application; импортировать javafx.fxml.FXMLLoader; импортировать javafx.scene.Group; импортировать javafx.scene.Scene; импортировать javafx.scene.shape.Line; импортировать javafx.stage.Stage; импортировать java.io.IOException; публичный класс HelloApplication расширяет приложение { публичная статическая группа группы = новая группа(); @Override public void start (этап этапа) выдает IOException { FXMLLoader fxmlLoader = новый FXMLLoader(HelloApplication.class.getResource("hello-view.fxml")); Сцена сцены = новая сцена(fxmlLoader.load()); stage.setTitle("Привет!"); stage.setScene(сцена); сцена.шоу(); для (int я = 0; я { System.out.println("Успех"); }); сервис.старт(); } } hello-view.fxml

Я измерил время, необходимое для удаления различного количества детей из группы с помощью group.getChildren().clear():

количество детей | время 100 2 мс = 0,002 с 1 000 4 мс = 0,004 с 10 000 38 мс = 0,038 с 100 000 1273 мс = 1,2 с 1 000 000 149 896 мс = 149 896 с = ~2,5 мин. Как видите, необходимое время увеличивается в геометрической прогрессии. А теперь представьте, что вам нужно очистить дочерние элементы в пользовательском интерфейсе, а пользователю приходится ждать 2,5 минуты приложения, пока оно зависает. Кроме того, в этом упрощенном примере это всего лишь простая линия, в «реальном» приложении — более сложная геометрия -> требует больше времени.

Другая идея заключалась в том, чтобы «отвязать» группу от ее родительской панели — панели. Потому что, когда его отвяжут, я смогу удалить его в другой теме. Это означает: 1. пользовательский интерфейс не зависает и 2. он будет работать быстрее. Это была попытка:

pane.getChildren().remove(group); // или очистить() // а затем очищаем группу в другом потоке, как указано выше Проблема: такая «отвязка» тоже занимает много времени. Не 2,5 минуты, а примерно 0,5 минуты, это все равно много.

Другая идея заключалась в создании нескольких групп, потому что, как видите, группа с 10 000 или 100 000 элементов очищается быстрее. Это также не удалось, потому что некоторые группы неожиданно заняли больше времени и были удалены экспоненциально быстрее. Например, первое занимает 20 секунд, второе 10, третье 5 и т.д.

Короче

Есть ли шанс удалить дочерние элементы группы в отдельном потоке или быстрее, чем с помощью group.getChildren().clear()? Я попробовал все, что пришло мне в голову...

И если бы при удалении я мог показывать только полосу загрузки, это было бы лучше, чем просто заморозить поверхность и ждать 2 минуты...

Я ценю каждую идею/помощь.

РЕДАКТИРОВАНИЕ, см. комментарии Простой пример без FXML:
import javafx.scene.Group; импортировать javafx.scene.shape.Line; тест публичного класса { public static void main(String[] args) { Группа группа = новая группа(); System.out.println("добавляем строки"); для (int я = 0; я
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»