В каком типе переменной позиция игрока хранится в MMORPG, такой как WoW?


18

Я даже слышал, как Дж. Кармак быстро говорит об этом ...

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

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

Ответы:


26

Скотт Билас работал над Dungeon Siege и написал статью «Непрерывный мир Dungeon Siege» . Хотя Dungeon Siege не является MMO, у него есть мир, и он говорит о позиционировании игрока в своей газете. Я нашел, что это было отличное чтение. Вот соответствующий раздел:

Проблема точности

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

С плавающей точкой, чем дальше вы находитесь от начала координат, тем больше точности вы теряете, что может вызвать самые неприятные проблемы. Вещи не сортируются правильно, между соседними сетками появляются трещины, пространство начинает квантоваться, и кошки и собаки начинают жить вместе. Dungeon Siege использует FPU в режиме одинарной точности для очевидного выигрыша в производительности и соответствия исходной точности видеооборудования. Однако, даже если бы мы повысили точность, это в конечном итоге никогда не решило бы проблему, потому что мир был запланирован и стал невероятно большим.

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

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

Чтобы инкапсулировать концепцию трехмерного положения относительно определенного узла, традиционный вектор (x, y, z) должен был быть дополнен идентификатором узла (x, y, z, node) и представлять смещение от начала координат конкретного узла вместо. Этот 4-кортеж инкапсулирован как позиция осады или SiegePos. Позже мы добавили SiegeRot (кватернион, узел), чтобы обрабатывать сравнения ориентаций между узлами.

Фраза «нет мирового пространства» стала мантрой для команды, хотя буквально потребовались годы, чтобы все поняли, что это значит.

Вы можете увидеть больше его работ о Dungeon Siege здесь .


Это, кажется, очень хороший ответ! Благодарность ! Мне было бы интересно, если бы сегодняшняя игра использовала конечные числа, как целые числа в gmp.
Jokoon

3

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

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

Если у вас есть небольшие зоны, я думаю, поплавка будет достаточно.


Двойная точность быстро приносит огромные преимущества в производительности и памяти. (x, y, z, зона) - 16 байтов; (x, y, z) удваивается не менее 24. Вы не можете выполнять быстрые математические операции с ними и не можете использовать их на видеокарте.

Что ж, карты Ферми могут использовать двойную точность;) Но да, в любом случае ответ на этот вопрос подсказывает фрагментарный подход.
Nailer

2

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

Помните, что есть как минимум 4 зоны. 4 главных континента. Я не думаю, что кто-то из них находится на расстоянии более 10 км. Например, в этом блоге, посвященном последнему расширению, вся проезжая часть рассчитывается как 41 кв. Миль. Все поля битвы, все экземпляры, каждый со своей зоной и пространством координат.

Используя LUA API, вы можете получить положение игрока. GetPlayerMapPosition () возвращает два числа с плавающей точкой от 0 до 1 в виде пропорции по всей карте мира.


1

Для WoW, я ожидаю, что они используют простое число с плавающей точкой x / y / z - но относительно определенной «зоны»

Это поможет обрабатывать «движущиеся зоны», например, лодки и дирижабли


1

Обычно онлайн-игры, такие как Wow, Tibia и т. Д. Магазин игрока поз. используя три переменные X + Y + Z в мета-таблице игрока SQl. Runescape делает это без Z - таким образом, игрок всегда рендерится сверху на вершине наземной сетки.


что такое мета таблица? Я действительно сомневаюсь, что он будет хранить его в БД, его нужно использовать в режиме реального времени ...
Jokoon

(1) В этом случае мета-таблица является таблицей БД с основными символьными данными, например, для. Пол, положение xyz, количество здоровья, наличные в банке и т. Д. И все остальное, что может быть. (2) Я размещал открытые серверы Tibia, в которых положение плеера хранится в кеше сервера. Но ... каждые 30 секунд происходит сохранение на сервере, и POS игрока будет добавляться в метаданные игроков. Так что, если сервер отключается / падает, позиция игроков вернется в
базу

-2

Поплавок? Ну, массив из 3 поплавков для 3D-игры. По крайней мере, для нас мы используем ноги в качестве единиц, поэтому все, что вам нужно, это 3-4 десятичных знака, чтобы быть в точке, где шум с плавающей точкой не является проблемой. Если большая зона находится всего в миле или двух на стороне, это не так уж и важно. Что касается прозрачного зонирования в MMO, это совсем другой вопрос. В общей схеме сложных проблем в MMO, позиция хранения в списке довольно низкая.


Во время разработки у нас были проблемы точности с плавающей точкой в ​​некоторых крупных зонах STO. Я не знаю, что с ними стало. Это не может быть главным приоритетом, но это нужно учитывать достаточно рано, чтобы на самом деле сделать уровни.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.