Сервер «Аллодов Онлайн». Архитектура и особенности...
DESCRIPTION
Докладчик: Сергей Спиридонов, глава команды сервера на проекте «Аллоды Онлайн».TRANSCRIPT
![Page 1: Сервер «Аллодов Онлайн». Архитектура и особенности разработки](https://reader038.vdocuments.net/reader038/viewer/2022102722/55878fd0d8b42a365d8b46df/html5/thumbnails/1.jpg)
www.mail.ru
Спиридонов Сергейглава команды сервера, департамент клиентских игр
Сервер «Аллодов Онлайн». Архитектура и особенности разработки.
![Page 2: Сервер «Аллодов Онлайн». Архитектура и особенности разработки](https://reader038.vdocuments.net/reader038/viewer/2022102722/55878fd0d8b42a365d8b46df/html5/thumbnails/2.jpg)
www.mail.ru 2
Сервер высоконагруженного приложения
Что это такое?Требования:• real-time;• работа 24/7;• Устойчивость к нештатным
ситуациям.Особенности:• cложность диагностики;• cложность тестирования нагрузки;• cложность проектирования.
![Page 3: Сервер «Аллодов Онлайн». Архитектура и особенности разработки](https://reader038.vdocuments.net/reader038/viewer/2022102722/55878fd0d8b42a365d8b46df/html5/thumbnails/3.jpg)
www.mail.ru 3
Аллоды Онлайн
Требования к игре:• высокое CCU (~5k);• большой мир;• Насыщенное окружение на клиенте.
![Page 4: Сервер «Аллодов Онлайн». Архитектура и особенности разработки](https://reader038.vdocuments.net/reader038/viewer/2022102722/55878fd0d8b42a365d8b46df/html5/thumbnails/4.jpg)
www.mail.ru 4
Структура приложения
![Page 5: Сервер «Аллодов Онлайн». Архитектура и особенности разработки](https://reader038.vdocuments.net/reader038/viewer/2022102722/55878fd0d8b42a365d8b46df/html5/thumbnails/5.jpg)
www.mail.ru 5
Сервер. Выбор языка
Что нужно сравнивать:• производительность;• количество работы, которую можно ему языку;• скорость разработки.Какие были выдвинуты требования:• наличие memory management;• кроссплатформенность (Linux/Windows);• удобная среда разработки.
Языки низкого уровня (C/C++).Языки высокого уровня (Java, C#).Языки сверхвысокого уровня (Python, Ruby, Haskel).
![Page 6: Сервер «Аллодов Онлайн». Архитектура и особенности разработки](https://reader038.vdocuments.net/reader038/viewer/2022102722/55878fd0d8b42a365d8b46df/html5/thumbnails/6.jpg)
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: Сервер «Аллодов Онлайн». Архитектура и особенности разработки](https://reader038.vdocuments.net/reader038/viewer/2022102722/55878fd0d8b42a365d8b46df/html5/thumbnails/7.jpg)
www.mail.ru 7
Сервер. Структура
Логически сервер делится на 2 компоненты, механику и ядро.
Механика – высокий уровень, задаёт специфику приложения.
Ядро – низкий уровень, функциональность, общая для большинства игр.
![Page 8: Сервер «Аллодов Онлайн». Архитектура и особенности разработки](https://reader038.vdocuments.net/reader038/viewer/2022102722/55878fd0d8b42a365d8b46df/html5/thumbnails/8.jpg)
www.mail.ru 8
Механика
Что такое механика и как она работает?Примерно так:
![Page 9: Сервер «Аллодов Онлайн». Архитектура и особенности разработки](https://reader038.vdocuments.net/reader038/viewer/2022102722/55878fd0d8b42a365d8b46df/html5/thumbnails/9.jpg)
www.mail.ru 9
Сервер. Структура
Сервер состоит из сервисов. Общение происходит либо напрямую, либо через систему событий.
![Page 10: Сервер «Аллодов Онлайн». Архитектура и особенности разработки](https://reader038.vdocuments.net/reader038/viewer/2022102722/55878fd0d8b42a365d8b46df/html5/thumbnails/10.jpg)
www.mail.ru 10
Сервер. Структура
Низкий уровень:• VFS;• Logging;• Net.Средний уровень:• поиск пути;• LoS;• ресурсная система;• сканер;• система репликации;• система сообщений.Высокий уровень. Различные компоненты объединяющие сервисы в более сложную структуру:• Map-сервис.
![Page 11: Сервер «Аллодов Онлайн». Архитектура и особенности разработки](https://reader038.vdocuments.net/reader038/viewer/2022102722/55878fd0d8b42a365d8b46df/html5/thumbnails/11.jpg)
www.mail.ru 11
Взаимодействие с клиентом
Общие данные расположены как на клиентской, так и на серверной стороне. Передачи не происходит.
Серверные данные. Изменения состояния игрового мира:• репликация;• безадресные сообщения (Event);• адресованные сообщения (Message).
Клиентские данные. Реакция клиента на события в мире:• сообщения серверу (Command).
![Page 12: Сервер «Аллодов Онлайн». Архитектура и особенности разработки](https://reader038.vdocuments.net/reader038/viewer/2022102722/55878fd0d8b42a365d8b46df/html5/thumbnails/12.jpg)
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: Сервер «Аллодов Онлайн». Архитектура и особенности разработки](https://reader038.vdocuments.net/reader038/viewer/2022102722/55878fd0d8b42a365d8b46df/html5/thumbnails/13.jpg)
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: Сервер «Аллодов Онлайн». Архитектура и особенности разработки](https://reader038.vdocuments.net/reader038/viewer/2022102722/55878fd0d8b42a365d8b46df/html5/thumbnails/14.jpg)
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: Сервер «Аллодов Онлайн». Архитектура и особенности разработки](https://reader038.vdocuments.net/reader038/viewer/2022102722/55878fd0d8b42a365d8b46df/html5/thumbnails/15.jpg)
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: Сервер «Аллодов Онлайн». Архитектура и особенности разработки](https://reader038.vdocuments.net/reader038/viewer/2022102722/55878fd0d8b42a365d8b46df/html5/thumbnails/16.jpg)
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: Сервер «Аллодов Онлайн». Архитектура и особенности разработки](https://reader038.vdocuments.net/reader038/viewer/2022102722/55878fd0d8b42a365d8b46df/html5/thumbnails/17.jpg)
www.mail.ru 17
Сервис поиска пути
Требования:• высокая производительность;• быстрая обработка запроса любой
сложности.Проблемы:• недопонимание между заказчиком и
разработчиком;• изменяющееся ТЗ;• сложность тестирования.
![Page 18: Сервер «Аллодов Онлайн». Архитектура и особенности разработки](https://reader038.vdocuments.net/reader038/viewer/2022102722/55878fd0d8b42a365d8b46df/html5/thumbnails/18.jpg)
www.mail.ru 18
Старый поиск vs Новый поиск
Старый поиск Новый поиск
Модель Тайловая земля, NavigationMesh для объектов
Воксели
Алгоритм Левый обход, алгоритм Дейкстры, сглаживание по выпуклой оболочке
A-star, иерархический поиск
Скорость работы Быстро Чуть медленнее, но приемлемо
Адекватность результата
Плохо Хорошо
Масштабиремость Не масштабируется, для добавления функциональности надо переделывать
Существенно легче, благодаря однородной структуре данных
Перспективы Нет ( В теории довольно легко обобщается на 3хмерный поиск (под водой)
![Page 19: Сервер «Аллодов Онлайн». Архитектура и особенности разработки](https://reader038.vdocuments.net/reader038/viewer/2022102722/55878fd0d8b42a365d8b46df/html5/thumbnails/19.jpg)
www.mail.ru 19
Проверка клиента
Нет возможности проверить, что код клиента не был модифицирован. Нужно проверять приходящую от него информацию.
Система арбитров:• ненадёжная;• дорогая реализация системы;• любая проверка реализуется дёшево.Проверка на сервере:• еще более ненадёжная;• дешёвая реализациям системы;• любая проверка требует значительных усилий.
![Page 20: Сервер «Аллодов Онлайн». Архитектура и особенности разработки](https://reader038.vdocuments.net/reader038/viewer/2022102722/55878fd0d8b42a365d8b46df/html5/thumbnails/20.jpg)
www.mail.ru 20
Автоматическое тестирование
Типы:• тестирование функциональности;
• Unit-тесты;• нагрузочное тестирование (боты);• performance-тесты;• стресс-тестирование.
![Page 21: Сервер «Аллодов Онлайн». Архитектура и особенности разработки](https://reader038.vdocuments.net/reader038/viewer/2022102722/55878fd0d8b42a365d8b46df/html5/thumbnails/21.jpg)
www.mail.ru 21
А что дальше?
Планы по развитию:• проверка клиента;• разработка отладочных инструментов;• работа над сервисами поиска, сканера,
движения, репликации и пр.
![Page 22: Сервер «Аллодов Онлайн». Архитектура и особенности разработки](https://reader038.vdocuments.net/reader038/viewer/2022102722/55878fd0d8b42a365d8b46df/html5/thumbnails/22.jpg)
www.mail.ru 22
Камни, торчащие из земли
Проблемы, с которыми мы столкнулись:• Тестирование нагрузки. Реальные результаты
получаются только на реальных данных.• Масштабирование сервера. Оно дорогое.• Работа не зависящих от нас компонентов
(GC).• Отладка. Для сложноструктурированного
многопоточного приложения нет удобных механизмов отладки.
![Page 23: Сервер «Аллодов Онлайн». Архитектура и особенности разработки](https://reader038.vdocuments.net/reader038/viewer/2022102722/55878fd0d8b42a365d8b46df/html5/thumbnails/23.jpg)
Сергей Спиридоновглава команды сервера,
департамент клиентских игр[email protected]
СПАСИБО!
www.mail.ru
Mail.RuРазработчик игр и сервисов №1Крупнейший работодатель в отрасли
Работайте у нас[email protected]://corp.mail.ru/career/vacancies/voronezh