3D 的速度更快?柏林还是单纯形噪音?



好吧,网上有很多Perlin和Simplex噪音之间的比较。但我真的找不到一个能对两者在三维方面的处理时间进行简单比较的地方,这也是我最感兴趣的地方。我读过流行的PDF(甚至理解了其中的大部分——是的!),但我无法回答一个简单的问题:假设实现最佳,哪一个对3D更快?

这个stackoverflow问题的答案表明Simplex是我的案例中一个非常明显的赢家。当然,还有其他资源声称恰恰相反。

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

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

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

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秒,即132M次操作/秒

但是。。。

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

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

单工噪声看起来更好,但不一定更快。这一切都取决于执行情况。根据经验,它"速度大致相同",如果你的代码很好,那么使用任何一种变体都不会有太大的损失。

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

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

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

相关内容

  • 没有找到相关文章

最新更新