Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 有没有什么好的技术可以让几乎已排序的数据保持几乎已排序? 简短版本:_Algorithm_Sorting_Opengl_Data Structures_3d - Fatal编程技术网

Algorithm 有没有什么好的技术可以让几乎已排序的数据保持几乎已排序? 简短版本:

Algorithm 有没有什么好的技术可以让几乎已排序的数据保持几乎已排序? 简短版本:,algorithm,sorting,opengl,data-structures,3d,Algorithm,Sorting,Opengl,Data Structures,3d,我正在寻找一种技术,可以在一段时间内保持近似排序的数据以近似排序的顺序排列,尽管值略有变化 以下是场景: 在三维图形世界中,在绘制之前将对象从前到后排序通常是有益的。随着场景的更改或场景视图的更改,此数据可能需要重新排序,但通常会非常接近排序顺序(即,在帧之间不会有太大变化)。数据的排序顺序是否准确也不重要。最糟糕的情况是,多边形将被渲染,然后完全隐藏。这是一个小小的表演热,但不是世界末日 考虑到这一点,是否可以提前对数据排序一次,然后每帧对数据应用一次最小的补丁,以确保数据保持大部分排序?在这

我正在寻找一种技术,可以在一段时间内保持近似排序的数据以近似排序的顺序排列,尽管值略有变化

以下是场景: 在三维图形世界中,在绘制之前将对象从前到后排序通常是有益的。随着场景的更改或场景视图的更改,此数据可能需要重新排序,但通常会非常接近排序顺序(即,在帧之间不会有太大变化)。数据的排序顺序是否准确也不重要。最糟糕的情况是,多边形将被渲染,然后完全隐藏。这是一个小小的表演热,但不是世界末日

考虑到这一点,是否可以提前对数据排序一次,然后每帧对数据应用一次最小的补丁,以确保数据保持大部分排序?在这种情况下,如果大多数对象是按升序排列的,则数据将被视为大部分已排序。也就是说,距离其正确位置10步远的1个对象比距离其正确位置1步远的10个对象要好得多(10倍)

还值得注意的是,数据可以继续进行半定期修补,因为数据通常每秒渲染30次左右。只要计算是有效的,它就可以随着时间的推移继续进行,直到更改停止,列表完全排序

现有想法: 我对这个问题的下意识反应是:

  • 加载数据时,对数据应用
    nlogn
    排序,并对大的更改进行排序(我可以很容易地跟踪)

  • 当数据开始缓慢变化时(例如,当场景旋转时),对数据应用某种排序的单一(线性)过程,以交换向后的邻居,并尝试保持排序顺序(我认为这基本上是shell排序-可能有更好的算法用于此单一过程)

  • 继续对每个帧执行一次部分排序,直到更改停止,数据完全排序

  • 返回步骤2,等待更多更改


  • 从您的描述来看,排序顺序似乎在不更改数据本身的情况下发生了更改。例如,您更改了相机,因此排序顺序应该更改,即使您没有修改任何多边形

    如果是这样,当排序顺序发生变化时,您无法直接检测到它们。如果可以的话,我会为多边形列表创建桶,并在触摸桶中“足够多”的多边形时使用桶

    但我打赌你的系统不会那样工作。排序由视图端口决定。在这种情况下,排序前面的多边形比末尾的多边形更重要

    所以我会把多边形列表分成五分之一或类似的部分。从前到后,使前五分之一是最靠近摄影机的部分。我会对每帧的第一个片段进行完全排序。我会将第二段划分为子段,比如说5段,然后每帧对每个子段进行排序,这样每5帧第二个第五段就被完全排序。将第三段到第五段分割成15个子段,每5帧进行一次,以便每75帧对其余部分进行完全排序。以每秒60帧的速度,显示列表每秒会完全重复一次以上

    排在列表前面的好处是 1.前端的多边形在屏幕上会变得更大,深度测试失败的几率更高。排在清单末尾的坏订单往往并不重要。 2.列表的前面更容易因相机更改而导致排序更改

    还选择了有一点重叠的线段范围,以便多边形可以按2种排序迁移到正确的线段

    @OP:再考虑一下。您可能更关心的是使排序成本保持有界,而不是随着场景复杂性的增加而爆炸。特别是因为一个非常复杂的场景应该——令人惊讶地——不太容易受到不良排序的影响(因为通常多边形会变小)

    您可以定义每帧所需的固定排序量。如果你能负担得起的话,就把50%的预算用于排名靠前的地区,25%的预算用于下一个地区的排序,25%的预算用于其他地区

    假设您预算每帧1000个多边形,场景中有10000个多边形。每帧对前500个多边形进行排序。为下一个区域每十帧排序250个多边形。因此,第1帧为501-750,第2帧为751-1000,等等,然后将列表的其余部分划分为250个帧段,并根据需要的帧数对它们进行循环排序


    这样可以固定排序成本,因为场景变得越来越复杂,而且很容易调整,您只需根据自己的负担调整排序预算即可

    它没有你想象的那么灵巧,因为你所要做的就是将相机旋转90度,而排序的基础完全在不同的轴上。(例如,X轴和Y轴是独立的——向下看X轴会导致排序顺序不依赖于X轴,向下看Y轴会导致排序顺序不依赖于Y轴。)即使是5度的旋转也会导致远处的“关闭”(就Z轴而言)事物突然变得“远”

    老实说,为对象生成draw调用通常要比对其排序花费更多的时间,特别是如果您有一个针对场景的优化排序算法,并且您的游戏具有现代视觉复杂性的话

    排序实际上可以是O(n),尤其是使用基于直方图的算法或基数类型的算法。(是的,基数排序适用于整数,所以您必须将世界坐标缩放到i