Сервер «Аллодов Онлайн». Архитектура и особенности...

23
Спиридонов Сергей глава команды сервера, департамент клиентских игр www.mail.ru Сервер «Аллодов Онлайн». Архитектура и особенности разработки.

Upload: -

Post on 22-Jun-2015

2.145 views

Category:

Career


4 download

DESCRIPTION

Докладчик: Сергей Спиридонов, глава команды сервера на проекте «Аллоды Онлайн».

TRANSCRIPT

Page 1: Сервер «Аллодов Онлайн». Архитектура и особенности разработки

www.mail.ru

Спиридонов Сергейглава команды сервера, департамент клиентских игр

Сервер «Аллодов Онлайн». Архитектура и особенности разработки.

Page 2: Сервер «Аллодов Онлайн». Архитектура и особенности разработки

www.mail.ru 2

Сервер высоконагруженного приложения

Что это такое?Требования:• real-time;• работа 24/7;• Устойчивость к нештатным

ситуациям.Особенности:• cложность диагностики;• cложность тестирования нагрузки;• cложность проектирования.

Page 3: Сервер «Аллодов Онлайн». Архитектура и особенности разработки

www.mail.ru 3

Аллоды Онлайн

Требования к игре:• высокое CCU (~5k);• большой мир;• Насыщенное окружение на клиенте.

Page 4: Сервер «Аллодов Онлайн». Архитектура и особенности разработки

www.mail.ru 4

Структура приложения

Page 5: Сервер «Аллодов Онлайн». Архитектура и особенности разработки

www.mail.ru 5

Сервер. Выбор языка

Что нужно сравнивать:• производительность;• количество работы, которую можно ему языку;• скорость разработки.Какие были выдвинуты требования:• наличие memory management;• кроссплатформенность (Linux/Windows);• удобная среда разработки.

