2016-10-17 2 views
1

Мне было интересно, если кто-нибудь знает с головы, если единство делает любую оптимизацию под капотом с поплавками.Оптимизирует ли single3D поплавки в любой точке?

Поскольку их mathf функция, которая по существу завершает функцию C# math, предположительно потому, что он использовал поплавки вместо знаков после запятой, что само по себе является своего рода оптимизации, но они все еще в два раза ресурсы как ulong, которые могут быть использованы для хранить значения, а затем делиться на десять.

При выполнении вычислений физики, которые имеют дело с сотнями или тысячами поплавков за кадр, кажется, что мы хотим получить все, что могли бы получить.

Оптимально мне говорят, что я хочу использовать указатели, на которые я предоставил ссылку, но я не продаюсь при запуске в небезопасным.

http://answers.unity3d.com/questions/804103/how-to-enable-unsafe-and-use-pointers.html

+0

Я не знаю, на самом деле это оболочка математической функции C#. Они делают собственные собственные реализации в моно CLR для многих вещей, и я не удивлюсь, если один из них MathF. –

+0

Кроме того, прокомментировал ли вы свой код и увидел, что функции 'MathF' фактически там, где код тратит большую часть времени, или вы просто предполагаете, что именно там он проводит больше времени, потому что это самый логичный выбор? –

+1

Использует ли это float над десятичным? Ты уверен? Не двойной? Почему улунг должен быть оптимизацией, если для получения значения требуется умножение для хранения и деление? Зачем думать, что указатель будет быстрее? Для прохождения значения? Все еще 4 байта данных. И тогда вам все равно нужно поместить значение в регистр для выполнения действия. Возможно, вы пытаетесь найти проблему для решения, о котором вы думаете. – Everts

ответ

1

байт (8 бит), короткий (16 бит), Int (32-битный), Лонг (64-бит) и Десятичный (128 бит) являются точными в то время как Поплавок (32- бит) и Double (64-бит). Преимущество с плавающей запятой заключается в том, что они имеют большой диапазон, но это связано с высокой точностью.

Вы получаете высокую точность, близкую к нулю, и меньше при более высоких значениях. Тесты, которые я сделал с Unity для моего собственного проекта, показали, что я в некоторых случаях не смог позиционировать вещи в своей 1-метровой сетке уже после 16 000, пропустив 1 метр.

Большинство видеокарт и их API используют 32-битные типы данных с плавающей запятой. Это компромисс между памятью (и некоторой, но не очень высокой вычислительной мощностью) и точностью. Поэтому имеет смысл, что Unity также использует float. Хотя некоторые коммерческие карты начали получать support for 16-bit and 64-bit floating points.

Unity не делает оптимизаций для самого поплавка, он передает его на GPU в большинстве случаев в сыром состоянии. Это самый оптимизированный способ сделать это.

Выбор математического преобразования в Mathf, вероятно, заключается в том, чтобы избежать путаницы (то есть подписи метода) и позволить им правильно расширять класс Math.

Пример одного из больших недостатков: Моя игра имеет почти бесконечный мир и поэтому должна иметь «Futurama Engine». Он настраивает проигрыватель на 0,0,0 и мир соответственно время от времени, чтобы предотвратить попадание каких-либо предметов в слишком высокие/низкие позиции в поплавке. «Двигатели вообще не двигают корабль. Корабль остается там, где он есть, и двигатели перемещают вселенную вокруг него.« Если Unity и графические карты использовали Decimal, это не было бы необходимо.

0

Примечание:

Поплавки 32 бита, удваивается 64 бита, и десятичные являются 128 бит. Таким образом, улуг в два раза больше поплавка, того же размера, что и двойной и половинный размер десятичного числа.

-Scott Chamberlain 
Смежные вопросы