我正在尝试渲染一个Mandelbrot集,我很快就意识到不必重新计算每次渲染的最大迭代次数......另一方面它是很多数据保持对...的跟踪。在我看来(基于我对RDMSes的有限经验),关系数据库可能不是可行的方法,因为我不希望随着数据集变大而影响性能。它几乎看起来像哈希表的完美情况,但我以前从未使用过,似乎无法解决如何使用或管理现有的一种Web服务器语言(Python / PHP /无论如何)。
更明确一点:要存储的重要值是:
在任何给定时间,鉴于原始实部,原始虚部,以及最大迭代次数,我会喜欢能够得到最终实部和虚部的结果集。
那你觉得怎么样?哈希表是否可行?这个问题对于凡人数据结构来说是否过于复杂?
任何帮助都将非常感谢。提前谢谢!
修改
我会根据julienaubert的请求解释这个问题。
我的目标是允许用户在没有计算延迟的情况下放大Mandelbrot集(即使是通过预定义的缩放)。我还希望能够在浏览器中执行此操作,该浏览器不断要求服务器提供新的数据数组,以便在复杂的平面上查看新的x和y坐标以及高度和宽度。但是,由于计算像素颜色值可以更快地完成(给定max_iter,real_final和imag_final),并且因为允许用户调整颜色设置会很好,所以我只会发送浏览器在我的帖子中枚举的变量,让用户的浏览器计算颜色。
看看这个:
如果查看drawMandelbrot()函数,可以看到点循环将重要值存储在名为dataset的变量中。然后在drawMandelbrotFromData()函数中使用此变量,在该函数中,它执行计算每个像素颜色所需的剩余计算。
如果单击“cleardabrot”,它将用白色矩形替换画布。如果单击“refilldabrot”,它将再次运行drawMandelbrotFromData()函数...这样做是为了向您显示实际渲染集合的速度,只要它不必执行痛苦的迭代计算。
因此,这里的最终目标是能够将这些值计算为任意精度,因此用户可以缩放到该集合的任何级别,让服务器弄清楚是否存在这些精确点的任何数据(或者,最好是,指向那些精确点附近......虽然我不确定如何在不执行某种范围查询的情况下完成此操作,然后逐个像素地回吐信息。例如......
x = .000001
和y = .0000231
的位置。w = .00045
和h = .00045
他会将这些数字发送到服务器,然后接收一个包含300 * 300索引的数组(一个代表每个点),每个数据包含确定画布上每个像素颜色的必要信息。我的问题是......存储预先计算的Mandelbrot数据的最佳方法是什么,这样用户可以输入任意的x,y,w和h值,并快速拉回复平面上的点的值。范围。
答案 0 :(得分:2)
在任何时候,鉴于原始 真实的部分,原始的想象 部分和最大数量 迭代,我希望能够得到 结果集与最终的真实和 想象中的部分。
从您的问题中不清楚为什么需要这个?为什么需要在同一点重新计算?
如果您正在尝试不同的max_iterations设置,您只需将以每像素级别拍摄的actual_iterations保存在二进制文件,文本文件或图像中,或者任何您方便加载/存储的地方,例如:关系数据库。
如果你正在进行实时渲染,并且你正在使用一些需要重新计算递推方程的处理(在相同的原始点和相同的最大迭代次数),那么我想你可以通过让它加速一张查询表。
显然,您的查找表必须比执行计算更快。您需要一个查找表,以下操作总计少于再次执行计算。
根据您在同一点重新计算/重新访问的方式,您可以将问题划分为极有可能索引位于查找表和查找表中小到足以存储在L1或L2缓存中。
这些是一些想法..但你应该澄清你真正的问题是什么。
如果您需要大量此类数据进行进一步分析,并且实时不是要求,那么......澄清您的真正问题是什么:)
回复更新
它似乎类似于使用地图服务(放大/缩小,四处移动),也就是说,您实际上是在为给定区域提供图像并进行缩放。
但是在这种情况下,由于可以查询任何缩放级别,无论您为一个用户缓存什么,都不能为下一个用户重复使用。我不确定为什么这样做是有意义的,而不是编写用户可以实时缩放的客户端软件(已经完成)。
无论如何。如果您的主要问题是带宽但是您有足够的计算能力,那么您可以将计算出的补丁的图像存储在高度压缩的文件中,质量稍低并缓存这些图像。然后,您可能需要将这些补丁拼接在一起以提供用户想要的确切区域。诀窍是在给定缩放和区域的情况下查询最小的补丁集。
我担心大多数查询会要求不存在的补丁(因为任何缩放级别都是可能的)。也许有关如何例如Google Maps / GIS系统的工作可以为您提供一些想法。如果你的主要问题是CPU,那么也许你可以这样做,让用户在Applet中进行计算(并可能发回结果)
如果你这样做是为了学习如何通过客户端 - 服务器进行缓存/计算,你可能想要考虑一个不同的挑战,因为这个挑战可以在任何体面的计算机上在客户端解决。