Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
3 / 3 / 0
Регистрация: 18.01.2024
Сообщений: 168

Как избежать проблем с плавающей запятой на больших картах

21.04.2024, 16:42. Показов 2738. Ответов 34

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

Имеется карта размером 6000х6000 юнитов (6х6 км). Совсем небольшая карта, если в игре есть автомобиль.
Центр координат в центре карты, т.е. если отойти на край карты, удаление от центра будет +/- 3000.
И вот на этом удалении имеем вот это:
Название: Видео без названия — сделано в Clipchamp (5).gif
Просмотров: 152

Размер: 1.57 Мб
Дрожание анимации персонажа начинается уже где-то при удалении от центра на чуть больше 1000 юнит. Чем дальше, тем хуже. Т.е. эффективная карта должна быть 2х2 км (с 0:0:0 в центре), чтобы не было такого дрожания. Но это же несерьезно в 2024 году.

Я читал про джиттеринг и способы его решения методом переноса центра координат мира к игроку и т.д. Но, во-первых, все эти методы довольно старые, я нахожу статьи и видео 2019-2020 года. И они не идеальны, т.к. несут некоторые проблемы. К тому же незнание английского языка не способствует хорошему пониманию найденного материала (переводчик переводит, но как-то не так, как это хочет сказать автор).

Вопрос к форумчанам. Если кто-то делал большие открытые миры, кто как решал проблему с джиттерингом плавающей запятой?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.04.2024, 16:42
Ответы с готовыми решениями:

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

Смена структуры: как избежать проблем
Ремаппинг сделать. То есть, используя скрипты и mod_rewrite (по обстановке, универсальных решений здесь не бывает), перенаправлять...

Как избежать сокращения для чисел с плавающей точкой?
У меня стоит следующая задача: float a = 111.1111, b = 111.1111; cout << a+b; Компьютер выводит 222.222, а я хочу, чтобы он...

34
298 / 260 / 108
Регистрация: 26.10.2012
Сообщений: 810
23.04.2024, 07:21
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от alexsecl Посмотреть сообщение
Хм... а как это будет работать со статичными объектами, в частности с навигационной сеткой, которую используют нпс и враги?
Нормально, через NavMeshBuilder, так все открытые миры на юнити работают.
0
3 / 3 / 0
Регистрация: 18.01.2024
Сообщений: 168
24.04.2024, 01:08  [ТС]
Кстати, пока тестировал смещение начала координат, призадумался, а как реализовывать сохранения в таком случае? Сейчас у меня сохраниться можно в любом месте, так как позиция мира неизменна. Сохранил текущий вектор персонажа - загрузил сохраненный вектор. А при использовании смещения начала координат, положение мира и всего что на нем, будет сбрасываться. И как тогда получать координаты (персонажа, к примеру) и загружать их?
0
270 / 202 / 30
Регистрация: 26.11.2022
Сообщений: 879
24.04.2024, 02:02
чем мешает классический вариант - разбиение неограниченного мира на кубики по 1км на 1км, их динамическая подгрузка и переход между ними?
0
3 / 3 / 0
Регистрация: 18.01.2024
Сообщений: 168
24.04.2024, 02:08  [ТС]
Aledveu, мир будет наподобие пустыни из игры Mad Max. Переход с локации на локацию прям посреди пустыни такое себе...
0
270 / 202 / 30
Регистрация: 26.11.2022
Сообщений: 879
24.04.2024, 02:17
alexsecl, это не переход с локации на локацию.
это метод организации неограниченного мира.
мир делится на регионы - обычно квадратные.
количество загруженных регионов определяется дальностью прорисовки + запас.
переход между регионами происходит мгновенно ибо это просто представление координат.
регионы постепенно подгружаются по мере движения персонажа.
это классический типовой подход для неограниченного мира.
0
3 / 3 / 0
Регистрация: 18.01.2024
Сообщений: 168
24.04.2024, 11:45  [ТС]
Aledveu, вы имеете ввиду что-то типа такого?

Если да, то эта система подзагрузки/выгрузки регионов призвана улучшить производительность игры, а не решить проблемы с плавающей запятой на удалении от начала координат, нет разве? Допустим, первый регион расположен по координате 0,0,0. Второй регион по координате 1000,0,0. Третий - 2000,0,0. И т.д. Чем дальше от нуля, тем больше проблем с плавающей запятой.
Если вы что-то другое имели ввиду?
0
298 / 260 / 108
Регистрация: 26.10.2012
Сообщений: 810
24.04.2024, 12:40
Цитата Сообщение от alexsecl Посмотреть сообщение
Кстати, пока тестировал смещение начала координат, призадумался, а как реализовывать сохранения в таком случае? Сейчас у меня сохраниться можно в любом месте, так как позиция мира неизменна. Сохранил текущий вектор персонажа - загрузил сохраненный вектор. А при использовании смещения начала координат, положение мира и всего что на нем, будет сбрасываться. И как тогда получать координаты (персонажа, к примеру) и загружать их?
Элементарно, хранить координаты как VectorD, а координаты VectorF пересчитывать динамически относительно позиции камеры.

Цитата Сообщение от alexsecl Посмотреть сообщение
Если да, то эта система подзагрузки/выгрузки регионов призвана улучшить производительность игры, а не решить проблемы с плавающей запятой на удалении от начала координат, нет разве?
Для адекватной скорости загрузки(привет готика 2) и разделения редактирования мира дизайнерами.

