Самый быстрый способ очистить группу с большим количеством фигур/многопоточностью ⇐ 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; я
В моем проекте 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; я
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Pythonic способ записать функции/методы с большим количеством аргументов
Anonymous » » в форуме Python - 0 Ответы
- 12 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Исправьте строки файла CSV с большим количеством столбцов, чем другие, в Python
Anonymous » » в форуме Python - 0 Ответы
- 20 Просмотры
-
Последнее сообщение Anonymous
-