devalone
@devalone
̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻

Что использовать, int, float или double в современном игровом движке?

Рассмотрим современные CPU архитектуры с 64 битными инструкциями и современные GPU, например, nvidia 1080

Если представлять мир с точностью до миллиметра, то целочисленный тип размером 64 бита позволяет сделать мир размером > 9000000000000 км, double ~10000000000 км и float ~10 км.
int достаточно большой и я сомневаюсь, что кто-то захочет игру с ещё большим открытым миром. Но современные процессоры уже давно имеют сопроцессор для операций с плавающей точкой и я не думаю, что арифметика с плавающей точкой будет сильно медленнее. Если выбирать между float и double, double больше, но видеокарты работают быстрее с float https://en.wikipedia.org/wiki/GeForce_10_series#Ge...
GeForce GTX 1080 Ti: Single precision - 10609 GFLOPS, Double precision - 332 GFLOPS.

Такие движки как Unity используют float, но есть также и те, которые используют double, например unigine unigine.com/en/products/engine/unbounded-world У них не возникает проблем с медленной double арифметикой?

Что лучше использовать для представления положения, скорости, ускорения и т.д. игровых объектов: int(64), float или double?

Или, может быть, разбить мир на кубы размером, допустим 10 км? Но тогда возникают проблемы с рендерингом больших сцен.
  • Вопрос задан
  • 3007 просмотров
Пригласить эксперта
Ответы на вопрос 4
maaGames
@maaGames
Погроммирую программы
И то и то и то. В видеокарту double лучше не передавать (особенно в карточки nvidia), поэтому float. В физическом движке лучше double, либо вещественное число с фиксированнй точкой (читай int/int64).
У вас ошибка в суждениях. 1мм - это много или мало? Для линейного размера нормально? А для углового? А если пять раз повернуться по часовой стрелке и три раза против часовой, при этом координата сохраняется с точностью до миллиметра? Если поворачиваем корабль, длиной в 300 метров? А если карандаш, длиной 7 сантиметров? А если это моргает персонаж? Т.е. нужно использовать те типы данных, которых достаточно для представления тех данных, с которыми работаете. Причём, они вполне могут конвертироваться друг в друга, возможно, с потерей точности.
Ответ написан
Комментировать
@laxikodeje
флоаты ОЧЕНЬ СИЛЬНО ЗАМЕДЛЯЮТ расчеты.
хотя и позволяют избегать округлений, неточности и переполнений ГОРАЗДО лучше, чем инты.

что и где использовать - решать вам самому.
зависит от конкретных мест.
а будет ли там тормозить на не самом крутом железе.
или вы ориентируетесь только на топовое железо.

если сомневаетесь - проводить тесты, эксперименты, замеры скорости.

что именно где использовать - без тестов и экспериментов вы будете знать заранее только с опытом.

UPD:
то целочисленный тип размером 64 бита позволяет сделать мир размером > 9000000000000 км, double ~10000000000 км и float ~10 км.

Зависит от логики вашего мира.
Может, будет проще сделать 128-битное целое - это все равно будет очень быстро.

или разделить мир на независимые сегменты - все равно очень далекие друг от друга объекты не взаимодействуют скорее всего.
такая технология была еще в прошлом веке задействована в процессорах именно для адресации. так называемый "сегмент:смещение" и "короткие ближние адреса" и "дальние длинные адреса".
Ответ написан
@Mercury13
Программист на «си с крестами» и не только
Предварительные расчёты (например, координаты моделей) проводить в типе достаточной точности (и, разумеется, на процессоре). Окончательные — в привычном float.
И, понятное дело, для открытых миров придётся писать свои «велосипеды» по отсечению далёких горизонтов, и Unity в стандартной поставке не уверен, что подойдёт.

Ещё раз. Координаты участников игры записываются в double. Координаты вершин модели — во float. Мы на процессоре проводим начальные преобразования координат, убеждаемся, что координаты заслуживают того, чтобы их рендерить, преобразуем во float и гоним на видяху.
Ответ написан
begemot_sun
@begemot_sun
Программист в душе.
У флоат есть такая штука как ошибка представления.
Например выражение (1/3) * 3 = 0.999999996 для машины может быть вполне истиным :)
Да и операции с Int на порядки быстрее всегда.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы