예제 #1
0
파일: EcsWorld.cs 프로젝트: midgithub/ecs
        /// <summary>
        /// Gets filter for specific components.
        /// </summary>
        /// <param name="include">Component mask for required components.</param>
        /// <param name="include">Component mask for denied components.</param>
        /// <param name="shouldBeFilled">New filter should be filled with compatible entities on creation.</param>
        internal EcsFilter GetFilter(EcsComponentMask include, EcsComponentMask exclude, bool shouldBeFilled)
        {
#if DEBUG
            if (include == null)
            {
                throw new ArgumentNullException("include");
            }
            if (exclude == null)
            {
                throw new ArgumentNullException("exclude");
            }
#endif
            var i = _filtersCount - 1;
            for (; i >= 0; i--)
            {
                if (this._filters[i].IncludeMask.IsEquals(include) && _filters[i].ExcludeMask.IsEquals(exclude))
                {
                    break;
                }
            }
            if (i == -1)
            {
                i = _filtersCount;

                var filter = new EcsFilter(include, exclude);
                if (shouldBeFilled)
                {
                    FillFilter(filter);
                }

                if (_filtersCount == _filters.Length)
                {
                    Array.Resize(ref _filters, _filtersCount << 1);
                }
                _filters[_filtersCount++] = filter;

                for (var bit = 0; bit < include.BitsCount; bit++)
                {
                    var typeId = include.Bits[bit];
                    if (typeId >= _componentPoolFilters.Length)
                    {
                        Array.Resize(ref _componentPoolFilters, EcsHelpers.GetPowerOfTwoSize(typeId + 1));
                    }
                    var filterList = _componentPoolFilters[typeId];
                    if (filterList == null)
                    {
                        filterList = new EcsFilterList();
                        _componentPoolFilters[typeId] = filterList;
                    }
                    if (filterList.Count == filterList.Filters.Length)
                    {
                        Array.Resize(ref filterList.Filters, filterList.Count << 1);
                    }
                    filterList.Filters[filterList.Count++] = filter;
                }
            }
            return(_filters[i]);
        }
예제 #2
0
 /// <summary>
 /// Fills filter with compatible entities.
 /// </summary>
 /// <param name="filter">Filter.</param>
 void FillFilter(EcsFilter filter)
 {
     for (var i = 0; i < _entitiesCount; i++)
     {
         var entity = _entities[i];
         if (!entity.IsReserved && entity.Mask.IsCompatible(filter))
         {
             filter.Entities.Add(i);
         }
     }
 }
예제 #3
0
        public virtual void Initialize()
        {
            _world          = GetWorld();
            _filter         = GetFilter();
            _worker         = GetWorker();
            _minJobSize     = GetMinJobSize();
            _threadsCount   = GetThreadsCount();
            _forceSyncState = GetForceSyncState();
#if DEBUG
            if (_world == null)
            {
                throw new Exception("Invalid EcsWorld");
            }
            if (_filter == null)
            {
                throw new Exception("Invalid EcsFilter");
            }
            if (_minJobSize < 1)
            {
                throw new Exception("Invalid JobSize");
            }
            if (_threadsCount < 1)
            {
                throw new Exception("Invalid ThreadsCount");
            }
#endif
#if !UNITY_WEBGL
            _descs = new WorkerDesc[_threadsCount];
            _syncs = new ManualResetEvent[_threadsCount];
            EcsMultiThreadJob job;
            for (var i = 0; i < _descs.Length; i++)
            {
                job       = new EcsMultiThreadJob();
                job.World = _world;
                var desc = new WorkerDesc();
                desc.Job    = job;
                desc.Thread = new Thread(ThreadProc);
                desc.Thread.IsBackground = true;
#if DEBUG
                desc.Thread.Name = string.Format("ECS-{0:X}-{1}", this.GetHashCode(), i);
#endif
                desc.HasWork  = new ManualResetEvent(false);
                desc.WorkDone = new ManualResetEvent(true);
                desc.Worker   = _worker;
                _descs[i]     = desc;
                _syncs[i]     = desc.WorkDone;
                desc.Thread.Start(desc);
            }
#endif
            _localJob       = new EcsMultiThreadJob();
            _localJob.World = _world;
        }
예제 #4
0
        void IEcsPreInitSystem.PreInitialize()
        {
            _reactFilter = GetReactFilter();
            _type        = GetReactSystemType();
#if DEBUG
            if (_type == EcsReactSystemType.OnRemove)
            {
                throw new System.NotSupportedException(
                          "OnRemove type not supported for delayed processing, use EcsReactInstantSystem instead.");
            }
#endif
            _reactFilter.AddListener(this);
        }
예제 #5
0
파일: EcsWorld.cs 프로젝트: midgithub/ecs
 /// <summary>
 /// Fills filter with compatible entities.
 /// </summary>
 /// <param name="filter">Filter.</param>
 void FillFilter(EcsFilter filter)
 {
     for (var i = 0; i < _entitiesCount; i++)
     {
         var entity = _entities[i];
         if (!entity.IsReserved && entity.Mask.IsCompatible(filter))
         {
             if (filter.Entities.Length == filter.EntitiesCount)
             {
                 Array.Resize(ref filter.Entities, filter.EntitiesCount << 1);
             }
             filter.Entities[filter.EntitiesCount++] = i;
         }
     }
 }
예제 #6
0
        void IEcsPreInitSystem.PreInitialize()
        {
            _reactFilter = GetReactFilter();
            _type        = GetReactSystemType();
            switch (_type)
            {
            case EcsReactSystemType.OnAdd:
                _reactFilter.OnEntityAdded   += OnEntityAdded;
                _reactFilter.OnEntityRemoved += OnEntityRemoved;
                break;

            case EcsReactSystemType.OnUpdate:
                _reactFilter.OnEntityUpdated += OnEntityAdded;
                break;
            }
        }
예제 #7
0
        public virtual void Destroy()
        {
#if !UNITY_WEBGL
            for (var i = 0; i < _descs.Length; i++)
            {
                var desc = _descs[i];
                _descs[i] = null;
                desc.Thread.Interrupt();
                desc.Thread.Join(10);
                _syncs[i].Close();
                _syncs[i] = null;
            }
#endif
            _world  = null;
            _filter = null;
            _worker = null;
        }
예제 #8
0
 void IEcsPreInitSystem.PreInitialize()
 {
     _reactFilter = GetReactFilter();
     _type        = GetReactSystemType();
     _reactFilter.AddListener(this);
 }