3D的速度更快? Perlin或Simplex噪音?

时间:2012-10-05 09:40:34

标签: algorithm 3d perlin-noise procedural-generation simplex-noise

好的,在网上可以找到Perlin和Simplex噪音之间的大量比较。但我真的找不到三个维度之间的简单处理时间比较,这是我最感兴趣的。我读过that popular PDF(甚至了解大部分内容 - 耶! )但我无法回答这个简单的问题:假设最佳实现,哪一个更快3D?

stackoverflow question answer表明Simplex对我来说是一个非常明显的赢家。当然,还有其他资源声称完全相反。

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

我在这里不知所措,我真的主要对3D应用程序(包括洞穴的随机地形生成)的使用感兴趣,如果我想要它,我找不到哪个应该使用的问题的好答案尽可能快。

所以也许有人可以帮助我:)

2 个答案:

答案 0 :(得分: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.389s,即每秒5.7M操作数 2)0.607s,即每秒13.2M ops

但是...

当真的,真的要进行优化时,应该研究

  • 更高级别的优化(在每个阶段真正做了什么:有替代方案吗?)
  • 分行
  • 记忆模式
  • 依赖关系
  • LUT尺寸
  • 需要单独的算术运算,延迟和吞吐量
  • 使用SIMD的可利用并行机制
  • 实时变量数

答案 1 :(得分:2)

单面噪声看起来更好,但不一定更快。这一切都取决于实施。根据经验,它是“大约相同的速度”,如果您的代码是好的,那么使用任何一种变体都不会有很大的损失。

请注意,我编写的大部分代码都是在Internet上浮动的,并未针对速度进行优化,而是为了清晰起见而编写的。几年前Ian McEwan和我自己的GLSL实现已针对速度进行了合理优化,但它们针对现已过时的硬件以及当时最新的GLSL版本进行了优化。此后对GLSL的重要更改包括整数类型和逐位逻辑运算,这使得一些散列函数变得笨拙并且不必要地复杂化。由于GLSL中缺少逐位逻辑运算符,因此需要置换多项式。它仍然缺乏用于WebGL的GLSL,但所有其他平台现在都有整数支持。

<4> 4D中的单纯形噪声大多比4D中的经典噪声快。所有其他情况都取决于语言,平台和代码优化量。

单纯形噪声具有简单的分析导数。在这方面,经典噪音更加棘手。在许多情况下,如抗锯齿和地形映射,分析导数非常有用。