C ++ - 基于距离的对象最快排序算法

时间:2013-04-06 16:19:54

标签: c++ sorting

我正在尝试使用openGL制作游戏或3D应用程序。游戏/程序中将包含许多对象并被绘制到屏幕上(大约7000个)。当我渲染它们时,我需要计算相机和物体之间的距离并对它们进行排序,以便正确渲染场景中的物体。了解这一点,对它们进行排序的最佳方法是什么?我真的希望排序能够快速完成,但我听说他们有“权衡”,那么我应该使用什么算法来获得最佳性能呢?

非常感谢任何帮助。

编辑:很多人都在谈论z缓冲区/深度缓冲区。这在一些人谈论的某些情况下不起作用。这就是我问这个问题的原因。

2 个答案:

答案 0 :(得分:8)

按距离排序并不能完全解决透明度问题。考虑两个透明表面相交的情况,每个表面都有一个更靠近你的部分。在游戏中可能很少见,但如果你不想让你的渲染器偶尔出现闪烁的外观,还需要考虑一下。

更好的解决方案是与订单无关的透明度。使用支持原子操作的最新图形硬件,您可以使用A缓冲区以很少的内存开销和单次传递来执行此操作,因此它非常高效。请参阅示例this article

对场景进行排序的问题仍然是有效的,即使它不是为了透明度 - 从前到后对不透明对象进行排序仍然很有用,以允许深度测试来丢弃看不见的片段。为此,Vaughn提供了BSP树的绝佳解决方案 - 只要3D游戏出现,这些就已经用于此目的。

答案 1 :(得分:0)

对于几乎排序的arrray使用具有O(n)复杂度的http://en.wikipedia.org/wiki/Insertion_sort

在您的情况下,通过利用时间内聚插入排序可以获得最快的结果。 它用于http://en.wikipedia.org/wiki/Sweep_and_prune

从上面的链接:

  

在许多应用程序中,从一个时间步到下一个步骤的物理实体的配置变化很小。许多物体可能根本不会移动。设计算法使得在前一时间步骤中完成的计算可以在当前时间步骤中重复使用,从而更快地完成计算。

所以在这种情况下插入排序是最好的(或者在最好的情况下与O(n)类似)