gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:58:01 25 4
gpt4 key购买 nike

我正忙于在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com