260 likes | 492 Views
Тема: Ресурсная система для MMO Докладчик: Сидоренко Дмитрий. О чем пойдет речь. Компоненты проекта MMO. Требования, предъявляемые к ресурсной системе Ресурсная система в многоязыковой среде Методы борьбы с некорректными данными Ресурсная система на основе XML Жизненный цикл базы данных
E N D
Тема: Ресурсная система для MMOДокладчик: Сидоренко Дмитрий
О чем пойдет речь • Компоненты проекта MMO. Требования, предъявляемые к ресурсной системе • Ресурсная система в многоязыковой среде • Методы борьбы с некорректными данными • Ресурсная система на основе XML • Жизненный цикл базы данных • Что еще хотелось бы реализовать
Сервер Клиент Инструментарий (редактор карт, model viewer, инструментарий массового редактирования, экспортеры) Компоненты MMO проекта
Требования компонент • Сервер • Некорректные данные не должны ронять сервер • Возможность написания сложных семантических проверок данных • Клиент • Возможность in-place загрузки
Требования компонент Инструментарий • Возможность распределенной работы с БД • Быстрый поиск по системе ресурсов • Удобный механизм типизации • Возможность массового редактирования • Возможность работы аутсорсеров
Общие требования • Отсутствие дублирования данных • Объектная модель данных • Консистентность • Быстрая загрузка • Human readable – особенно на этапе разработки, пока еще нет удобных инструментов редактирования
Зачем нужно много языков программирования • Клиент на С++ • Компилятор генерирует оптимизированный native код • Позволяет выполнять низкоуровневые манипуляции с памятью • Сервер на Java • Современный язык (простой синтаксис, garbage collection, reflection) • Работает на Linux • Удобная среда разработки (Intellij IDEA) • Редактор на C# • современный язык (…) • язык изначально ориентированный на быструю разработку GUI приложений • Удобные языковые конструкции (delegates, events, properties)
Ресурсная система в многоязыковой среде Метаописание ресурса задается на java.Используется инструментарий генерации кода для других языков, используемых в проекте. Плюсы выбора java для метаописания: • Простой синтаксис • Есть reflection – стандартный способ получить runtime type information • Есть удобные среды разработки (Intellij IDEA) • Есть аннотации – декларативные элементы языка
Борьба с некорректными данными Три рубежа обороны • редактор (карт, спелов, квестов и т.д.) • коммит хук в системе контроля версий • подсистема десериализации ресурсов в игровом коде
Проверки ограничения диапазона Для примитивных типов данных можно задавать ограничение назначение. Ограничение проверяется на всех 3-х рубежах защиты. public class AstralShip extends Resource { @FloatMinMaxConstraint(minValue=10.0f, maxValue=1000000.0f) private float tonnage; @IntMinMaxConstraint(minValue=5, maxValue=30) private int crewCount; @ArrayIndexConstraint(maxIndex=25) private AstralTurret [] turrets; }
Скажем нет NullPointerException public class AstralShip extends Resource{ @NotNull @NotNullElements(policy=NotNullElements.RemovePolicy.REMOVE) private AstralMissile [] missiles; public static class AstralMissile { public void launch() { } } } public class MissileLauncher { public void launch(@NotNull AstralShip.AstralMissile [] missiles){ for (AstralShip.AstralMissile missile:missiles){ missile.launch(); } } }
Default or not default Значения поумолчанию задаются в описателе ресурса. Для некоторых полей значение поумолчанию не имеет смысла. Такие поля требуют явного задания значений. public class Mob { @AllowDefault private float thickness= 1.0f; @NotNull private String name; @NotNull private VisualModel model; }
Более сложные проверки Можно задавать условия, проверяемые не для одного, а для целой группы объектов.
Ресурсная система на основе XML • Объекты хранятся в отдельных XML файлах • Плюсы • Иерархическая структура • Использование стандартных XML parsers для десериализации • Human readable. Возможность редактировать в любом xml редакторе и даже в простом текстовом редакторе • Возможность распределенной работы • Минусы • Сложность массовой обработки • Много мелких файлов тормозит файловую систему • Дублирование данных
Inlining - встраивание нескольких мелких объектов в один XML файл • Многие файловые системы не оптимизированы для большого количества маленьких файлов • При хранении большого количества маленьких файлов в ФС метаинформация занимает больший объем, чем полезные данные
Inlining - встраивание нескольких объектов в один XML файл Можно так: <Port> <ships> < Item href=“AstralShip.xdb#xpointer(AstralShip)” /> < Item href=“LittleBoat.xdb#xpointer(Boat)” /> < Item href=“AstralSubmarine.xdb#xpointer(AstralSubmarine)” /> </ships> </Port> Но если объекты маленькие, лучше так: <Port> <ships> < Item type=“AstralShip” > <tonnage>100000</tonnage> <noOfGuns>10<noOfGuns> </Item> < Item type=“Boat” > <noOfPlaces>5</noOfPlaces> </Item> < Item type=“AstralSubmarine”> <ammoType>AstralMissile</ammoType> <ammoCount>10</ammoCount> </Item> </ships> </Port>
Дублирование данных AstralMissile1.xml <AstralMissile> <distance> 1000</distance> <detonation>10</ detonation> <precision> 0.1</ precision > <fuel>1000</fuel> <noOfParts>3</noOfParts> </ AstralMissile > AstralMissile2.xml <AstralMissile> <distance> 1000</distance> <detonation> 15</ detonation> <precision> 0.1</ precision > <fuel>1000</fuel> <noOfParts>3</noOfParts> </ AstralMissile > AstralMissile3.xml <AstralMissile> <distance> 1000</distance> <detonation> 20</ detonation> <precision> 0.1</ precision > <fuel>1000</fuel> <noOfParts>3</noOfParts> </ AstralMissile> AstralMissile4.xml <AstralMissile> <distance> 1000</distance> <detonation> 10</ detonation> <precision> 0.05</ precision > <fuel>1000</fuel> <noOfParts>3</noOfParts> </ AstralMissile>
Использование прототипов для удаления дублирования данных AstralMissilePrototype.xml <AstralMissile> <Vars> <distanceVar> 1000</distanceVar> <detonationVar>10</detonationVar> <precisionVar> 0.1</ precisionVar> <fuelVar>1000</fuelVar> <noOfPartsVar>3</noOfPartsVar> </Vars> <distance var=“distanceVar” /> <detonation var=“detonationVar” /> <precision var=“precisionVar” /> <fuelVar var=“fuelVar” /> <noOfParts var=“noOfPartsVar” /> </ AstralMissile> AstralMissile1.xml <AstralMissile> <include href=“AstralMissilePrototype.xml”/> </AstralMissile> AstralMissile2.xml <AstralMissile> <include href=“AstralMissilePrototype.xml”/> <Vars> <detonationVar>15</detonation> </Vars> </ AstralMissile> AstralMissile3.xml <AstralMissile> <include href=“AstralMissilePrototype.xml”/> <Vars> <detonationVar>15</detonation> </Vars> </ AstralMissile> AstralMissile4.xml <AstralMissile> <include href=“AstralMissilePrototype.xml”/> <Vars> <precisionVar>0.01</precisionVar> </Vars> </AstralMissile>
Удобство редактирования <?xml version="1.0" encoding="UTF-8" ?> <gameMechanics.constructor.schemes.spell.area.SpellArea> <Header> <Prototype href="Spell.xdb#xpointer(/gameMechanics.constructor.schemes.spell.area.SpellArea)" /> <Variables> <level>4</level> <mana>70</mana> <damage>35</damage> <name>Spell01Name.txt</name> <learnLevel>4</learnLevel> <minDamage>35</minDamage> <maxDamage>35</maxDamage> </Variables> </Header> <Name href="Spell01_Name.txt" /> <Description href="Spell01_Desc.txt" /> </gameMechanics.constructor.schemes.spell.area.SpellArea>
Рефакторинг данных Относительно простые рефакторинги: • удаление поля • переименование поля • переименование типа Сложные рефакторинги: • нужно писать конвертор данных
Вопросы? Сидоренко Дмитрий dmitry.sidorenko@nivalonline.com