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

Post on 22-Jun-2015

2.147 Views

Category:

Career

4 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

TRANSCRIPT

www.mail.ru

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

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

www.mail.ru 2

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

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

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

www.mail.ru 3

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

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

www.mail.ru 4

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

www.mail.ru 5

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

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

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

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

www.mail.ru 7

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

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

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

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

www.mail.ru 8

Механика

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

www.mail.ru 9

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

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

www.mail.ru 10

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

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

www.mail.ru 11

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

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

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

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

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 }; }

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

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(); }

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

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() { } }

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

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() { } }

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

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>

www.mail.ru 17

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

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

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

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

www.mail.ru 18

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

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

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

Воксели

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

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

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

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

Плохо Хорошо

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

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

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

www.mail.ru 19

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

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

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

www.mail.ru 20

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

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

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

www.mail.ru 21

А что дальше?

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

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

www.mail.ru 22

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

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

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

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

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

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

департамент клиентских игрs.spiridonov@corp.mail.ru

СПАСИБО!

www.mail.ru

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

Работайте у нас!job.gamedev@corp.mail.ruhttp://corp.mail.ru/career/vacancies/voronezh

top related