java - 绘图/使用 100 万个节点

标签 java javafx-2 javafx nodes

我正忙于在 Pane 上绘制节点的练习。我的第一个目标是使用 100 万个节点,然后将其增加到 1500 万个。

我有一个自定义对象图,我可以向该对象添加边和节点。每个节点对象都有一个我可以调用和绘制的椭圆,与边缘对象相同。 目前我有一个为节点生成随机位置的函数。

我目前正在使用滚动 Pane 来启用围绕 Pane 的平移并查看所有节点。

我认为使用 HashMap 是个好主意

Map<String, ArrayList<Node>> mapX = new HashMap<String, ArrayList<Node>>();
Map<String, ArrayList<Node>> mapY = new HashMap<String, ArrayList<Node>>();

我使用以下代码将节点添加到 HashMap 中:

int  tempXFloor = (int)Math.floor(tempX);
ArrayList<Node> tempList = mapX.get(tempXFloor+"");
if(tempList == null){
tempList = new ArrayList<>();
}
tempList.add(node); 
mapX.put(tempXFloor+"",tempList);

然后当我平移时,我得到当前位置,将其放置并检查 map 中是否存在条目。如果条目存在,我将 ArrayList 中的所有节点添加到 nodesOnScreen。 nodesOnScreen 是一种 ArrayList 类型,我将在平移时将节点添加到该列表,同样,屏幕外的节点将从 nodesOnScreen 变量中删除。

我只绘制 ArrayList nodesOnScreen 中的节点。

我会很感激在这件事上的一些指导,以及如何处理这样的大数据结构。我是在朝着正确的方向前进,还是错过了一个明显的“技巧”。

最佳答案

有几点需要思考:

  1. 您的节点有多复杂?如果它们只是点,您可以考虑将它们画在 WritableImage 上并节省大量内存。对于更复杂的情况,您可能需要使用 Canvas .无论哪种方式,您都将节省事件处理程序、属性和其他重要的小东西。

  2. 另一个重要的问题是数据 View 的相关性。如果您展示 map 或类似的东西,那么用户只关心可见部分。其余的可以存储在磁盘缓存中并通过 Pareto principle只有 20% 的数据会有很大用处。因此,您可以相应地进行规划,只为可见部分设置真正的图形节点(并且可能为了用户体验预加载一些调整后的部分)。

  3. “分而治之”的概念。即使您不想根据计划 (2) 限制用户 View ,您也不可能一直需要 1500 万个节点。不在 UI 库中,恐怕没有足够大的显示器。因此,将您的数据分成多个段并一次加载一个段。如果您需要对整个集合执行任何类型的计算 - 不要使用节点,使用最简单的实现并在某些后台进程中执行计算。

  4. 现有解决方案始终是在做大事之前进行调查的问题。比如有很多像PojoCache这样的缓存库仅当您将数十亿个节点分成组后,它才允许您无缝地处理相关数据。

关于java - 绘图/使用 100 万个节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13933724/

相关文章:

java - 如何将 Java Map 序列化为 PHP 的数组序列化格式

java - Android 跟踪 Azure CloudBlockBlob 上传进度

java - 如何将 JavaFX 与 Java Swing 应用程序集成?

java - MPAndroidChart - 条形图未显示所有 X 轴标签

java - 在 Firestore 中获取服务器时间戳时出错

performance - JavaFX 2 绘图性能

layout - 如果嵌入 Pane 中,自动调整折线图大小会失败

JAVAFX 在 FXML Gridpane 中添加动态元素

javafx - JxBrowser HEAVYWEIGHT 在 WINDOW_CLOSE_REQUEST 上处置

javafx : how to show String in TableView