Я работаю над фрагментом кода, где мне нужно иметь дело с uvs (2D текстурными координатами), которые не обязательно находятся в диапазоне от 0 до 1. Например, иногда я получаю uv с компонентом u, который равен 1.2. Чтобы справиться с этим, я реализую обертку, которая вызывает черепицу, делая следующее:
u -= floor(u)
v -= floor(v)
Это приводит к тому, что 1.2 становится 0,2, что является желаемым результатом. Он также обрабатывает отрицательные случаи, такие как -0.4, становящиеся 0,6.
Однако эти призывы к полу довольно медленны. Я профилировал свое приложение с использованием Intel VTune, и я трачу огромное количество циклов, просто выполняя эту операцию на полу.
Проделав некоторые фоновые чтения по этой проблеме, я придумал следующую функцию, которая немного быстрее, но все же оставляет желать лучшего (я все еще подвергаюсь штрафам за изменение типа и т.д.).
int inline fasterfloor( const float x ) { return x > 0 ? (int) x : (int) x - 1; }
Я видел несколько трюков, которые выполняются с помощью встроенной сборки, но ничто, похоже, не работает точно или имеет значительное улучшение скорости.
Кто-нибудь знает какие-либо трюки для работы с подобным сценарием?