30
Как мы создавали онлайн шутер с авторитарным сервером Зачем нам авторитарный сервер, если метод синхронизации в разы проще дешевле? Создание редактора зон, подготовка карт для сервера и клиента. Как мы ускоряли симуляцию физики на сервере. Быстрый обмен данными, экономия оперативной памяти, кластера и другое…

Tomato Engine: Как мы создавали онлайн шутер с авторитарным сервером

Embed Size (px)

DESCRIPTION

Трудности и их решения, в начинающей группе разработчиков игр: 1. Зачем нам авторитарный сервер, если метод синхронизации в разы проще дешевле?! 2. Создание редактора зон, подготовка карт для сервера и клиента. 3. Как мы ускоряли симуляцию физики на сервере. 4. Быстрый обмен данными, экономия оперативной памяти, кластера и другое…

Citation preview

Page 1: Tomato Engine: Как мы создавали онлайн шутер с авторитарным сервером

Как мы создавали онлайн шутер с авторитарным сервером

Зачем нам авторитарный сервер, если метод синхронизации в разы проще дешевле?Создание редактора зон, подготовка карт для сервера и клиента.Как мы ускоряли симуляцию физики на сервере.Быстрый обмен данными, экономия оперативной памяти, кластера и другое…

Page 2: Tomato Engine: Как мы создавали онлайн шутер с авторитарным сервером

Что такое авторитарный сервер?!

клиент клиент

клиент

клиент клиент

клиент

МЕТОД СИНХРОНИЗАЦИИ АВТОРИТАРНЫЙ СЕРВЕР

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

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

дешеводорого

Page 3: Tomato Engine: Как мы создавали онлайн шутер с авторитарным сервером

Синхронизация

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

Это видел Вася когда бросал снежок в ПетюЭто видел Петя когда Вася бросал в него снежок

Петя думал что в него не попали Вася думал что попал в ПетюКТО ПРАВ?

Этого не будет с авторитарным

сервером

Page 4: Tomato Engine: Как мы создавали онлайн шутер с авторитарным сервером

Игрок отключился…

Если один из игроков отключился или у него пропало соединение, кто должен рассчитывать его поведение в сцене? Откуда брать информацию о нем? Часто он просто исчезает…

Этого не будет с авторитарным

сервером

Page 5: Tomato Engine: Как мы создавали онлайн шутер с авторитарным сервером

Это дает возможность мухлевать

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

Этого не будет с авторитарным

сервером

Page 6: Tomato Engine: Как мы создавали онлайн шутер с авторитарным сервером

Нечестные возможности

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

Этого не будет с авторитарным

сервером

Page 7: Tomato Engine: Как мы создавали онлайн шутер с авторитарным сервером

Бросать сквозь стены

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

Этого не будет с авторитарным

сервером

Page 8: Tomato Engine: Как мы создавали онлайн шутер с авторитарным сервером

Ставать бессмертным

Даже так, блокируя или искажая информацию о том сколько урона ты получаешь.

Этого не будет с авторитарным

сервером

Page 9: Tomato Engine: Как мы создавали онлайн шутер с авторитарным сервером

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

Page 10: Tomato Engine: Как мы создавали онлайн шутер с авторитарным сервером

Делаем авторитарный сервер

К примеру, по заказу один наш сервер должен:1. Выдерживать 10000 игроков одновременно.2. Поддерживать абсолютно разные по своей форме 3D карты.3. Рассчитывать физику персонажей.4. Рассчитывать разные пересечения лучей и окружающей среды.5. Механика игры.6. Учет баз данных.

Page 11: Tomato Engine: Как мы создавали онлайн шутер с авторитарным сервером

Как сделать физику персонажей?!

Обычно советуют взять уже готовую клиент-серверную систему, а для расчётов физики использовать свободные физические симуляторы как bullet physics, но они могут просчитать всего около 300-600 капсул, чего недостаточно.

Page 12: Tomato Engine: Как мы создавали онлайн шутер с авторитарным сервером

Бывает еще воксельная физика

Действительно, если записать в воксели информацию о том на каком максимальном расстоянии он находится до ближайшего препятствия, то можно невероятно быстро узнавать произошло-ли столкновение сферы со статичным объектом, но такие 3D карты занимают слишком много оперативной памяти, оптимизации наподобие octree замедляют и не достаточно уменьшают расход памяти.