Языки низкого уровня (C/C++).Языки высокого уровня (Java, C#).Языки сверхвысокого уровня (Python, Ruby, Haskel).

Page 6: Сервер «Аллодов Онлайн». Архитектура и особенности разработки

www.mail.ru 6

Java vs C#

Java C#

Managed + +

IDE Intellij Idea, Eclipse

Visual Studio, mono

Linux IDE Intellij Idea, Eclipse mono

Удобная IDE Intellij Idea, Eclipse Visual Studio

Удобная Linux IDE Intellij Idea, Eclipse

Page 7: Сервер «Аллодов Онлайн». Архитектура и особенности разработки

www.mail.ru 7

Сервер. Структура

Логически сервер делится на 2 компоненты, механику и ядро.

Механика – высокий уровень, задаёт специфику приложения.

Ядро – низкий уровень, функциональность, общая для большинства игр.

Page 8: Сервер «Аллодов Онлайн». Архитектура и особенности разработки

www.mail.ru 8

Механика

Что такое механика и как она работает?Примерно так:

Page 9: Сервер «Аллодов Онлайн». Архитектура и особенности разработки

www.mail.ru 9

Сервер. Структура

Сервер состоит из сервисов. Общение происходит либо напрямую, либо через систему событий.

Page 10: Сервер «Аллодов Онлайн». Архитектура и особенности разработки

www.mail.ru 10

Сервер. Структура

Низкий уровень:• VFS;• Logging;• Net.Средний уровень:• поиск пути;• LoS;• ресурсная система;• сканер;• система репликации;• система сообщений.Высокий уровень. Различные компоненты объединяющие сервисы в более сложную структуру:• Map-сервис.

Page 11: Сервер «Аллодов Онлайн». Архитектура и особенности разработки

www.mail.ru 11

Взаимодействие с клиентом

Общие данные расположены как на клиентской, так и на серверной стороне. Передачи не происходит.

Серверные данные. Изменения состояния игрового мира:• репликация;• безадресные сообщения (Event);• адресованные сообщения (Message).

Клиентские данные. Реакция клиента на события в мире:• сообщения серверу (Command).

Page 12: Сервер «Аллодов Онлайн». Архитектура и особенности разработки

www.mail.ru 12

Репликация

«Репликация – это явление на клиенте божественного сервера.»

Тимур Бухараев.

@ReplicateClassClient @ReplicateClassServer public final class Stat { @ReplicateClient @Precision(-1) private float base; @ReplicateClient @ReplicateServer @Precision(-1) private float result; @ReplicateClient @Precision(-1) private float resultLongTerm; private float minResult; }

class Stat : public Replicated { OBJECT_REFCOUNT_METHODS( Stat ) float base; float result; float resultLongTerm; public: Stat(); static Stat* GetDefaultObject(); const float GetBase() const { return base; } void SetBase( float _base ) { base = _base; } const float GetResult() const { return result; } void SetResult( float _result ) { result = _result; } const float GetResultLongTerm() const { … } void SetResultLongTerm( float _resultLongTerm ) { … } static int GetClassID() { return 64; } virtual bool CanCast( int toClassID ) const { … } #ifdef STAT_SPECIFIC_DECLARATIONS STAT_SPECIFIC_DECLARATIONS #endif }; }

Клиентская репликация.

Page 13: Сервер «Аллодов Онлайн». Архитектура и особенности разработки

www.mail.ru 13

Репликация

@ReplicateClassClient @ReplicateClassServer public final class Stat { @ReplicateClient @Precision(-1) private float base; @ReplicateClient @ReplicateServer @Precision(-1) private float result; @ReplicateClient @Precision(-1) private float resultLongTerm; private float minResult; }

package gameMechanics.constructor.stat; /** * Replication code, generated automatically. * Don't change manually! * * @author ReplicatorsGenerator */ public interface StatReplica { float getResult(); }

Серверная репликация.

Page 14: Сервер «Аллодов Онлайн». Архитектура и особенности разработки

www.mail.ru 14

Система сообщений@ReplicateOccurence(needCppCode = true) public class MsgCreaturePosition extends HandleableMsg { @Precision(2) private float yaw; @NotNull private ConstPoint pos; public MsgCreaturePosition() { } @Override public void readCpp(@NotNull … in) { super.readCpp(in); pos = Point.read(in); yaw = in.readFloat(2); } @Override public void writeCpp(@NotNull … out) { super.writeCpp(out); pos.writeCpp(out); out.writeFloat(yaw, 2); } }

@ReplicateOccurence(needCppCode = true) public class MsgCreaturePosition extends HandleableMsg { @Precision(2) private float yaw; @NotNull private ConstPoint pos; public MsgCreaturePosition() { } }

Генерация серверного кода.

Page 15: Сервер «Аллодов Онлайн». Архитектура и особенности разработки

www.mail.ru 15

Система сообщенийclass MsgCreaturePosition : public Msg { DECLARE_TERMINAL_EVENT( MsgCreaturePosition ); byte flags; int objId; Replica::Vec3 pos; float yaw; public: MsgCreaturePosition() { } MsgCreaturePosition(const Replica::Address & _from, const byte _flags, const int _objId, const Replica::Vec3 & _pos, const float _yaw) : Msg( _from ), flags( _flags ), objId( _objId ), pos( _pos ), yaw( _yaw ) { } const byte GetFlags() const { return flags; } const int GetObjId() const { return objId; } const Replica::Vec3& GetPos() const { return pos; } const float GetYaw() const { return yaw; } };

@ReplicateOccurence(needCppCode = true) public class MsgCreaturePosition extends HandleableMsg { @Precision(2) private float yaw; @NotNull private ConstPoint pos; public MsgCreaturePosition() { } }

Генерация клиентского кода.

Page 16: Сервер «Аллодов Онлайн». Архитектура и особенности разработки

www.mail.ru 16

Ресурсная система

public class DivisionCell … { @NotNullElements(policy = REMOVE) @DenyDefault @NotNull private ZoneResourceAbstract[] zones; @AllowDefault private int weight = 0; @AllowDefault private boolean replicate = true; }

Десериализация объектов из их XML-представления.

<cells> <Item> <zones> <Item href="Zone1"/> </zones> <weight>100500</weight> </Item> <Item> <zones> <Item href="Zones2"/> </zones> </Item> <Item> <zones> <Item href="Zones3"/> </zones> </Item> <Item> <zones> <Item href="Zones4"/> </zones> </Item> </cells>

Page 17: Сервер «Аллодов Онлайн». Архитектура и особенности разработки

www.mail.ru 17

Сервис поиска пути

Требования:• высокая производительность;• быстрая обработка запроса любой

сложности.Проблемы:• недопонимание между заказчиком и

разработчиком;• изменяющееся ТЗ;• сложность тестирования.

Page 18: Сервер «Аллодов Онлайн». Архитектура и особенности разработки

www.mail.ru 18

Старый поиск vs Новый поиск

Старый поиск Новый поиск

Модель Тайловая земля, NavigationMesh для объектов

Воксели

Алгоритм Левый обход, алгоритм Дейкстры, сглаживание по выпуклой оболочке

A-star, иерархический поиск

Скорость работы Быстро Чуть медленнее, но приемлемо

Адекватность результата

Плохо Хорошо

Масштабиремость Не масштабируется, для добавления функциональности надо переделывать

Существенно легче, благодаря однородной структуре данных

Перспективы Нет ( В теории довольно легко обобщается на 3хмерный поиск (под водой)

Page 19: Сервер «Аллодов Онлайн». Архитектура и особенности разработки

www.mail.ru 19

Проверка клиента

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

Система арбитров:• ненадёжная;• дорогая реализация системы;• любая проверка реализуется дёшево.Проверка на сервере:• еще более ненадёжная;• дешёвая реализациям системы;• любая проверка требует значительных усилий.

Page 20: Сервер «Аллодов Онлайн». Архитектура и особенности разработки

www.mail.ru 20

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

Типы:• тестирование функциональности;

• Unit-тесты;• нагрузочное тестирование (боты);• performance-тесты;• стресс-тестирование.

Page 21: Сервер «Аллодов Онлайн». Архитектура и особенности разработки

www.mail.ru 21

А что дальше?

Планы по развитию:• проверка клиента;• разработка отладочных инструментов;• работа над сервисами поиска, сканера,

движения, репликации и пр.

Page 22: Сервер «Аллодов Онлайн». Архитектура и особенности разработки

www.mail.ru 22

Камни, торчащие из земли

Проблемы, с которыми мы столкнулись:• Тестирование нагрузки. Реальные результаты

получаются только на реальных данных.• Масштабирование сервера. Оно дорогое.• Работа не зависящих от нас компонентов

(GC).• Отладка. Для сложноструктурированного

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

Page 23: Сервер «Аллодов Онлайн». Архитектура и особенности разработки

Сергей Спиридоновглава команды сервера,

департамент клиентских игр[email protected]

СПАСИБО!

www.mail.ru

Mail.RuРазработчик игр и сервисов №1Крупнейший работодатель в отрасли

Работайте у нас[email protected]://corp.mail.ru/career/vacancies/voronezh