只绘制应该在屏幕上的节点?

问题描述 投票:0回答:2

我正在使用场景图(不是画布)在JavaFX中进行模拟,并且我只在屏幕上绘制我需要的问题。

该模拟中有1000万个节点,但用户只需要在屏幕上同时看到这些节点中的一小部分(最多160,000个节点)。我关注的所有节点都是400x400 ImageViews

每个节点都是Group(节点块)的成员,它拥有大约40,000个节点,因此需要一次显示4个或更少的这些“节点块”。对于要显示的这些“节点块”,它们被添加到静态Pane上,并且该窗格位于根节点中,这是一个Group

所以从第一个父项到最后一个孩子的图表看起来像这样:

根节点Group \显示Pane \(很多)Node ChunksGroup \ <= 40,000 ImageViews

由于显示窗格根据用户输入不断移动(平移和重新缩放),并且节点数量很多,因此应用程序不会以我希望的速度运行。有意义的是,JavaFX无法同时跟踪1000万个节点,因此我的解决方案是从显示窗格中删除所有“节点块”;将它们保存在哈希映射中,直到我需要绘制它们为止。

每个“节点块”都将其LayoutX和qazxswpo设置为均匀分布在网格中的显示窗格上,如下所示:

LayoutY

在这个例子中,我需要抓住并显示“节点块”7,8,12和13,因为这是用户所看到的。

这是一个手动添加'node chunk'0的屏幕截图。绿黄色是“节点块”1,5和6的放置位置。

Node chunk display

我的问题是:由于“节点块”没有被添加到显示窗格中,直到需要它们为止,我无法根据用户看到的显示窗格不断变化的部分来引用它们的布局边界,所以我不知道哪个需要显示“节点块”。

有没有简单的方法来解决这个问题?还是我走错了路? (或两者)谢谢。

java javafx nodes bounds
2个回答
1
投票

注意:这不是您确切问题的答案。

我不知道为每个图像创建ImageView的原因是什么。相反,我会为每个nodeChunk(160000个图像)绘制一个图像,并为此nodeChunk创建一个ImageView。

从功能上来说,我看不出这两种方法之间的任何区别(你可以告诉我为什么你想要使用每个imageview)。但通过表现,这种方法非常快速和顺利。

请找到我所说的以下演示。 chunk 1

enter image description here

0
投票

我最终为每个“节点块”创建了一个矩形,将不透明度设置为零,然后检查与用户看到的显示窗格部分的冲突。当发生与矩形的碰撞时,相应的“节点块”将被添加到显示窗格中。

© www.soinside.com 2019 - 2024. All rights reserved.