5

好的,网上有很多 Perlin 和 Simplex 噪声的比较。但是我真的找不到一个可以在三个维度之间进行简单处理时间比较的文件,这是我最感兴趣的。我读过那个流行的 PDF(甚至理解了其中的大部分内容——耶!)但是我无法回答一个简单的问题:假设最佳实现,哪一个对于 3D 来说更快?

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

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

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

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

4

2 回答 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.389s 即每秒 5.7M 操作 2) 0.607s 即每秒 13.2M 操作

但...

当真的,真的要进行优化时,应该学习

  • 更高级别的优化(每个阶段真正做了什么:有替代方案吗?)
  • 分支机构
  • 记忆模式
  • 依赖项
  • LUT 尺寸
  • 需要单独的算术运算,它们的延迟和吞吐量
  • 使用 SIMD 的可利用并行性
  • 活变量的数量
于 2012-10-05T13:50:22.283 回答
2

单纯形噪声更好看,但不一定更快。这一切都取决于实施。根据经验,它“速度差不多”,如果你的代码很好,使用任何一种变体都不应该有很大的损失。

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

4D 中的单纯形噪声通常比 4D 中的经典噪声更快。所有其他情况取决于语言、平台和代码优化量。

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

于 2013-11-15T10:20:24.547 回答