Докуметация Cтарт Статьи Форум Лента Вход
Не официальное русскоязычное сообщество
Главная
    Документация jMonkeyEngine
        jMonkeyEngine Уроки и Документация
            Вклады
                Система Сущностей Zay-ES
                    Система Сущностей Продвинутая

Система Сущностей Продвинутая

Опубликованно: 28.07.2017, 18:33
Последняя редакция, Andry: 30.07.2017 19:31

В этой статье мы объясним, как выглядит Система Сущностей JMonkey и почему.

Если вы новичок в этом вопросе, пожалуйста, сначала ознакомьтесь с Система Сущностей Введение.

Многопоточность

Одно из различий между Системой Сущностей JMonkey и другими Системами Сущностей заключается в том, что вам разрешен доступ к системе из разных потоков. Это может дать вашей игре огромное повышение производительности, потому что дорогостоящая задача может быть легко разделена на отдельные потоки. Это приводит к уникальному дизайну компонентов и внедрению Entity Sets.

Наборы Сущностей(Entity Sets)

Одной частью этого специального подхода являются Наборы Сущностей(Entity Sets). В большинстве случаев, когда вы хотите работать с Сущностями, вы создаете Набор Сущностей и добавляете имена классов интересующих вас компонентов в конструктор. И теперь Набор Сущностей создает объекты Entity для всех сущностей, которые содержат переданные классы компонентов. В этих Entities содержатся только те компоненты, которые нужны для Набора(Sets). Это означает, что разные Наборы Сущностей имеют два разных объекта Entity для одной и той же сущности. Поэтому изменения одной сущности должны быть синхронизировано с другими Наборами Сущностей. Это работает с событиями, созданными для каждого изменения, и передается другим наборам сущностей. С помощью метода applyChanges() этот Набор сущностей обновит все свои сущности или удалит/добавит новые. Кроме того, после вызова этого метода у вас есть прямой доступ ко всем добавленным, измененным и удаленным, в том числе и отдельно друг от друга, сущностям, и нет необходимости перебирать все сущности.

Компоненты

Поскольку у компонентов нет других методов, кроме геттеров, изменения производятся путем замены компонента сущности на новый. Поэтому сущность может иметь только один компонент того же класса. Если у компонента будет сеттер, никакое событие больше не будет запускаться, а параллельная обработка больше невозможна. Важно, чтобы вы хранили только чистые данные в компонентах, потому что иначе вы не будете знать где есть логика, и четкость дизайна этого подхода реализации программного обеспечения затеряется.

Начинающие стремятся добавить к компоненту большие объекты, такие как spatial и геометрии. Это большая ошибка, потому что такие объекты содержат логику, а в компонентах нашего подхода должны быть только данные. Абстрактные на общем уровне или храните их полностью в системах.
Никогда не создавайте подклассы класса Компонента.

Что такое Системы?

По простому все объекты, которые используют сущности/компоненты, можно назвать системой. Например, AppStates может работать с различными компонентами и может быть легко добавлен в приложение.

Никогда не изменяйте один и тот же компонент из разных систем.

Если две системы изменяют одни и те же компоненты, тогда существует дефект дизайна. Это признак отсутствия недостающего компонента или системы.

Обратная сторона

Существует два разных способа хранения информации:

Hashmaps

Для каждого класса компонентов создается новый Hashmap, который содержит entityId как ключ и компонент как значение. Поэтому, если вам нужно узнать все сущности, которые владеют компонентами определенного типа, система будет искать в этих Hashmaps с тем же entityId.

SQL

Вся информация о компонентах хранится в базе данных SQL, это делается путем отражения. Поэтому всем Компонентам нужен пустой конструктор, когда они хранятся в базе данных. В противном случае невозможно загрузить компонент.

Поскольку библиотеки SQL бывают разные, Система Сущностей сосредоточена только на работе с HSQLDB.

Гибрид

Поскольку сохранение/загрузка объектов компонентов из базы данных SQL происходит медленно, это не работает для компонентов, которые недавно были изменены. (PositionComponent). С другой стороны, проверяя weather, сущность имеет специальный компонент ускоряющий базу данных SQL. Чтобы сохранить оба преимущества, существует гибридный подход:

  • Компоненты помещаются в Hashmap.
  • Постоянные Компоненты хранятся в базе данных SQL.

Генерация Id

Каждый объект имеет уникальный идентификатор, который является довольно длинным. Идентификаторы не используются повторно, потому что, если бы это было, то они не были бы больше уникальными, что могло бы вызвать огромные проблемы.

Часто люди боятся, что у них закончатся Id: если вы будете создавать новую сущность каждую секунду, вам понадобится примерно 585 лет, прежде чем у вас закончатся id.

Переведено для jmonkeyengine.ru, оригинал
Автор перевода: Andry

Добавить комментарий

jMonkeyEngine.ru © 2017. Все права сохранены.