Я пишу программу GPGPU с использованием шейдеров GLSL и пытаюсь придумать несколько оптимизаций для алгоритма обнаружения столкновений N-тела. Один выполняет «быструю» проверку, чтобы определить, находятся ли два объекта в одном и том же шаре. Идея состоит в том, чтобы быстро дисквалифицировать множество возможностей, поэтому мне нужно выполнить более точный тест столкновения на нескольких объектах. Если быстрая проверка решила, что есть вероятность, что они могут столкнуться, выполняется точная проверка.Вычислительная стоимость математических операций в GLSL
Объекты - круги (или сферы). Я знаю положение их центра и их радиус. Быстрая проверка будет ли их квадрат (или куб), ограничивающей коробки перекрываются:
//make sure A is to the right of and above B
//code for that
if(A_minX > B_maxX) return false; //they definitely don't collide
if(A_minY > B_maxY) return false; //they definitely don't collide
if(length(A_position - B_position) <= A_radius + B_radius){
//they definitely do collide
return true;
}
Мой вопрос, является ли накладные расходы выполнения этой быстрой проверки (убедившись, что А и В находятся в правильном порядке, то проверки, является ли их перекрывающиеся перекрытия) будет быстрее, чем позвонить length()
и сравнить это с их объединенными радиусами.
Было бы полезно узнать относительную вычислительную стоимость различных математических операций в GLSL, но я не совсем уверен, как их обнаружить эмпирически или эта информация уже размещена где-то.
Я бы предположил, что это очень зависит от состояния вашего мира. Если он очень разрежен, многие пары объектов попадают в условия дисквалификации, тогда да: он должен быть быстрее. Если для многих пар объектов требуется более точная проверка, то все условия дисквалификации - это добавление дополнительной вычислительной работы. –
Любая идея, насколько быстрее? Есть статья в википедии, описывающая сложность различных операций, но она очень универсальна: https://en.wikipedia.org/wiki/Computational_complexity_of_mathematics_operations Я не знаю, какие конкретные алгоритмы используются в GLSL. Я предполагаю, что вычисление квадратного корня является дорогостоящим, но, похоже, алгоритм аппроксимации довольно быстрый. – Justin