Skip to content

Leopotam/ecslite-threads

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

15 Commits
May 22, 2024
Mar 26, 2022
May 22, 2024
Mar 26, 2022
Mar 26, 2022
Mar 26, 2022
May 22, 2024
Mar 26, 2022
May 22, 2024
Mar 26, 2022
Mar 26, 2022

Repository files navigation

LeoECS Lite Threads - Поддержка многопоточной обработки

Поддержка обработки сущностей в несколько системных потоков.

ВАЖНО! АКТИВНАЯ РАЗРАБОТКА ПРЕКРАЩЕНА, ВОЗМОЖНО ТОЛЬКО ИСПРАВЛЕНИЕ ОБНАРУЖЕННЫХ ОШИБОК. СОСТОЯНИЕ СТАБИЛЬНОЕ, ИЗВЕСТНЫХ ОШИБОК НЕ ОБНАРУЖЕНО. ЗА НОВЫМ ПОКОЛЕНИЕМ ФРЕЙМВОРКА СТОИТ СЛЕДИТЬ В БЛОГЕ https://leopotam.com/

Проверено на Unity 2020.3 (не зависит от Unity) и содержит asmdef-описания для компиляции в виде отдельных сборок и уменьшения времени рекомпиляции основного проекта.

Содержание

Социальные ресурсы

Блог разработчика

Установка

В виде unity модуля

Поддерживается установка в виде unity-модуля через git-ссылку в PackageManager или прямое редактирование Packages/manifest.json:

"com.leopotam.ecslite.threads": "https://github.com/Leopotam/ecslite-threads.git",

По умолчанию используется последняя релизная версия. Если требуется версия "в разработке" с актуальными изменениями - следует переключиться на ветку develop:

"com.leopotam.ecslite.threads": "https://github.com/Leopotam/ecslite-threads.git#develop",

В виде исходников

Код так же может быть склонирован или получен в виде архива со страницы релизов.

Пример использования

Component

struct C1 {
    public int Id;
}

ThreadSystem

class TestThreadSystem : EcsThreadSystem<TestThread, C1> {
    protected override int GetChunkSize (IEcsSystems systems) {
        // Минимальное количество сущностей, после которого
        // произойдет разделение обработки на новый поток.
        // Этот метод вызывается каждый цикл обновления.
        return 1000;
    }

    protected override EcsWorld GetWorld (IEcsSystems systems) {
        // Мир, в котором содержатся фильтры и компонентные пулы.
        return systems.GetWorld ();
    }
    
    protected override EcsFilter GetFilter (EcsWorld world) {
        // Фильтр, сущности из которого будут обрабатываться.
        return world.Filter<C1> ().End ();
    }

    // Дополнительная (опциональная) инициализация данных,
    // которые необходимы для расчетов в потоках.
    protected override void SetData (IEcsSystems systems, ref TestThread thread) {
        thread.DeltaTime = Time.deltaTime;
    }
}

ВАЖНО! EcsThreadSystem поддерживает до 4 типов компонентов.

Thread

struct TestThread : IEcsThread<C1> {
    public float DeltaTime;
    int[] _entities;
    C1[] _pool1;
    int[] _indices1;

    public void Init (int[] entities, C1[] pool1, int[] indices1) {
        // Сохранение массива сущностей.
        _entities = entities;
        // Сохранение dense-массива пула компонентов.
        _pool1 = pool1;
        // Сохранение sparse-массива пула компонентов.
        _indices1 = indices1;
    }

    public void Execute (int threadId, int fromIndex, int beforeIndex) {
        for (int i = fromIndex; i < beforeIndex; i++) {
            var e = _entities[i];
            ref var c1 = ref _pool1[_indices1[e]];
            c1.Id = (c1.Id + 1) % 10000;
        }
    }
}

ВАЖНО! Внутри обработчика запрещено изменять состояние мира: нельзя создавать / удалять сущности, нельзя добавлять / удалять компоненты на сущности. Допускается только модификация данных внутри существующих компонентов.

Лицензия

Пакет выпускается под MIT-Red лицензией.

В случаях лицензирования по условиям MIT-Red не стоит расчитывать на персональные консультации или какие-либо гарантии.