public CoroutineLock(CoroutineLockComponent coroutineLockComponent, CoroutineLockType type, long k, short index) { this.coroutineLockComponent = coroutineLockComponent; this.coroutineLockType = type; this.key = k; this.index = index; }
public static void Notify(this CoroutineLockComponent self, CoroutineLockType coroutineLockType, long key, int count) { CoroutineLockQueueType coroutineLockQueueType = self.list[(int)coroutineLockType]; if (!coroutineLockQueueType.TryGetValue(key, out CoroutineLockQueue queue)) { return; } if (queue.Count == 0) { coroutineLockQueueType.Remove(key); return; } #if NOT_UNITY const int frameCoroutineCount = 5; #else const int frameCoroutineCount = 10; #endif if (count > frameCoroutineCount) { self.NextFrameRun(coroutineLockType, key); return; } CoroutineLockInfo coroutineLockInfo = queue.Dequeue(); coroutineLockInfo.Tcs.SetResult(self.CreateCoroutineLock(coroutineLockType, key, coroutineLockInfo.Time, count)); }
private static void AddTimer(this CoroutineLockComponent self, long tillTime, CoroutineLock coroutineLock) { self.timers.Add(tillTime, new CoroutineLockTimer(coroutineLock)); if (tillTime < self.minTime) { self.minTime = tillTime; } }
public static void RunNextCoroutine(this CoroutineLockComponent self, int coroutineLockType, long key, int level) { // 一个协程队列一帧处理超过100个,说明比较多了,打个warning,检查一下是否够正常 if (level == 100) { Log.Warning($"too much coroutine level: {coroutineLockType} {key}"); } self.nextFrameRun.Enqueue((coroutineLockType, key, level)); }
private static CoroutineLock CreateCoroutineLock(this CoroutineLockComponent self, int coroutineLockType, long key, int time, int level) { CoroutineLock coroutineLock = self.AddChildWithId <CoroutineLock, int, long, int>(++self.idGenerator, coroutineLockType, key, level, true); if (time > 0) { self.AddTimer(TimeHelper.ClientFrameTime() + time, coroutineLock); } return(coroutineLock); }
public static CoroutineLock CreateCoroutineLock(this CoroutineLockComponent self, CoroutineLockType coroutineLockType, long key, int time, int count) { CoroutineLock coroutineLock = EntityFactory.CreateWithId <CoroutineLock, CoroutineLockType, long, int>(self.Domain, ++self.idGenerator, coroutineLockType, key, count, true); if (time > 0) { self.AddTimer(TimeHelper.ClientFrameTime() + time, coroutineLock); } return(coroutineLock); }
public void Awake() { Instance = this; for (int i = 0; i < this.list.Capacity; ++i) { CoroutineLockQueueType coroutineLockQueueType = EntityFactory.Create <CoroutineLockQueueType>(this.Domain); this.list.Add(coroutineLockQueueType); coroutineLockQueueType.Parent = this; } }
public static async ETTask <CoroutineLock> Wait(this CoroutineLockComponent self, int coroutineLockType, long key, int time = 60000) { CoroutineLockQueueType coroutineLockQueueType = self.list[coroutineLockType]; if (!coroutineLockQueueType.TryGetValue(key, out CoroutineLockQueue queue)) { coroutineLockQueueType.Add(key, self.AddChildWithId <CoroutineLockQueue>(++self.idGenerator, true)); return(self.CreateCoroutineLock(coroutineLockType, key, time, 1)); } ETTask <CoroutineLock> tcs = ETTask <CoroutineLock> .Create(true); queue.Add(tcs, time); return(await tcs); }
public static async ETTask <CoroutineLock> Wait(this CoroutineLockComponent self, int coroutineLockType, long key, int time = 60000) { CoroutineLockQueueType coroutineLockQueueType = self.list[coroutineLockType]; CoroutineLockQueue queue = coroutineLockQueueType.GetChild <CoroutineLockQueue>(key); if (queue == null) { CoroutineLockQueue coroutineLockQueue = coroutineLockQueueType.AddChildWithId <CoroutineLockQueue>(key, true); return(self.CreateCoroutineLock(coroutineLockQueue, coroutineLockType, key, time, 1)); } ETTask <CoroutineLock> tcs = ETTask <CoroutineLock> .Create(true); queue.Add(tcs, time); return(await tcs); }
public static void Notify(this CoroutineLockComponent self, int coroutineLockType, long key, int level) { CoroutineLockQueueType coroutineLockQueueType = self.list[coroutineLockType]; if (!coroutineLockQueueType.TryGetValue(key, out CoroutineLockQueue queue)) { return; } if (queue.Count == 0) { coroutineLockQueueType.Remove(key); return; } CoroutineLockInfo coroutineLockInfo = queue.Dequeue(); coroutineLockInfo.Tcs.SetResult(self.CreateCoroutineLock(coroutineLockType, key, coroutineLockInfo.Time, level)); }
private static void Notify(this CoroutineLockComponent self, int coroutineLockType, long key, int level) { CoroutineLockQueueType coroutineLockQueueType = self.list[coroutineLockType]; CoroutineLockQueue queue = coroutineLockQueueType.GetChild <CoroutineLockQueue>(key); if (queue == null) { return; } if (queue.Count == 0) { coroutineLockQueueType.RemoveChild(key); return; } CoroutineLockInfo coroutineLockInfo = queue.Dequeue(); coroutineLockInfo.Tcs.SetResult(self.CreateCoroutineLock(queue, coroutineLockType, key, coroutineLockInfo.Time, level)); }
public static void NextFrameRun(this CoroutineLockComponent self, CoroutineLockType coroutineLockType, long key) { self.nextFrameRun.Enqueue((coroutineLockType, key)); }