3D中哪种噪声更快?Perlin噪声还是Simplex噪声?

4

好的,在网上可以找到很多关于Perlin和Simplex噪声的比较。但是我真的找不到一个简单的处理时间比较,针对的是三维情况,这正是我最感兴趣的。我已经阅读了那份流行的PDF(甚至理解了大部分内容-耶!),但我无法回答一个简单的问题:在假设有最佳实现的情况下,哪个在3D中更快?

这个stackoverflow问题的答案表明,在我的情况下,Simplex是一个相当明显的赢家。当然,还有其他资源声称完全相反。

然而,一般的说法似乎是Perlin噪声具有O(2^N)的复杂度,而Simplex具有O(N^2)的复杂度。对于3D来说,这意味着Perlin为8,Simplex为9。但是,在某些网站上,我发现Simplex实际上是O(N)。因此,这里的真相是什么,这对于3D的速度意味着什么?

我有些困惑,我主要对3D应用程序(包括洞穴的随机地形生成)感兴趣,但是我找不到一个好的答案来回答这个问题:如果我希望它尽可能快,我应该使用哪个?

也许有人可以在这里帮助我 :)


1
维基百科上说单纯形法的时间复杂度是n^2,所以也许你提到的那个答案打错了? - Kromster
完全有可能,是的。不过我更关心这对速度实际上意味着什么。如果你把那些8和9作为唯一的衡量标准,就不会有那么多人声称Simplex更快了。 - TheSHEEEP
3
N代表算法的可伸缩性,但并不涉及其速度。 - Kromster
@Kromster 你是谁点赞的?N确实是一个错误,正如这位作者在这里提到的一样http://webstaff.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf。许多人复制了他的代码和示例,在2012年后他才修复了这些错误。 - Krupip
2个回答

9

1) http://www.fundza.com/c4serious/noise/perlin/perlin.html
2) http://www.6by9.net/b/2012/02/03/simplex-noise-for-c-and-python

使用这两种实现方式,在“我的笔记本电脑”上执行8M个噪声样本的时间如下: (g++ -O6)

1)1.389秒,即每秒5.7M次操作 2)0.607秒,即每秒13.2M次操作

但是...

当真正、真正进行优化时,应该研究:

  • 更高级别的优化(在每个阶段中真正做了什么:有没有替代方案?)
  • 分支
  • 内存模式
  • 依赖性
  • LUT大小
  • 所需的单个算术运算、它们的延迟和吞吐量
  • 利用SIMD的可利用并行性
  • 活跃变量的数量

很好的答案,谢谢!这真的比我预期的要快得多。所以即使你的笔记本电脑不能代表所有的机器,这似乎是令人信服的。当然,你是正确的,除了算法本身,还有更多需要考虑的事情。 - TheSHEEEP
值得注意的是,Simplex噪声是由开发Perlin噪声的同一人设计的,目的是以更高效和无伪影的方式创建具有相同属性的噪声。因此,如果Simplex噪声速度更慢,那将是相当令人震惊的。 - Richard Tingle

2
简单噪声看起来更好,但不一定更快。这完全取决于实现方式。作为一个经验法则,“速度大约相同”,如果您的代码写得好,使用任何一种变体都不应该有太大的惩罚。
请注意,我编写的大部分在互联网上流传的代码并没有针对速度进行优化,而是为了清晰易懂而编写的。Ian McEwan和我几年前编写的GLSL实现已经相当优化了,但它们是为过时的硬件和当时最新版本的GLSL进行优化的。自那以后,GLSL发生了重要变化,包括整数类型和位逻辑操作,这使得某些哈希函数变得笨拙和不必要地复杂。需要置换多项式是由于GLSL缺乏位逻辑运算符所导致的。WebGL中仍然缺少它,但所有其他平台现在都支持整数。
四维简单噪声通常比四维经典噪声更快。其他情况取决于语言、平台和代码优化量。
简单噪声具有简单的解析导数。经典噪声在这方面更加棘手。在许多情况下,例如抗锯齿和地形映射,解析导数非常有用。

你确定你不是指Perlin噪声有一个简单的导数吗?Simplex噪声有定义的解析导数,但它们要理解和推导得多得多,尽管不特别计算昂贵。或者你是把经典噪声等同于值噪声? - Krupip

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接