Page 13: Tomato Engine: Как мы создавали онлайн шутер с авторитарным сервером

Карта высот

Еще используют для расчёта физики 2D карты высот, в основном для создания ландшафтов. Такие карты в отличии от воксельных не занимают много оперативной памяти

Page 14: Tomato Engine: Как мы создавали онлайн шутер с авторитарным сервером

Карта высот с кешем под полусферу

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

Page 15: Tomato Engine: Как мы создавали онлайн шутер с авторитарным сервером

Потолок из карты высот

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

Page 16: Tomato Engine: Как мы создавали онлайн шутер с авторитарным сервером

Несколько пар карт высот

Что если использовать несколько пар карт высот, пола и потолка, а места где они пересекаются будут проходимыми?! Так можно создавать много-этажности, пещеры и тд.

Page 17: Tomato Engine: Как мы создавали онлайн шутер с авторитарным сервером

И… вообще, что угодно

У нас получилась вексельная карта с такой-себе «png упаковкой», которая не тормозит. Таким образом можно упаковывать абсолютно любые 3D сцены. Типичный сервер может рассчитывать столкновение с такой картой около 10 000 000 капсул или сфер, 30 раз в секунду.Тест этого метода можно скачать на сайте http://tomato.co.nl/examples.php

Page 18: Tomato Engine: Как мы создавали онлайн шутер с авторитарным сервером

Автоматическое размещение LightProbes

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

Page 19: Tomato Engine: Как мы создавали онлайн шутер с авторитарным сервером

Автоматическое размещение LightProbes

Создавать и сохранять вышеописанные карты высот, автоматически создавать LightProbes вы можете с помощью бесплатного плагина TomatoEngine для Unity3d. Скачать плагин можно с официального сайта http://tomato.co.nl/

Page 20: Tomato Engine: Как мы создавали онлайн шутер с авторитарным сервером

Пересечение луча и треугольника

Page 21: Tomato Engine: Как мы создавали онлайн шутер с авторитарным сервером

Какой метод лучше?!Функция пересечения луча и треугольника в bullet physics.Это довольно большой кусок кода с большим количеством внешних вызовов, не настолько быстрый как хочу….

float l1x = _mm_cvtss_f32(_mm_dp_ps(m->matrix.r0.v, v1.v, 0x77));float l1y = _mm_cvtss_f32(_mm_dp_ps(m->matrix.r1.v, v1.v, 0x77));float l1z = _mm_cvtss_f32(_mm_dp_ps(m->matrix.r2.v, v1.v, 0x77));l1x -= m->XShift*l1y;float p2e = _mm_cvtss_f32(_mm_dp_ps(m->matrix.r0.v, v2.v, 0x77));float p3e = _mm_cvtss_f32(_mm_dp_ps(m->matrix.r1.v, v2.v, 0x77));float l2z = _mm_cvtss_f32(_mm_dp_ps(m->matrix.r2.v, v2.v, 0x77));p2e -= m->XShift*p3e;float e = l2z/(l1z-l2z);p2e = p2e+(p2e-l1x)*e;p3e = p3e+(p3e-l1y)*e;float p1e = 1 - (p2e+p3e);if((p2e >= 0) && (p3e >= 0) && (p1e > 0)){ … пересеклось …. }

Давайте сделаем такой!без внешних вызовов, быстрый и короткий!....

Page 22: Tomato Engine: Как мы создавали онлайн шутер с авторитарным сервером

Матрицы преобразованияПрежде всего еще при экспорте или загрузке модели, мы создаем матрицы Преобразования для каждого треугольника..

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

Перемещаем треугольник первой точкой в нулевую координату и матрица в

1,0,00,1,00,0,1

Поворачиваем треугольник и матрицу так, чтоб он лег на плоскости XY и Y второй точки совпадал с Y первой.

Скейлим матрицу и треугольник так чтоб

X второй точки равнялся 1 и Y

третьей равнялся 1

Сохраняем в отдельную переменную X третьей

точки, чтоб потом сделать наш треугольник

прямым отняв ее

