Я предполагаю, что вы используете floor
, потому что возможны отрицательные значения, и потому, что вы не хотите аномалию из-за усечения по умолчанию при приведении к int
(значения округляются в сторону нуля с обеих сторон, что приводит к увеличению размеров вокселей).
Если вы можете указать безопасное наиболее отрицательное значение для каждого значения в векторе, вы можете вычесть это (отрицательное) значение или, скорее, ближайший более отрицательный кратный _gridIntervalSize
перед приведениеми отбросьте floor
.
Использование fmod
может гарантировать, что у вас есть безопасное наиболее отрицательное значение, и заменить целое число %
, но это, вероятно, анти-оптимизация.Тем не менее, в качестве быстрого изменения, возможно, стоит проверить.
Кроме того, проверьте, поддерживает ли ваша платформа векторные инструкции и можно ли легко рекомендовать их использовать компилятору.Микросхемы x86, безусловно, имеют как целочисленные векторные инструкции, так и float (старые инструкции Pentium 1 MMX, для начала) и могут справиться с этим гораздо более эффективно, чем «обычный» набор команд ЦП.Это может даже быть причиной выкапывания списка встроенных инструкций вектора для вашего компилятора и некоторой ручной оптимизации.Просто проверьте, что компилятор может сделать для вас в первую очередь - я не уверен, что такого рода компиляторы оптимизации уже сделают для вас.
Одна, вероятно, тривиальная часть микрооптимизации ...
return (mx * _gridSize + my) * _gridSize + mz;
Сохраняет одно целочисленное умножение.Тривиально, конечно, и компилятор может поймать это в любом случае, но это старая привычная вещь.
О - смотрите первые подчеркивания.Это зарезервированные идентификаторы.Вряд ли это может вызвать проблемы, но вы не можете жаловаться, если они это делают.
РЕДАКТИРОВАТЬ
Еще один способ избежать floor
состоит в обработке положительных и отрицательныхпо отдельности.Если вы согласны с тем, что элементы, расположенные по краям ячейки сетки, могут находиться не в той ячейке (возможно, в любом случае, поскольку значения с плавающей точкой следует считать приблизительными)Просто примените смещение -1
в отрицательном случае, чтобы оттянуть его от нуля на почти точно правильную величину, чтобы компенсировать усечение.Вы могли бы рассмотреть немного изменяющуюся мантиссу впоследствии (чтобы получить уже целочисленные значения в ячейке, которую вы ожидаете), но это, вероятно, не нужно.
Если вы можете наложить ограничения степени два наваши размеры, может быть немного бесполезный способ эффективно извлечь положение сетки из числа с плавающей запятой, избегая некоторых или всех умножения, пола и %
для каждого из x, y и z, предполагая стандартное представление с плавающей запятой (т.е. это непереносимо).Опять же, обрабатывайте положительное и отрицательное отдельно.Извлеките экспоненту, соответственно сдвиньте мантиссу, затем замаскируйте ненужные биты.