当前位置: 首页 > 知识库问答 >
问题:

绘制/处理100万个节点

姬熙云
2023-03-14

我正忙于在窗格上绘制节点的练习。我的第一个目标是处理100万个节点,然后将其提升到1500万个。

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

我现在使用一个滚动窗格来实现窗格的平移和查看所有节点。

我觉得用哈希图是个好主意

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

我使用以下代码将节点添加到哈希图:

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);

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

我只绘制阵列列表节点在屏幕上的节点。

我将感谢在这个问题上的一些指导,以及如何处理这样的大数据结构。我是否走在正确的方向上,或者我错过了一个明显的“窍门”去做它。

共有3个答案

桑思远
2023-03-14

您可以尝试使用数据虚拟化和数据提供者来“动态”构建它。不要用你的RAM去装大数据。使用数据库查询。实现您的列表类型,并在那里实现索引器,这将从数据库返回一个项目。

盖嘉庆
2023-03-14

您想要的属于空间分区结构的范畴。

您描述的是一种特殊形式的统一网格或容器。通用版本与您的不同之处在于,每个容器的大小可能超过1个单位,因此更适合不同分辨率的数据集。Bins通常适用于或多或少均匀分布的数据集,而且实现起来也非常简单。查找屏幕元素只需查找视口所属的所有容器。

如果您的数据集是非均匀的,即存在紧密的块和大的空白空间,您可能需要尝试另一种结构,例如四叉树。

此外,如果您使用的是哈希表或任何其他java容器,请使用int,方法是将其装箱成整数(Map

毛勇
2023-03-14

有几点需要考虑:

>

  • 您的节点有多复杂?如果它们只是点,您可以考虑在可写图像上绘制它们并节省大量内存。对于更复杂的情况,您可能需要使用 Canvas。无论哪种方式,您都将节省事件处理程序,属性和其他小东西,这些小东西的计数更大。

    另一件重要的事情是数据视图的相关性。如果你展示一张地图或类似的东西,那么用户只关心可见的部分。其余的可以存储在磁盘缓存中,根据帕累托原理,只有20%的数据会有很大用处。因此,您可以相应地进行规划,只对可见部分使用真正的图形节点(为了用户体验,可能会预加载一些调整过的部分)。

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

    现有的解决方案总是在做大事之前进行调查。例如,有许多像PojoCache这样的缓存库,只有当你将数十亿个节点分成组时,它们才能无缝地允许你处理相关数据。

  •  类似资料:
    • 和BOSSLiu下完棋,绝影虽然赢了,但心情反而很郁闷。这世界上最郁闷的事情就是明明有好事,你非得把它憋在心中,真比憋尿还痛苦。下赢了棋,本来应该是件值得高兴的事,平时任凭你把自己吹得再悬乎,可别人毕竟是外行阿,你说什么西班牙布局西西里防御双马防御,任你说得热火朝天,别人听都听不懂,最后还是只得问:“赢过多少人?” 这时候,绝影只有极不情愿地说:“其实还没赢过,主要没人跟我下……” 虽然你强调的是

    • 我的最后一个想法,我还没有尝试实现,是将鼠标触摸过的像素附加到一个列表中,并从这个列表中绘制每一帧。但对我来说,这似乎相当复杂,因为它可能会导致超长的数组需要在原始图像的顶部进行处理。所以,我希望还有别的办法! 编辑:我的目标是创建一个涂抹画笔,因此画笔是一种复制区域从一个部分的图像到其他部分。

    • 本文向大家介绍利用Python绘制有趣的万圣节南瓜怪效果,包括了利用Python绘制有趣的万圣节南瓜怪效果的使用技巧和注意事项,需要的朋友参考一下 关于万圣节 万圣节又叫诸圣节,在每年的11月1日,是西方的传统节日;而万圣节前夜的10月31日是这个节日最热闹的时刻。在中文里,常常把万圣节前夜(Halloween)讹译为万圣节(All Saints' Day)。 为庆祝万圣节的来临,小孩会装扮成各种

    • 我正在研究一个依赖图,它由多个节点和图中从一个节点到另一个节点的多条有向边组成。 我试图通过添加n个节点作为圆和这些节点之间的边作为线来绘制图形的可视化。 我使用图形库的Java随着JGroup和Jframe。 这是我目前编写的代码: 我能画两个圆和一条线,但我遇到的问题是用一条边连接这两个圆。 我在画布上的随机位置绘制了每个节点,并想在这两个节点之间添加一条线。这条线有Point1(x1, y1

    • 而不是绘制整个代理集(零售商)的汇总平均值

    • > 我有一张NxM大小的原始图像(FigureB-它是原始图像的蓝色香奈儿),从这张图像中我选择一个特定的区域来研究(NewfigureB),大小120x170; 然后我将这个区域划分为我所说的宏像素,即10x10的数据点(像素)阵列; 我然后在所选区域上涂上掩膜,只选择符合一定发光条件的点; 到目前为止,这是我想出来的。如有任何帮助,将不胜感激。 多谢