Мы должны повернуть треугольник так чтоб прямым он делался именно скаляром X, так как это первый скаляр xmm регистров процессора с которыми ми можем работать на прямую, отдельно от остальных

Page 23: Tomato Engine: Как мы создавали онлайн шутер с авторитарным сервером

Как должна выглядеть матрица

0.002-0.925 0.381

0.863-0.191-0.468

0.505 0.330 0.797

Матрицу записываем в вертикальном порядке, это даст нам возможность использовать DPPS команды из SSE 4.1,преобразование одного вектора будетзанимать всего три команды процессора

DPPS XMM1 XMM4 0x77DPPS XMM2 XMM4 0x77DPPS XMM3 XMM4 0x77

Естественно данный способ еще и очень быстрый.

Page 24: Tomato Engine: Как мы создавали онлайн шутер с авторитарным сервером

Как работает функция1. Преобразовуем нашей матрицей преобразования обе точки линии(луча)

Vector3 v1 = LinePoint1-TrianglePoint1Pos;Vector3 v2 = LinePoint1-TrianglePoint1Pos;float l1x = _mm_cvtss_f32(_mm_dp_ps(m->matrix.r0.v, v1.v, 0x77));float l1y = _mm_cvtss_f32(_mm_dp_ps(m->matrix.r1.v, v1.v, 0x77));float l1z = _mm_cvtss_f32(_mm_dp_ps(m->matrix.r2.v, v1.v, 0x77));l1x -= m->XShift*l1y;float p2e = _mm_cvtss_f32(_mm_dp_ps(m->matrix.r0.v, v2.v, 0x77));float p3e = _mm_cvtss_f32(_mm_dp_ps(m->matrix.r1.v, v2.v, 0x77));float l2z = _mm_cvtss_f32(_mm_dp_ps(m->matrix.r2.v, v2.v, 0x77));p2e -= m->XShift*p3e;

2. Находим позицию XY на точке пересечения, они-же эквиваленты переливов между точками.float e = l2z/(l1z-l2z);p2e = p2e+(p2e-l1x)*e;p3e = p3e+(p3e-l1y)*e;float p1e = 1 - (p2e+p3e);if((p2e >= 0) && (p3e >= 0) && (p1e > 0)){

3. Все пересечение произошло, теперь можно высчитать точку пересечения, нормаль, UV…Vector3 IntersectionPoint = p1Pos*p1e+ p2Pos*p2e+ p3Pos*p3e;Vector3 Nomal = p1Norm*p1e+ p2norm*p2e+ p3norm*p3e;Vector3 UV = p1UV*p1e+ p2UV*p2e+ p3UV*p3e;}

Page 25: Tomato Engine: Как мы создавали онлайн шутер с авторитарным сервером

Тест метода

Для проверки данного метода был создан рендер, который в реальном времениобрисовывает модель в HD формате. Этот пример с исходным кодом можно скачать на странице http://tomato.co.nl/examples.php

Page 26: Tomato Engine: Как мы создавали онлайн шутер с авторитарным сервером

Как не считать все треугольники

Page 27: Tomato Engine: Как мы создавали онлайн шутер с авторитарным сервером

octree

Традиционный и проверенный метод, но в случае с MMOG сервером имеет ряд недостатков – вложенные циклы, что не быстро и много вложенных массивов что сложно передать в shared memory.

Page 28: Tomato Engine: Как мы создавали онлайн шутер с авторитарным сервером

Воксели

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

Page 29: Tomato Engine: Как мы создавали онлайн шутер с авторитарным сервером

Сообщения серверов и клиентов

БД

менеджер

бой1

бой2

бой3

бой1

бой2

бой3

бой1

бой2

бой3

бой1

бой2

бой3

клиент

клиент

клиент

клиент

клиент

клиент

клиент

клиент

клиент

клиент

клиент

клиент

клиент

клиент

сервер1

сервер2

сервер3

сервер4 сервер5

сервер6

Page 30: Tomato Engine: Как мы создавали онлайн шутер с авторитарным сервером

Спасибо за внимание! Есть вопросы?

Пишите мне на [email protected]

Более подробную и обновленную информацию смотрите на сайте http://tomato.co.nl/