Я делаю симуляцию в JavaFX с использованием графа сцены (не холста), и у меня возникают проблемы при рисовании только того, что мне нужно на экране.
Эта симуляция содержит более 10 миллионов узлов, но пользователю нужно видеть только небольшую часть этих узлов одновременно (максимум 160 000 узлов). Все интересующие меня узлы имеют размер 400х400 ImageViews
.
Каждый узел является членом Group
(чанка узла), который содержит примерно 40 000 узлов, поэтому 4 или менее из этих «чанков узла» должны отображаться одновременно. Для отображения этих «чанков узла» они добавляются в статический Pane
, и эта панель находится в корневом узле, который является Group
.
Итак, мой график от первого до последнего потомка выглядит так:
Корневой узел Group
\ Display Pane
\ (много) Куски узла Group
\ <= 40000 <code>ImageViews
Поскольку область отображения постоянно перемещается (панорамирование и масштабирование) в зависимости от пользовательского ввода, и существует так много узлов, приложение не запускается со скоростью, которая мне бы хотелось. Имеет смысл, что JavaFX испытывает проблемы с отслеживанием более 10 миллионов узлов одновременно, поэтому мое решение состояло в том, чтобы удалить все «чанки узлов» из области отображения; сохраняя их в хэш-карте, пока они мне не понадобятся.
Каждый 'узел чанка' имеет свои LayoutX
и LayoutY
s, которые должны быть равномерно распределены по панели отображения в сетке следующим образом:
![Node chunk display](https://i.stack.imgur.com/kJWiF.png)
В этом примере мне нужно было бы захватить и отобразить «чанк узла» 7, 8, 12 и 13, поскольку именно это видит пользователь.
Вот скриншот с добавленным вручную «нод чанком» 0. Зеленовато-желтый цвет - это то место, где размещались бы «узлы» 1, 5 и 6.
![chunk 1](https://i.stack.imgur.com/myGLd.png)
Моя проблема: поскольку «чанки узла» не добавляются в область отображения до тех пор, пока они не понадобятся, я не могу сослаться на их границы компоновки в отношении постоянно меняющегося раздела панели отображения, который видят пользователи, поэтому я делаю не знаю, какие «узлы» должны быть отображены.
Есть ли простой способ решить эту проблему? Или я на неверном пути? (или оба) Спасибо.