Example #1
0
        private void Worker(EcsMultiThreadWorkerDesc workerDesc)
        {
            var realTimeSinceStartup = _timeFilter.Get1[0].RealTimeSinceStartup;
            var filter = workerDesc.Filter;

            foreach (var i in filter)
            {
                var movementState = filter.Get1[i];
                if (movementState.FinishMovementStateTime <= realTimeSinceStartup)
                {
                    float   delta;
                    ref var entity   = ref filter.Entities[i];
                    var     movement = entity.Get <MovementComponent>();
                    if (movement != null)
                    {
                        entity.Unset <MovementComponent>();
                        delta = _data.WaitTimeRange.GetRandom();
                    }
                    else
                    {
                        var speed     = _data.SpeedRange.GetRandom();
                        var direction = Helpers.GetRandomAndNormalizeVector3();
                        movement           = entity.Set <MovementComponent>();
                        movement.Direction = direction;
                        movement.Speed     = speed;
                        delta = _data.MovementTimeRange.GetRandom();
                    }
                    movementState.FinishMovementStateTime = realTimeSinceStartup + delta;
                }
            }
Example #2
0
 private static void Worker(EcsMultiThreadWorkerDesc workerDesc)
 {
     foreach (var i in workerDesc)
     {
         workerDesc.Filter.Get3(i).Value += (workerDesc.Filter.Get1(i).Value + workerDesc.Filter.Get2(i).Value) * Time;
     }
 }
 private static void Worker(EcsMultiThreadWorkerDesc workerDesc)
 {
     foreach (var i in workerDesc)
     {
         ++workerDesc.Filter.Get1(i).Value;
     }
 }
 private static void Worker(EcsMultiThreadWorkerDesc workerDesc)
 {
     foreach (var i in workerDesc)
     {
         var filter   = workerDesc.Filter;
         var position = filter.Get1[i];
         var view     = filter.Get2[i];
         view.Transform.position = position.Value;
     }
 }
        private void Worker(EcsMultiThreadWorkerDesc workerDesc)
        {
            var deltaTime = _timeFilter.Get1[0].DeltaTime;
            var filter    = workerDesc.Filter;

            foreach (var i in filter)
            {
                var movement = filter.Get1[i];
                var position = filter.Get2[i];
                var delta    = deltaTime * movement.Direction * movement.Speed;
                position.Value += delta;
            }
        }
Example #6
0
 void IEcsPreInitSystem.PreDestroy()
 {
     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;
     }
     _filter    = null;
     _worker    = null;
     _localDesc = null;
 }
Example #7
0
 /// <summary>
 /// Our worker callback for processing entities.
 /// Important: better to use static methods as workers - you cant touch any instance data without additional sync.
 /// </summary>
 static void Worker(GameWorld world, EcsMultiThreadWorkerDesc workerDesc)
 {
     foreach (var idx in workerDesc)
     {
         ref var chunk = ref workerDesc.Filter.Get1(idx);
         if ((chunk.flag & ChunkFlag.Generate) == ChunkFlag.Generate)
         {
             Generate(world.generator, chunk);
             chunk.flag |= ChunkFlag.Update;
         }
         if ((chunk.flag & ChunkFlag.Update) == ChunkFlag.Update)
         {
             Update(world, chunk);
         }
     }
Example #8
0
        void IEcsPreInitSystem.PreInitialize()
        {
            _filter       = GetFilter();
            _worker       = GetWorker();
            _minJobSize   = GetMinJobSize();
            _threadsCount = GetThreadsCount();
#if DEBUG
            if (_filter == null)
            {
                throw new Exception("GetFilter() returned null");
            }
            if (_minJobSize < 1)
            {
                throw new Exception("GetMinJobSize() returned invalid value");
            }
            if (_threadsCount < 1)
            {
                throw new Exception("GetThreadsCount() returned invalid value");
            }
#endif
            _localDesc = new EcsMultiThreadWorkerDesc(_filter);
            _descs     = new EcsMultiThreadWorkerDesc[_threadsCount];
            _syncs     = new ManualResetEvent[_threadsCount];
            for (var i = 0; i < _descs.Length; i++)
            {
                var desc = new EcsMultiThreadWorkerDesc(_filter);
                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);
            }
        }