Используйте плавающие или двойные при написании мобильных игр

8

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

Но как насчет повсюду в кодовой базе, не связанной с шейдерным конвейером? Я пишу движок и использую double для галочки delta update и пытаюсь сохранить все единицы относительно этого типа данных, чтобы было много мест, использующих double. Должен ли я использовать поплавки на мобильном в двигателе?

Движок написан на языке C ++

Дэн
источник
Я предполагаю, что это во многом зависит от того, какой язык вы используете.
DJ Spicy Deluxe
Добавлен C ++ в описании
Дан

Ответы:

14

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

Есть только несколько мест, где вы могли бы выиграть от переключения с плавающими одинарной точности в своей игре:

Это будут два наиболее распространенных примера вещей, которые вы не должны пытаться хранить в плавающем элементе с одинарной точностью, потому что они теряют значительную точность в диапазоне, который вам нужно охватить (в первую секунду вашей игры вы можете представить истекшее время). время с точностью до 224 секунд или десятков наносекунд, но через 2,5 часа вы начнете терять точность в миллисекундах)

Но это не значит, что вам нужно обязательно использовать double. Целочисленные типы могут обрабатывать эти значения просто отлично. (32-битное int может дать вам миллисекундную точность для 12 дней непрерывной игры. 64-битные целые будут работать миллионы лет)

Значение дельта- времени обычно будет порядка 16 миллисекунд, поэтому его сохранение в плавающей запятой одинарной точности дает точность примерно до229с, который все еще до уровня наносекунд - т.е. вероятно, намного выше точности, с которой вы в любом случае можете надежно синхронизировать код, сигнализировать о потоках или координировать обновление графики. Добавление большей точности здесь с двойным вряд ли улучшит вашу игру каким-либо измеримым способом.

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

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

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

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

Д.М.Григорий
источник