Космос ближе и ближе
Перед обновлением, решил опубликовать несколько статей, о том, как же создавался космос в нашем проекте Dreams Gate. Конечно, наш проект имеет бурную историю и планеты уже создавались (в 2002 / 2008 / 2010 / 2012 и 2014), вместе с космосом (2011 / 2014). На этот раз, ушел значительно дальше. Огромная часть времени была потрачена на математические расчеты.
Можно легко представить как корабли летают вокруг планет, пролетают мимо галактик. Но, стоит задуматься о числах и начинаешь понимать, что обычному программисту доступны лишь небольшие числа, а дальше, потеря точности и просто ошибки.
Программистам доступны числа 32\64 бит, редко 128. Чтобы это означало? Например число двойной точности дает весомую погрешность, когда корабль находится например на краю планетной системы, даже если мы будем считать координаты не глобальные, а лишь относительно центра.
Например Астрономическая единица 149 597 870 700 метров, а вот Парсек уже 30 857 780 760 502 620 метров. Даже при этих «небольших» числах и доступных программисту (float / double), по полу корабля мы уже пройтись не сможем, с каждым шагом мы будем прыгать на несколько десятков метров.
Как же быть, что же делать?
Ответ прост: создать свою систему единиц.
Многие выбирают арифметику с фиксированной запятой 64.64 (64 бита до запятой и 64 бита после), если грубо, то: (9 223 372 036 854 775 807).(9 223 372 036 854 775 807), всего 38 десятичных цифр, но в реальности число будет чуть меньше, так как будет убран 1 бит на знак. Но этот метод не для нас, он слишком простой.
Так как нет предела совершенству, а в Javascript, все еще сложнее с математической частью, чем на c++.
Пошел другим путем, поставил задачу:
Считать числа без ограничения в точности.
После месяца разработки, получилось добиться чисел без ограничений, полностью, лишь объем доступной оперативной памяти для Javascript являлся пределом. Но при разработке сетевой части, всё же пришлось установить ограничения. Сервер хранит координаты в базе данных mysql, тестами было выяснено, что удобнее всего хранить координаты до 1000 десятичных цифр упакованных Base85. На этом и решил ограничиться.
В итоге: у нас числа от -10900, до +10900, но, так как пространство в проекте измеряется в метрах, можно понять какие у нас пределы.
Так же, помимо обычных операций (сложения, вычитания, умножения, деления, поиска остатка от деления), были созданы аналоги sin, cos, tan, atan, log для работы с большими числами. Скорость получилась не высокой, но её достаточно для работы игры.
Все это интересно) Только обычным людям, я бы сказал мало тут будет понятно чего.
например, что такое float / double или mysql.
да и зачем такие огромные числа? размеры космоса? не проще было бы как то космос разделить на коридоры\локации как это сделано во многих других игрушках? как то иначе может…
Большое спасибо за интерес, проявленный к моим проектам.
Этот блог не о конкретной игре, а о процессе рождения моих проектов. Логично рассказывать и о технической части.
Про огромные числа:
Цель была вычисление точных данных (координаты, скорости и тд). Тут важно не столько большие числа, как точность вычислений. Пример 0.2 + 0.1 = 0.30000000000000004 ссылка (кнопка TryIt чтобы убедиться). После нескольких тысяч итераций, накапливается весьма существенная погрешность. Чтобы от неё избавиться, самый простой способ — обыкновенные дроби. А бонусом мы получили возможность сделать шаг в сторону бесконечного пространства, чтобы игрок мог двигаться свободно и не упираться в пределы пространства движка.
О проекте Dreams Gate:
в нем будут локации на планетах, будут базовые планеты с городами и к ним можно будет добраться любым способом (телепортация, возрождение после гибели, просто долететь на корабле).
Для квестов, боев и других элементов игрового процесса будут свои свободы и ограничения.
Вопросов нет. С js особо дела не имел, не знал что тут такие проблемы могут быть.
В любом случае — хорошие статьи. Да и проекты интересные вполне. Продолжайте в том же духе.