Вопрос

У меня есть (базовый) двигатель вокселя и водная система, которая выглядит (и я предполагаю, что в основном работает), как это: https://www.youtube.com/watch?v=q_tdegioots (не моя игра).
Значения воды хранятся в 3D-массиве поплавков, и каждые 0,05 - это рассчитывает поток воды, проверяя воксель ниже и прилегающую (Y-1, X-1, X + 1, Z-1, Z + 1) и добавляет Значение.
Эта система работает нормально (70+ FPS) для небольшого количества воды, но когда я начинаю вычислить воду на 8+ кусках, он становится слишком много. (Я отключил все рендеринг или создание сетки для проверки, если это такое узкое место, оно не так. Его чисто расчеты потока).
Я не очень опытный программист, поэтому я бы не знал, где начать оптимизировать, кроме того, чтобы вычисления случились в Coroutine, как я уже сделал.
В этом посте: https://gamedev.stackexchange.com/questions/ 55414 / Как-определяющие области, наполненные с водой (вблизи нижнего) бореала, предполагает, что он работает в Compute Shader . Это путь для меня? И как бы я пошел по такой вещи?
Любая помощь очень ценится.

Это было полезно?

Решение

Если вы действительно рассмотрите симуляцию на основе вокселя, вы будете расширять количество расчетов, геометрически, поскольку ваш размер увеличивается, поэтому вы быстро выберете мощность обработки на больших объемах.

Компетентный шейдер отлично подходит для быстрого параллельных расчетов, хотя это очень разная парадигма программирования, к которой привыкается. Compute Shader будет смотреть на содержимое буфера (т. Е. «Текстура» для гражданских лиц США) и делать это очень быстро - в вашем случае буфер, вероятно, будет буфер / текстурой, чьи значения пикселей представляют собой клетки воды. Если вы хотите сделать что-то действительно простое, как увеличить их вверх или вниз, Compute Shader использует параллельную мощность обработки графического процессора, чтобы сделать это действительно быстро.

Тяжелая часть заключается в том, что графические процессы Оптимизация для параллельной обработки . Это означает, что вы не можете написать код как «Texela.value += Texelb.value» - без дополнительной работы с вашей стороны каждый фрагмент буфера обрабатывается с нулевым знанием того, что происходит в других фрагментах. Для справки других текстульх необходимо еще раз прочитать текстуру как-то - некоторые методы читают одну текстуру несколько раз с смещениями ( этот пример GL делает это для реализации Blurs, другие делают это, повторно обработанные текстуры, вкладывая результат во временную текстуру, а затем переработку.

На уровне 10 000 футов: Да, Compute Shader - хороший инструмент для этой проблемы, поскольку оно включает в себя тонны самоподобного расчета. Но этого не будет легко сделать летучую мышь. Если вы не выполнили обычные программирование шейдеров ранее, вы можете посмотреть на это первым, чтобы привыкнуть к тому, как работа по границе. Даже действительно основные инструменты (если они-другие или петли) имеют очень разные последствия для производительности и использует в программировании GPU, и требуется некоторое время, чтобы получить голову вокруг различий. Насколько этому написанию (1/10/13) выглядит как NVIDIA и UDIATION предлагает Intro для вычисления Шейдерский курс Что может быть хорошим способом встать на скорость.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top