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