Избегайте проблем точности с плавающей точкой - PullRequest
1 голос
/ 20 марта 2012

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

Это требует, чтобы плавающие точки были ограничены «точностью после точки» из 2 чисел. Какой хороший подход, чтобы держать его с точностью до 2 чисел после точки?

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

Дополнительная информация

Я не говорю о пробел (я действительно знаю, сколько места занимает поплавок, ребята), я говорю о проблеме, которую я теряю точность, когда моей плавающей точке придется много чисел после запятой.

Использование int приведет к тому, что мне придется конвертировать int в число с плавающей точкой каждый кадр. Я не знаю, насколько быстро выполняется преобразование, но это, похоже, требует больших затрат производительности при выполнении большого количества объектов. (Помните, я на мобильном устройстве).

Конечно, я говорю не о местности, я говорю об объектах на местности! Местность - это специализированная система, которая на самом деле может содержать размер местности, который расширяет пределы плавания очень велики (в этой системе даже возможно сохранить Северную Америку, когда у вас достаточно места на диске, но на самом деле ограничения установлены от -99км до + 99км).

Редактировать 2

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

Ответы [ 2 ]

1 голос
/ 20 марта 2012

Интересным способом было бы реализовать это в функции движения:

float result = //multiply force by time
float modulus = result%0.01f;
result -= modulus; //you will do this in any case
if(modulus>=0.005f) {/*round up. if you want it to only round down, remove
  the next 2 lines, if you want it to only round up, remove
  the conditional statement*/
  result+=0.01f; }

Я не могу думать о том, как оптимизировать его дальше, я удалил оператор else и заставил его убрать модуль безусловие, как это будет сделано в любом случае.

0 голосов
/ 20 марта 2012

Да, не важно, с какой точностью вы работаете, они все равно занимают столько же места.Одинарный или двойной будет иметь значение, но реальный вопрос, который вы должны задать, это то, нужны ли вам вообще числа с плавающей запятой.Если вы можете вписать числа в int, сделайте это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...