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; } }
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; } }
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; }
/// <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); } }
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); } }