Я нахожусь в процессе оптимизации самой требовательной функции в игре Unity 3d.Самая дорогая подпрограмма - это метод Mathf.Abs для единства, который вызывается для значений с плавающей запятой (НИКОГДА НЕ ДВОЙНОЙ).В некоторых случаях вызовы этой функции добавляют несколько миллисекунд к задержке рендеринга кадра.Кодовая база является конфиденциальной, поэтому вам придется поверить мне на слово, что вызовы Abs являются центральными в алгоритме.
Во время глубокого профилирования я обнаружил эту математическую схемуAbs - это просто оболочка, которая вызывает гораздо более быстрый system.math.abs, который используется для двойников.Кажется, что если бы я мог полностью избежать оболочки и просто вызвать эквивалент system.Math.Abs, предназначенного для float32, я бы получил значительное ускорение бесплатно.
Может кто-нибудь объяснить мне, почему его так трудно найтиодин?Флоат-библиотеки, которые я тестировал на NuGet, также конвертируют результаты из двойной версии.
Я рассмотрел реализацию GNU, в которой использовалась структура объединения float_long и операция маскирования.Может ли кто-нибудь направить меня в правильном направлении, чтобы реализовать это в моем собственном пространстве имен или найти то, что поможет мне?