Цитата Сообщение от alexsecl Посмотреть сообщение
, а не решить проблемы с плавающей запятой на удалении от начала координат, нет разве?
Это решит проблему, ведь все будет храниться в double.
0
3 / 3 / 0
Регистрация: 18.01.2024
Сообщений: 168
24.04.2024, 12:51  [ТС]
Цитата Сообщение от jetyb Посмотреть сообщение
Это решит проблему, ведь все будет храниться в double.
Так... У меня уже голова кругом. А зачем тогда мудрят со смещением мира (origin shift), если есть этот более простой способ - разделить мир на "регионы"? Или все же есть какие-то нюансы?
0
270 / 202 / 30
Регистрация: 26.11.2022
Сообщений: 879
24.04.2024, 14:56
Цитата Сообщение от alexsecl Посмотреть сообщение
а не решить проблемы с плавающей запятой на удалении от начала координат
у вас не будет объектов от камеры более чем на пару регионов.
при переходе в другой регион нулём становится ноль региона.
абсолютные координаты региона можно хранить хоть в int64_t, но они для отображения не нужны - они только когда ищется соседний регион или надо карту всего мира сделать.
0
400 / 309 / 104
Регистрация: 07.05.2017
Сообщений: 2,228
24.04.2024, 15:37
самый главный момент, это смещения игрока и мира на один вектор(одно и то же расстояние). что бы игрок стал в ноль и мир сместился с ним на такое же расстояние. например это можно делать во время загрузки игры.
тут человек предложил тип данных double. эти данные используются в банковской системе. и не спроста. в них число чисел после запятой на порядки больше, а следовательно, точность возрастает. как вариант использовать самописную структуру типа Vector3 или полностью Trancform, но не на float, а на double.
но расчеты таких чисел будут медленнее и памяти они занимают больше. для мощного железа, это конечно не особо критично, но все же...
думаю нужно колдовать с синхронным перемещением мира и игрока в удобные моменты, чтоб не было особо заметно.
0
270 / 202 / 30
Регистрация: 26.11.2022
Сообщений: 879
24.04.2024, 17:31
Gammister, никаких даблов - даже не думайте в эту сторону.
конечные трансформации будут производится в шейдерах на видеокарте и никаких гарантий что у пользователя видюха будет их поддерживать и не сконвертирует во флоаты.
это как раз одно из основных отличий профессиональных графических карт от игровых - что на профессиональных полная поддержка даблов для расчётов как на уровне аппаратуры так и драйверами. а для игр достаточно точности флоатов.
0
400 / 309 / 104
Регистрация: 07.05.2017
Сообщений: 2,228
24.04.2024, 19:03
спасибо за подсказку. буду иметь в виду
0
3 / 3 / 0
Регистрация: 18.01.2024
Сообщений: 168
24.04.2024, 19:18  [ТС]
Цитата Сообщение от Aledveu Посмотреть сообщение
у вас не будет объектов от камеры более чем на пару регионов.
при переходе в другой регион нулём становится ноль региона.
Как вообще реализовать это? Вернее, как называется такая система? Просто тупо не знаю как сформировать запрос в гугле, чтобы он выдал документацию и туториалы. Если своими словами пытаться запрос формировать, выдает совсем не по теме.
0
298 / 260 / 108
Регистрация: 26.10.2012
Сообщений: 810
25.04.2024, 14:22
Цитата Сообщение от Aledveu Посмотреть сообщение
Gammister, никаких даблов - даже не думайте в эту сторону.
конечные трансформации будут производится в шейдерах на видеокарте и никаких гарантий что у пользователя видюха будет их поддерживать и не сконвертирует во флоаты.
Да никто и не сможет на юнити double в видеокарту передавать и нормально с ними работать.
Разве что запилит там аддонами полностью свою систему рендеринга.
0
 Аватар для koker007
59 / 52 / 11
Регистрация: 04.08.2015
Сообщений: 731
01.05.2024, 23:11
у меня игра галактических масштабов и я разделил мир на несколько ступеней, скажем самые огромные масштабы где расстояния между звездами, там стоит отдельная рендер камера и рендерит бекграунд с галактикой, сама галактика со звездами с точки зрения движка в тысячи раз меньше реальных масштабов, на средних околозвездных масштабах принцип такой-же правда эта текстура уже появляется перед галактикой и рендерится после нее, ну и на обычных масштабах я как раз пошел по принципу костыля где двигается мир относительно игрока, ну и физика в игре у меня тоже своя так что это было не так болезненно как если бы я пытался rigidbody использовать. хотя если бы мне все-таки пришлось использоваться я бы скорей всего просто создал свой класс который обрабатывает эти изменения позиций мира для физики и наследовал бы этот класс от rigidbody.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.05.2024, 23:11

Как сложить числа с плавающей запятой
Проблема сложить Числа с плавающей запятой. Сложить два двоичных числа в форме с плавующей запятой. МАНТ - 0.11100 ПОР - 011 МАНТ -...

Как следить за числом с плавающей запятой?
к примеру у меня есть число,и к нему постоянно прибавляют дроби.У этого числа увеличивается часть с плавающей запятой следовательно.Так вот...

Как не округлять числа с плавающей запятой?
#include <iostream> using namespace std; int main() { double a = 0.58743150149648271; double b =...

Как проверить введение числа с плавающей запятой
Здравствуйте, изучаю Windows Forms, подскажите, пожалуйста, как можно проверить, что было введено число с запятой? Если для int можно...

Как получилась мантисса числа с плавающей запятой
Здравствуйте. Нужна помощь в понимании, как получилась мантисса числа с плавающей запятой. Вот два примера. Помогите понять каким образом...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
Новые блоги и статьи
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru