SlideShare ist ein Scribd-Unternehmen logo
1 von 33
Downloaden Sie, um offline zu lesen
О докладчике

Якимец Максим
C# на сервере
Использование

Entity Component System
при разработке игр.
Структура доклада

•
•
•
•
•
•
•
•

Что предлагает ООП
Различные Entity Component Systems
Выбор Artemis
Описание игрового мира. Примеры
AI, Scripting
Физика
Сеть
Tips & Tricks
Что предлагает ООП?

•
•
•
•
•
•

Множественное наследование
Множество классов
Композиция
Типажи (traits)
АОП
Паттерн “Стратегия”

Множественное поведение
Entity Component Systems

Unity
Ash
Ember
Artemis
Apollo
Artemis
Entity System Framework
Entity Component System

Artemis
•
•
•
•

Entity
- ID.
Components - данные
Systems
- логика, поведение
Managers - управление данными, запросы

Data Oriented Design
Artemis
var world = new EntityWorld(initializeAll: true);
Entity entity = world.CreateEntity();
entity.Add(new Transform(100, 100));
entity.Add(new Velocity(1, 1));
Artemis
var frameTime = watch.Elapsed - currentTime;
accumulator += frameTime;
while (accumulator >= minDelta)
{
entityWorld.Update(minDelta);
accumulator -= minDelta;
}
currentTime = watch.Elapsed;
MovementSystem
[ArtemisEntitySystem]
public class MovementSystem : EntityProcessingSystem
{
public MovementSystem()
: base(Aspect.All(typeof(Transform), typeof(Velocity)))
{
}
...
}
MovementSystem

public override void Process(Entity entity)
{
var velocity = entity.Get<Velocity>();
var transform = entity.Get<Transform>();
var seconds = this.EntityWorld.Delta.TotalSeconds;
transform.X += velocity.X * seconds;
transform.Y += velocity.Y * seconds;
}
[ArtemisEntitySystem]
public class AfterlifeSystem : EntityProcessingSystem
{
public event Action<Entity> EntityVanishing;
public AfterlifeSystem()
: base(Aspect.All(typeof(KilledComponent)))
{
}
public override void Process(Entity entity)
{
var expiresComponent = entity.Get<ExpiresComponent>();
if (expiresComponent == null || expiresComponent.IsExpired)
{
this.OnEntityVanishing(entity);
entity.Delete();
}
}
private void OnEntityVanishing(Entity entity)
{
var handler = this.EntityVanishing;
if (handler != null)
{
handler(entity);
}
}
Описание игрового мира
Position (Transform)
Velocity (Movement)
Lifetime (Expires)
Health (Destroyable)
Attack (Damager)
Dead (Killed)
Gold
BountyReward
Bonus
InputController
Animation
Collider
Physics

MovementSystem
ExpirationSystem
AttackSystem
AfterlifeSystem
BonusSystem
BountyRewardSystem
AnimationSystem
RenderSystem
PhysicsSystem
Описание игрового мира

CellPosition
ScreenPosition
Damager
TimedEffect
Spreadable
Destroyable
Collidable
BombLayer
Powerup
Описание игрового мира

EnemyComponent
ExpiresComponent
HealthComponent
WeaponComponent
TransformComponent
VelocityComponent
SpatialFormComponent
Описание игрового мира

EnemyComponent
ExpiresComponent
HealthComponent
WeaponComponent
TransformComponent
VelocityComponent
SpatialFormComponent

EnemyShipMovementSystem
ExpirationSystem
EnemyShooterSystem
PlayerShipControlSystem
CollisionSystem
MovementSystem
RenderSystem
HudRenderSystem
EnemySpawnSystem
Scripting
public class ScriptComponent: IComponent
{
public IScript Script { get; set; }
}
public interface IScript
{
void Init(EntityWorld world, Entity entity);
void Update();
}
Scripting

ScriptComponent (IScript) + ScriptSystem
vs
BehaviorXComponent + BehaviorXSystem
BehaviorYComponent + BehaviorYSystem
AI: BehaviorLibrary
public class AIComponent: IComponent
{
public Behavior Behavior { get; set; }
}
public class AISystem : EntityProcessingSystem
{
public override void Process(Entity entity)
{
entity.Get<AIComponent>().Behavior.Behave();
}
}
Физика

PhysicsComponent:
Body
PhysicsSystem:
OnAdded
-> physicsWorld.Add(body)
OnRemoved -> physicsWorld.Remove(body)
ProcessEntities -> physicsWorld.Step();
Физика: Position

PositionComponent
PhysicsComponent:
Body (Position + Form)
Сеть

• ECS на сервере и на клиенте
• ECS на сервере, ООП на клиенте
Сеть
foreach (Entity player in this.players)
{
float gold = player.Get<Gold>().Value;
if (this.playersGold[player.Id] != gold)
{
this.playersGold[player.Id] = gold;
this.RaiseGoldChangedEvent(gold, player);
}
}
Tips & tricks

Взаимодействие
между частями Entity System
Entity-Entity
Component-Component
Entity-Component

System-System
Tips & tricks

• Порядок срабатывания систем
• Удаление/добавление Component
• Удаление Entity
Tips & tricks

Pooling

•
•

entity pool
component pool

Проблема с переиспользованием Entity.Id
Tips & tricks

Карта - это Entity? Component?
Tips & tricks

Связи между Entity:
references
IDs
Managers
System data

•
•
•
•
Пример: инвентарь

public class InventoryComponent: IComponent
{
public List<Entity> Items { get; set; }
}
public class InventoryItemComponent: IComponent
{
public Entity Inventory { get; set; }
}
public class InventoryManager
{
private Dictionary<Entity, List<Entity>> inventories;
}
Пример: Заклинания

•
•
•
•
•
•

Удар молнии = Position + Damage + Attacking
Камнепад
= Position + Damage + AoE + Attacking
Мина
= Position + Damage + AoE
Бомба с фитилем = Position + Damage + AoE +
Expires + AttackOnExpires
Болото
= Position + AoE + Expires + BuffSource
Усиление = Position + AoE + Expires(0) + BuffSource
Пример: неуязвимость

Неуязвимость
HealthComponent
DefenseComponent
“Build games, not engines”

“A game is just a real-time
database with a pretty
graphical front end.”

“Entity Systems are the
future of MMOs”

“Do not try and bend the spoon
- that's impossible. Instead, only
try to realize the truth… There is
no spoon.”

“Build games, not elaborate component systems!”
maximusya@tut.by

Weitere ähnliche Inhalte

Ähnlich wie Якимец Максим ECS in games

Сверхоптимизация кода на Python
Сверхоптимизация кода на PythonСверхоптимизация кода на Python
Сверхоптимизация кода на Pythonru_Parallels
 
Сверхоптимизация кода на Python
Сверхоптимизация кода на PythonСверхоптимизация кода на Python
Сверхоптимизация кода на PythonCodeFest
 
Типичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriverТипичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriverIgor Khrol
 
Александр Коротин. Безопасность систем управления турбинами в электроэнергетике
Александр Коротин. Безопасность систем управления турбинами в электроэнергетикеАлександр Коротин. Безопасность систем управления турбинами в электроэнергетике
Александр Коротин. Безопасность систем управления турбинами в электроэнергетикеKaspersky
 
Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"LogeekNightUkraine
 
Как пережить запуск онлайн-игры и справиться с мертвыми душами / Андрей Трифа...
Как пережить запуск онлайн-игры и справиться с мертвыми душами / Андрей Трифа...Как пережить запуск онлайн-игры и справиться с мертвыми душами / Андрей Трифа...
Как пережить запуск онлайн-игры и справиться с мертвыми душами / Андрей Трифа...Ontico
 
Как скачать статистику игроков World of Tanks за одну ночь
Как скачать статистику игроков World of Tanks за одну ночьКак скачать статистику игроков World of Tanks за одну ночь
Как скачать статистику игроков World of Tanks за одну ночьPavel Perestoronin
 
Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...
Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...
Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...Python Meetup
 
Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...
Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...
Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...Sigma Software
 
20100425 model based_testing_kuliamin_lectures01-03
20100425 model based_testing_kuliamin_lectures01-0320100425 model based_testing_kuliamin_lectures01-03
20100425 model based_testing_kuliamin_lectures01-03Computer Science Club
 
Сенцов Сергей "Приемы оптимизаций Desktop приложений"
Сенцов Сергей "Приемы оптимизаций Desktop приложений"Сенцов Сергей "Приемы оптимизаций Desktop приложений"
Сенцов Сергей "Приемы оптимизаций Desktop приложений"Yulia Tsisyk
 
Automation Functional Testing in Agile Projects
Automation Functional Testing in Agile ProjectsAutomation Functional Testing in Agile Projects
Automation Functional Testing in Agile ProjectsAndrey Rebrov
 
Миграция JIRA - безобразие или безрассудство
Миграция JIRA - безобразие или безрассудствоМиграция JIRA - безобразие или безрассудство
Миграция JIRA - безобразие или безрассудствоSQALab
 
Артемий Гарин "Выбор лучшего хранилища в Android (cпойлер: Realm)"
Артемий Гарин "Выбор лучшего хранилища в Android (cпойлер: Realm)"Артемий Гарин "Выбор лучшего хранилища в Android (cпойлер: Realm)"
Артемий Гарин "Выбор лучшего хранилища в Android (cпойлер: Realm)"IT Event
 
Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)
Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)
Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)Ontico
 
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья ШишковC++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишковcorehard_by
 
Alexei Sintsov - "Between error and vulerability - one step"
Alexei Sintsov - "Between error and vulerability - one step"Alexei Sintsov - "Between error and vulerability - one step"
Alexei Sintsov - "Between error and vulerability - one step"Andrew Mayorov
 
Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2Oleksii Okhrymenko
 
тестирование защищенности веб приложений
тестирование защищенности веб приложенийтестирование защищенности веб приложений
тестирование защищенности веб приложенийZestranec
 

Ähnlich wie Якимец Максим ECS in games (20)

Agile Instrumentation
Agile InstrumentationAgile Instrumentation
Agile Instrumentation
 
Сверхоптимизация кода на Python
Сверхоптимизация кода на PythonСверхоптимизация кода на Python
Сверхоптимизация кода на Python
 
Сверхоптимизация кода на Python
Сверхоптимизация кода на PythonСверхоптимизация кода на Python
Сверхоптимизация кода на Python
 
Типичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriverТипичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriver
 
Александр Коротин. Безопасность систем управления турбинами в электроэнергетике
Александр Коротин. Безопасность систем управления турбинами в электроэнергетикеАлександр Коротин. Безопасность систем управления турбинами в электроэнергетике
Александр Коротин. Безопасность систем управления турбинами в электроэнергетике
 
Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"
 
Как пережить запуск онлайн-игры и справиться с мертвыми душами / Андрей Трифа...
Как пережить запуск онлайн-игры и справиться с мертвыми душами / Андрей Трифа...Как пережить запуск онлайн-игры и справиться с мертвыми душами / Андрей Трифа...
Как пережить запуск онлайн-игры и справиться с мертвыми душами / Андрей Трифа...
 
Как скачать статистику игроков World of Tanks за одну ночь
Как скачать статистику игроков World of Tanks за одну ночьКак скачать статистику игроков World of Tanks за одну ночь
Как скачать статистику игроков World of Tanks за одну ночь
 
Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...
Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...
Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...
 
Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...
Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...
Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...
 
20100425 model based_testing_kuliamin_lectures01-03
20100425 model based_testing_kuliamin_lectures01-0320100425 model based_testing_kuliamin_lectures01-03
20100425 model based_testing_kuliamin_lectures01-03
 
Сенцов Сергей "Приемы оптимизаций Desktop приложений"
Сенцов Сергей "Приемы оптимизаций Desktop приложений"Сенцов Сергей "Приемы оптимизаций Desktop приложений"
Сенцов Сергей "Приемы оптимизаций Desktop приложений"
 
Automation Functional Testing in Agile Projects
Automation Functional Testing in Agile ProjectsAutomation Functional Testing in Agile Projects
Automation Functional Testing in Agile Projects
 
Миграция JIRA - безобразие или безрассудство
Миграция JIRA - безобразие или безрассудствоМиграция JIRA - безобразие или безрассудство
Миграция JIRA - безобразие или безрассудство
 
Артемий Гарин "Выбор лучшего хранилища в Android (cпойлер: Realm)"
Артемий Гарин "Выбор лучшего хранилища в Android (cпойлер: Realm)"Артемий Гарин "Выбор лучшего хранилища в Android (cпойлер: Realm)"
Артемий Гарин "Выбор лучшего хранилища в Android (cпойлер: Realm)"
 
Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)
Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)
Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)
 
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья ШишковC++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
 
Alexei Sintsov - "Between error and vulerability - one step"
Alexei Sintsov - "Between error and vulerability - one step"Alexei Sintsov - "Between error and vulerability - one step"
Alexei Sintsov - "Between error and vulerability - one step"
 
Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2
 
тестирование защищенности веб приложений
тестирование защищенности веб приложенийтестирование защищенности веб приложений
тестирование защищенности веб приложений
 

Якимец Максим ECS in games