绘制许多对象到屏幕

问题描述:

我正在研究一个项目,在该项目中我们需要以热图的形式总结大量的数据。这些数据将尽可能保存在数据库中。在某些情况下,我们需要在矩阵中存储一个总结(可能?),然后才能将热点图块绘制到屏幕上。我们正在用C#创建一个Windows窗体应用程序。绘制许多对象到屏幕

让我们假设热图将总结一个在线地图程序(如谷歌地图)的日志文件。它会根据对该区域/地址的请求次数为特定地址或区域分配一种颜色。它可以按照不同的详细程度总结数据。也就是说,热图上的每个块可以汇总特定地址(最大细节,因此数十亿/数百万块)的数据,或者可以汇总对街道,城市或国家的请求(最小细节 - 因为它们很少每个代表一个国家)。想象一下,有数百万个地址请求。我们已经考虑用数据库来总结这一点。问题是我们需要在屏幕上绘制如此多的块(高达数十亿,但通常少得多)。让我们假设这个数据被汇总在一个数据库表中,该数据库表存储了到更大区域的点击次数。我们可以在没有为每个区域构建对象的情况下将块绘制到窗口中,甚至可以从db表中引入所有信息?这是我最关心的问题,因为如果我们构建了一个矩阵,对于一个要求很高的请求,它可能大约为10 GB。

我很想知道我们可以在屏幕上绘制多少个图块,以及最佳方法是什么(即direct3d,XNA)。从上图可以看出,范围会有很大差异,我们预计需要绘制数十亿个方格的潜力。我们将有一个垂直滚动条快速向下滚动以查看其他块。总之,我想知道我们如何用C#来完成这个任务?为苛刻的请求创建矩阵可能需要大约10千兆字节。有没有一种方法可以在屏幕上绘制,而不需要大量的内存(即为每个块创建一个对象)。如果我们可以将SQL查询的结果直接翻译成屏幕上的渲染块,那将是理想的(即不构建对象等)。我们需要的只是正方形,它们唯一的属性是颜色,我们可能需要为每个块保留一个数字。

注意: 我们非常确定我们将如何绘制热图(如何缩放,滚动等应该显示给用户)。为了澄清,我更关心我们如何实现我们的想法。有没有一个库或一些方法可以让我们绘制这么多的对象,而不需要构建十亿个对象并使用千兆字节的数据。每个块基本上是一组像素(20x20),它们是相同的颜色。我不认为这应该需要构建10亿个物体。

谢谢!

+0

考虑到显示器的最大分辨率,可以显示多少“块”的限制。例如。 1280x1024,有1,310,720像素。您永远不需要能够显示/更新。 – 2011-02-27 18:19:34

+0

我不认为这应该是一个问题,因为我们将有一个“垂直滚动条”。它将像网页一样工作。 – user622511 2011-02-27 18:29:23

+0

你这样做是为了人类的眼睛,我想。不要以为人会受到100亿细节的轰炸。 – 2011-02-27 18:35:43

如果这实际上是一个图形热图,那么我同意一个图片至少有780个笔记本电脑屏幕宽是不切实际的。如果你在某个SQL(?)数据库中有这个信息,那么你可以做一个奇特的查询,将你的结果分成一定宽度的桶。数据库应该能够将这些记录有效地聚合成1680(像素宽)桶。此外,如果您的存储桶的固定宽度(产生固定宽度的热图图像),您可以预先为数据库中的“地址”生成存储桶编号。正确索引,按此分组将非常快。

如果您需要查看1:1图像,则可以考虑仅渲染滚动到的图像的一部分。这将显着减少存储当前视图所需的内存量。假设您不需要实际查看全部780个屏幕的数据(特别是如果您将它与上面的“大图片视图”策略结合使用),那么您也可以节省处理时间。

“大图片视图”的聚合函数可能是MAX,SUM,AVG。如果这些功能不合适,请详细解释在热图中要查找的特定功能。

就绘图本身而言,每个盒子不需要“对象”,只需要在图形对象上绘制像素即可。

我觉得你正在寻找的技术叫做“虚拟化”。现在我不是指硬件虚拟化,而是技术,您只需为项目创建具体的可视对象,这些对象是可见的。许多网格和列表使用此技术以正常速度和内存消耗显示数以千计的项目。您也可以在交换具体数据对象时重用这些可视对象。

我也会质疑显示细节的biliions necesity。您应该使它类似于缩放或聚合数据以仅显示少量项目,然后让用户选择特定部分或数据。但我想你有这个想法。