简洁版本:
尽管值略有变化,但我正在寻找一种技术,以随着时间的推移将几乎排序的数据保持在几乎排序的顺序中。
这是场景:
在 3D 图形的世界中,在绘制之前从前到后对对象进行排序通常是有益的。随着您的场景发生变化或您对场景的看法发生变化,这些数据可能需要重新排序,但是它通常会非常接近排序顺序(即,它不会在帧之间发生太大变化)。数据是否完全按排序顺序也不重要。将发生的最糟糕的事情是多边形将被渲染然后完全隐藏。这是一个小的性能打击,但不是世界末日。
考虑到这一点,是否可以提前对数据进行一次排序,然后每帧对数据应用一次最小补丁以确保数据大部分保持排序?在这种情况下,如果大多数对象按升序排列,则认为数据大部分已排序。也就是说,距离正确位置 10 步的1 个对象比距离正确位置 1 步的 10 个对象要好得多(好 10 倍)。
还值得注意的是,数据可以继续半定期修补,因为数据通常每秒渲染 30 次(左右)。只要计算是有效的,它就可以随着时间的推移继续进行,直到更改停止并且列表完全排序。
现有理念:
我对这个问题的下意识反应是:
n log n
在加载数据时对数据进行排序,并对大的更改(我可以很容易地跟踪)进行排序。当数据开始缓慢变化时(例如,当场景旋转时),对数据应用某种类型的单个(线性)传递以向后交换邻居并尝试保持排序顺序(我认为这基本上是 shell 排序 - 也许有用于单次通过的更好算法)。
继续对每一帧进行一次部分排序,直到更改停止并且数据完全排序
返回第 2 步并等待更多更改。