示例#1
0
 public CoroutineLock(CoroutineLockComponent coroutineLockComponent, CoroutineLockType type, long k, short index)
 {
     this.coroutineLockComponent = coroutineLockComponent;
     this.coroutineLockType      = type;
     this.key   = k;
     this.index = index;
 }
示例#2
0
        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));
        }
示例#3
0
 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;
     }
 }
示例#4
0
 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));
 }
示例#5
0
        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);
        }
示例#6
0
        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);
        }
示例#7
0
 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;
     }
 }
示例#8
0
        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);
        }
示例#9
0
        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);
        }
示例#10
0
        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));
        }
示例#11
0
        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));
        }
示例#12
0
 public static void NextFrameRun(this CoroutineLockComponent self, CoroutineLockType coroutineLockType, long key)
 {
     self.nextFrameRun.Enqueue((coroutineLockType, key));
 }