【问题标题】:C++ - fastest sorting algorithm for objects based on distanceC++ - 基于距离的对象最快排序算法
【发布时间】:2013-04-06 16:19:54
【问题描述】:

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

任何帮助将不胜感激。

编辑:很多人都在谈论 z-buffer/depth 缓冲区。这在某些情况下不起作用,就像一些人谈到的那样。这就是我问这个问题的原因。

【问题讨论】:

  • 你知道你不需要对对象进行排序,你可以使用深度缓冲,对吧?
  • 深度缓冲在某些情况下不起作用,例如使用透明纹理时。在这种情况下,我相信您必须对图元进行排序才能获得正确的渲染。
  • 并且你想先绘制前面的对象以快速填充深度缓冲区(当没有透明度时)
  • 我认为渲染场景和进行 z 排序是 openGL 的工作,你为什么要这样做?
  • BSP树可以用来在线性时间内按深度顺序遍历对象。

标签: c++ sorting


【解决方案1】:

按距离排序并不能完美解决透明度问题。考虑两个透明表面相交并且每个表面都有一个离您更近的部分的情况。也许在游戏中很少见,但如果您不希望渲染器偶尔出现故障外观,仍然需要考虑。

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

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

【讨论】:

  • 酷,我不知道顺序无关的透明度......但在 OpenGL ES 中这是不可能的,对吧?
  • 嗯...如果我错了,请纠正我,但我认为递归方法/函数(BSP 树)与迭代相比要慢?
  • @Danny,您没有使用递归调用实现 BSP 树。将它们分析作为递归方法更自然,但您实际上并没有通过递归调用来实现它们,而是使用迭代。
【解决方案2】:

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

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

来自上面的链接:

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

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

【讨论】:

  • ...和 ​​O(n^2) 复杂度,用于未排序的数组。
  • 除了从第一帧开始,由于时间连贯性,您总是会得到一个几乎排序的数组。 en.wikipedia.org/wiki/…
猜你喜欢
  • 2011-11-17
  • 1970-01-01
  • 2011-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多