Тема: Ресурсная система для MMO Докладчик: Сидоренко Дмитрий
О чем пойдет речь Компоненты проекта MMO. Требования, предъявляемые к ресурсной системе Ресурсная система в многоязыковой среде Методы борьбы с некорректными данными Ресурсная система на основе XML Жизненный цикл базы данных Что еще хотелось бы реализовать
Компоненты MMO проекта Сервер Клиент Инструментарий (редактор карт, model viewer, инструментарий массового редактирования, экспортеры)
Требования компонент Сервер 1.Некорректные данные не должны ронять сервер 2.Возможность написания сложных семантических проверок данных Клиент 1.Возможность in-place загрузки
Требования компонент Инструментарий 1.Возможность распределенной работы с БД 2.Быстрый поиск по системе ресурсов 3.Удобный механизм типизации 4.Возможность массового редактирования 5.Возможность работы аутсорсеров
Общие требования Отсутствие дублирования данных Объектная модель данных Консистентность Быстрая загрузка Human readable – особенно на этапе разработки, пока еще нет удобных инструментов редактирования
Зачем нужно много языков программирования Клиент на С++ Компилятор генерирует оптимизированный native код Позволяет выполнять низкоуровневые манипуляции с памятью Сервер на Java Современный язык (простой синтаксис, garbage collection, reflection) Работает на Linux Удобная среда разработки (Intellij IDEA) Редактор на C# современный язык (…) язык изначально ориентированный на быструю разработку GUI приложений Удобные языковые конструкции (delegates, events, properties)
Ресурсная система в многоязыковой среде Метаописание ресурса задается на java.Используется инструментарий генерации кода для других языков, используемых в проекте. Плюсы выбора java для метаописания: Простой синтаксис Есть reflection – стандартный способ получить runtime type information Есть удобные среды разработки (Intellij IDEA) Есть аннотации – декларативные элементы языка
Генерация кода по метаописанию Resource.java dbcodegen Resource.cs С# компилятор Editor.exe Resource.h Resource.cpp C++ компилятор Game.exe
Борьба с некорректными данными Три рубежа обороны редактор (карт, спелов, квестов и т.д.) коммит хук в системе контроля версий подсистема десериализации ресурсов в игровом коде
Проверки ограничения диапазона Для примитивных типов данных можно задавать ограничение на значение. Ограничение проверяется на всех 3-х рубежах защиты. public class AstralShip extends Resource maxValue= f) private float maxValue=30) private int private AstralTurret [] turrets; }
Скажем нет NullPointerException public class AstralShip private AstralMissile [] missiles; public static class AstralMissile { public void launch() { } public class MissileLauncher { public void AstralShip.AstralMissile [] missiles){ for (AstralShip.AstralMissile missile:missiles){ missile.launch(); }
Default or not default Значения по умолчанию задаются в описателе ресурса. Для некоторых полей значение по умолчанию не имеет смысла. Такие поля требуют явного задания значений. public class Mob private float thickness= private String private VisualModel model; }
Более сложные проверки Можно задавать условия, проверяемые не для одного, а для целой группы объектов.
Ресурсная система на основе XML Объекты хранятся в отдельных XML файлах Плюсы 1.Иерархическая структура 2.Использование стандартных XML parsers для десериализации 3.Human readable. Возможность редактировать в любом xml редакторе и даже в простом текстовом редакторе 4.Возможность распределенной работы Минусы 1.Сложность массовой обработки 2.Много мелких файлов тормозит файловую систему 3.Дублирование данных
Inlining - встраивание нескольких мелких объектов в один XML файл Многие файловые системы не оптимизированы для большого количества маленьких файлов При хранении большого количества маленьких файлов в ФС метаинформация занимает больший объем, чем полезные данные
Inlining - встраивание нескольких объектов в один XML файл Можно так: Но если объекты маленькие, лучше так: AstralMissile 10
Дублирование данных AstralMissile1.xml AstralMissile2.xml AstralMissile3.xml AstralMissile4.xml
Использование прототипов для удаления дублирования данных AstralMissilePrototype.xml AstralMissile1.xml AstralMissile2.xml 15 AstralMissile3.xml 15 AstralMissile4.xml 0.01
Удобство редактирования Spell01Name.txt 4 35
Массовое редактирование
Поиск по системе ресурсов
Жизненный цикл базы данных
Рефакторинг данных Относительно простые рефакторинги: удаление поля переименование поля переименование типа Сложные рефакторинги: нужно писать конвертор данных
Generics в ресурсной системе
Вопросы? Сидоренко Дмитрий