Что быстрее для 3D? Перлин или Симплекс шум?

Хорошо, в Интернете можно найти множество сравнений между шумами Perlin и Simplex. Но я действительно не мог найти тот, где было бы простое сравнение времени обработки между этими двумя измерениями, и это то, что меня больше всего интересует. Я читал этот популярный PDF (и даже понял большинство из них - ууу!), Но Я не могу ответить на простой вопрос: какой из них быстрее для 3D, при условии оптимальной реализации?

Этот ответ на вопрос stackru предполагает, что Simplex является довольно очевидным победителем для моего случая. Конечно, есть и другие ресурсы, утверждающие прямо противоположное.

Тем не менее, общее утверждение, по-видимому, состоит в том, что шум Перлина имеет сложность O(2^N), в то время как у Simplex есть O(N^2). Что для 3D будет означать 8 для Perlin и 9 для Simplex. Но на каком-то сайте я нашел утверждение, что Simplex на самом деле O(N). Так что же здесь верно, и что это действительно означает для скорости в 3D?

Я в недоумении, я действительно в основном заинтересован в использовании 3D-приложений (для случайной генерации ландшафта, включая пещеры), и я не могу найти хороший ответ на вопрос, какой из них мне следует использовать, если я хочу, чтобы он был настолько быстрым, насколько это возможно. возможный.

Так что, может быть, кто-то может помочь мне здесь:)

2 ответа

Решение

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,7 млн ​​операций в секунду 2) 0,607 с, то есть 13,2 млн операций в секунду

Но...

Когда действительно, действительно идем на оптимизацию, нужно учиться

  • Оптимизация на более высоком уровне (что действительно делается на каждом этапе: есть ли альтернативы?)
  • ветви
  • Образцы памяти
  • зависимости
  • Размеры LUT
  • Необходимы отдельные арифметические операции, их задержки и пропускная способность
  • эксплуатируемые параллелизмы с использованием SIMD
  • количество живых переменных

Симплексный шум лучше выглядит, но не обязательно быстрее. Все зависит от реализации. Как правило, это "примерно одинаковая скорость", и не должно быть большого штрафа за использование любого варианта, если ваш код хорош.

Обратите внимание, что большая часть написанного мною кода в Интернете не оптимизирована по скорости, а написана для ясности. Реализации GLSL Ian McEwan и мной пару лет назад были разумно оптимизированы для скорости, но они были оптимизированы для аппаратного обеспечения, которое сейчас устарело, и версий GLSL, которые были актуальны в то время. С тех пор важные изменения в GLSL включают целочисленные типы и побитовые логические операции, что делает некоторые хеш-функции неудобными и излишне сложными. Необходимость перестановочного полинома была вызвана отсутствием побитовых логических операторов в GLSL. В GLSL для WebGL по-прежнему не хватает, но все остальные платформы теперь имеют целочисленную поддержку.

Симплексный шум в 4D в основном быстрее, чем классический шум в 4D. Все остальные случаи зависят от языка, платформы и объема оптимизации кода.

Симплексный шум имеет простую аналитическую производную. Классический шум в этом отношении более хитрый. Во многих случаях, таких как сглаживание и картография местности, аналитическая производная очень полезна.

Другие вопросы по тегам