Explorar o código

Queue的Enqueue复杂度有可能为O(n),封装了个EQueue使用,添加删除都是O(1)

tanghai %!s(int64=8) %!d(string=hai) anos
pai
achega
b4847d0d8e

+ 3 - 0
Server/Base/Server.Base.csproj

@@ -50,6 +50,9 @@
     <Compile Include="..\..\Unity\Assets\Scripts\Base\DoubleMap.cs">
       <Link>DoubleMap.cs</Link>
     </Compile>
+    <Compile Include="..\..\Unity\Assets\Scripts\Base\EQueue.cs">
+      <Link>EQueue.cs</Link>
+    </Compile>
     <Compile Include="..\..\Unity\Assets\Scripts\Base\Helper\ArrayHelper.cs">
       <Link>Helper\ArrayHelper.cs</Link>
     </Compile>

+ 5 - 5
Server/Model/Base/Object/ObjectEvents.cs

@@ -47,13 +47,13 @@ namespace Model
 
 		private Dictionary<Type, IObjectEvent> disposerEvents;
 
-		private Queue<Disposer> updates = new Queue<Disposer>();
-		private Queue<Disposer> updates2 = new Queue<Disposer>();
+		private EQueue<Disposer> updates = new EQueue<Disposer>();
+		private EQueue<Disposer> updates2 = new EQueue<Disposer>();
 
-		private Queue<Disposer> starts = new Queue<Disposer>();
+		private EQueue<Disposer> starts = new EQueue<Disposer>();
 
-		private Queue<Disposer> loaders = new Queue<Disposer>();
-		private Queue<Disposer> loaders2 = new Queue<Disposer>();
+		private EQueue<Disposer> loaders = new EQueue<Disposer>();
+		private EQueue<Disposer> loaders2 = new EQueue<Disposer>();
 		
 		public void Add(string name, Assembly assembly)
 		{

+ 1 - 1
Server/Model/Component/ActorComponent.cs

@@ -39,7 +39,7 @@ namespace Model
 		private long actorId;
 
 		// 队列处理消息
-		private readonly Queue<ActorMessageInfo> queue = new Queue<ActorMessageInfo>();
+		private readonly EQueue<ActorMessageInfo> queue = new EQueue<ActorMessageInfo>();
 
 		private TaskCompletionSource<ActorMessageInfo> tcs;
 

+ 4 - 4
Server/Model/Component/LocationComponent.cs

@@ -94,7 +94,7 @@ namespace Model
 
 		private readonly Dictionary<long, int> lockDict = new Dictionary<long, int>();
 
-		private readonly Dictionary<long, Queue<LocationTask>> taskQueues = new Dictionary<long, Queue<LocationTask>>();
+		private readonly Dictionary<long, EQueue<LocationTask>> taskQueues = new Dictionary<long, EQueue<LocationTask>>();
 
 		public void Add(long key, int appId)
 		{
@@ -159,7 +159,7 @@ namespace Model
 		{
 			this.lockDict.Remove(key);
 
-			if (!this.taskQueues.TryGetValue(key, out Queue<LocationTask> tasks))
+			if (!this.taskQueues.TryGetValue(key, out EQueue<LocationTask> tasks))
 			{
 				return;
 			}
@@ -210,9 +210,9 @@ namespace Model
 
 		public void AddTask(long key, LocationTask task)
 		{
-			if (!this.taskQueues.TryGetValue(key, out Queue<LocationTask> tasks))
+			if (!this.taskQueues.TryGetValue(key, out EQueue<LocationTask> tasks))
 			{
-				tasks = new Queue<LocationTask>();
+				tasks = new EQueue<LocationTask>();
 				this.taskQueues[key] = tasks;
 			}
 			task.Scene = this.GetEntity<Scene>();

+ 1 - 1
Server/Model/Component/Unit/LockComponent.cs

@@ -28,7 +28,7 @@ namespace Model
 		private LockStatus status = LockStatus.LockedNot;
 		private string address;
 		private int lockCount;
-		private readonly Queue<TaskCompletionSource<bool>> queue = new Queue<TaskCompletionSource<bool>>();
+		private readonly EQueue<TaskCompletionSource<bool>> queue = new EQueue<TaskCompletionSource<bool>>();
 
 		public void Awake(string addr)	
 		{

+ 1 - 1
Server/Model/Component/Unit/MasterComponent.cs

@@ -24,7 +24,7 @@ namespace Model
 		private string lockedAddress = "";
 
 		/// 请求锁的队列
-		private readonly Queue<LockInfo> queue = new Queue<LockInfo>();
+		private readonly EQueue<LockInfo> queue = new EQueue<LockInfo>();
 
 		public void AddGhost(string address)
 		{

+ 5 - 5
Server/Model/Entity/ActorProxy.cs

@@ -95,10 +95,10 @@ namespace Model
 		public string Address;
 
 		// 已发送等待回应的消息
-		public Queue<ActorTask> RunningTasks;
+		public EQueue<ActorTask> RunningTasks;
 
 		// 还没发送的消息
-		public Queue<ActorTask> WaitingTasks;
+		public EQueue<ActorTask> WaitingTasks;
 
 		// 发送窗口大小
 		public int WindowSize = 1;
@@ -114,8 +114,8 @@ namespace Model
 		
 		public void Awake()
 		{
-			this.RunningTasks = new Queue<ActorTask>();
-			this.WaitingTasks = new Queue<ActorTask>();
+			this.RunningTasks = new EQueue<ActorTask>();
+			this.WaitingTasks = new EQueue<ActorTask>();
 			this.WindowSize = 1;
 			this.CancellationTokenSource = new CancellationTokenSource();
 		}
@@ -264,7 +264,7 @@ namespace Model
 			}
 		}
 
-		public string DebugQueue(Queue<ActorTask> tasks)
+		public string DebugQueue(EQueue<ActorTask> tasks)
 		{
 			string s = "";
 			foreach (ActorTask task in tasks)

+ 1 - 2
Server/Model/Entity/DBTaskQueue.cs

@@ -1,12 +1,11 @@
 using System;
-using System.Collections.Generic;
 using System.Threading.Tasks;
 
 namespace Model
 {
 	public sealed class DBTaskQueue : Entity
 	{
-		public Queue<DBTask> queue = new Queue<DBTask>();
+		public EQueue<DBTask> queue = new EQueue<DBTask>();
 
 		private TaskCompletionSource<DBTask> tcs;
 

+ 3 - 3
Server/Model/Other/OneThreadSynchronizationContext.cs

@@ -7,9 +7,9 @@ namespace Model
 	public class OneThreadSynchronizationContext : SynchronizationContext
 	{
 		// 线程同步队列,发送接收socket回调都放到该队列,由poll线程统一执行
-		private Queue<Action> queue = new Queue<Action>();
+		private EQueue<Action> queue = new EQueue<Action>();
 
-		private Queue<Action> localQueue = new Queue<Action>();
+		private EQueue<Action> localQueue = new EQueue<Action>();
 
 		private readonly object lockObject = new object();
 
@@ -26,7 +26,7 @@ namespace Model
 			lock (lockObject)
 			{
 				localQueue = queue;
-				queue = new Queue<Action>();
+				queue = new EQueue<Action>();
 			}
 
 			while (this.localQueue.Count > 0)

+ 8 - 8
Unity/Assets/Editor/BehaviorTreeEditor/NodeExtension.cs

@@ -17,8 +17,8 @@ namespace Model
 			Type rootType = typeof(Game).Assembly.GetType($"Model.{config.RootNodeProto.Name}");
 			Node root = (Node) Activator.CreateInstance(rootType, config.RootNodeProto);
 			root.Id = BTEditor.NodeIdStartIndex;
-			Queue<NodeProto> protoStack = new Queue<NodeProto>();
-			Queue<Node> nodeStack = new Queue<Node>();
+			EQueue<NodeProto> protoStack = new EQueue<NodeProto>();
+			EQueue<Node> nodeStack = new EQueue<Node>();
 			protoStack.Enqueue(config.RootNodeProto);
 			nodeStack.Enqueue(root);
 			while (protoStack.Count > 0)
@@ -101,7 +101,7 @@ namespace Model
 
 		public T GetChildInType<T>() where T : Node
 		{
-			Queue<Node> nodeStack = new Queue<Node>();
+			EQueue<Node> nodeStack = new EQueue<Node>();
 			nodeStack.Enqueue(_root);
 			while (nodeStack.Count > 0)
 			{
@@ -126,7 +126,7 @@ namespace Model
 
 		public T[] GetChildrenInType<T>() where T : Node
 		{
-			Queue<Node> nodeStack = new Queue<Node>();
+			EQueue<Node> nodeStack = new EQueue<Node>();
 			List<T> list = new List<T>();
 			nodeStack.Enqueue(_root);
 			while (nodeStack.Count > 0)
@@ -189,7 +189,7 @@ namespace Model
 
 		public static T GetChildInType<T>(this Node root) where T : Node
 		{
-			Queue<Node> nodeStack = new Queue<Node>();
+			EQueue<Node> nodeStack = new EQueue<Node>();
 			nodeStack.Enqueue(root);
 			while (nodeStack.Count > 0)
 			{
@@ -208,7 +208,7 @@ namespace Model
 
 		public static T[] GetChildrenInType<T>(this Node root) where T : Node
 		{
-			Queue<Node> nodeStack = new Queue<Node>();
+			EQueue<Node> nodeStack = new EQueue<Node>();
 			List<T> list = new List<T>();
 			nodeStack.Enqueue(root);
 			while (nodeStack.Count > 0)
@@ -230,8 +230,8 @@ namespace Model
 		{
 			config.Clear();
 			BehaviorNodeConfig rootNp = config.AddRootNode(root.GetType().Name);
-			Queue<Node> queue = new Queue<Node>();
-			Queue<BehaviorNodeConfig> npQue = new Queue<BehaviorNodeConfig>();
+			EQueue<Node> queue = new EQueue<Node>();
+			EQueue<BehaviorNodeConfig> npQue = new EQueue<BehaviorNodeConfig>();
 			rootNp.describe = root.Description;
 			queue.Enqueue(root);
 			npQue.Enqueue(rootNp);

+ 40 - 0
Unity/Assets/Scripts/Base/EQueue.cs

@@ -0,0 +1,40 @@
+using System.Collections;
+using System.Collections.Generic;
+
+namespace Model
+{
+	public class EQueue<T>: IEnumerable
+	{
+		private readonly LinkedList<T> list = new LinkedList<T>();
+
+		public void Enqueue(T t)
+		{
+			this.list.AddLast(t);
+		}
+
+		public T Dequeue()
+		{
+			T t = this.list.First.Value;
+			this.list.RemoveFirst();
+			return t;
+		}
+		
+		public int Count
+		{
+			get
+			{
+				return this.list.Count;
+			}
+		}
+
+		public IEnumerator GetEnumerator()
+		{
+			return this.list.GetEnumerator();
+		}
+
+		public void Clear()
+		{
+			this.list.Clear();
+		}
+	}
+}

+ 12 - 0
Unity/Assets/Scripts/Base/EQueue.cs.meta

@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: dab3474e94a21ed4a87252287c00c567
+timeCreated: 1505386149
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 4 - 4
Unity/Assets/Scripts/Base/Network/UNet/UPoller.cs

@@ -12,13 +12,13 @@ namespace Model
 		}
 
 		public USocketManager USocketManager { get; }
-		private readonly Queue<IntPtr> connQueue = new Queue<IntPtr>();
+		private readonly EQueue<IntPtr> connQueue = new EQueue<IntPtr>();
 
 		private IntPtr host;
 
 		// 线程同步队列,发送接收socket回调都放到该队列,由poll线程统一执行
-		private Queue<Action> concurrentQueue = new Queue<Action>();
-		private Queue<Action> localQueue;
+		private EQueue<Action> concurrentQueue = new EQueue<Action>();
+		private EQueue<Action> localQueue;
 		private readonly object lockObject = new object();
 
 		private ENetEvent eNetEventCache;
@@ -138,7 +138,7 @@ namespace Model
 			lock (lockObject)
 			{
 				localQueue = concurrentQueue;
-				concurrentQueue = new Queue<Action>();
+				concurrentQueue = new EQueue<Action>();
 			}
 
 			while (this.localQueue.Count > 0)

+ 3 - 3
Unity/Assets/Scripts/Base/Network/UNet/USocket.cs

@@ -16,8 +16,8 @@ namespace Model
 	{
 		private readonly UPoller poller;
 		public IntPtr PeerPtr { get; set; }
-		private readonly Queue<byte[]> recvQueue = new Queue<byte[]>();
-		private readonly Queue<BufferInfo> sendQueue = new Queue<BufferInfo>();
+		private readonly EQueue<byte[]> recvQueue = new EQueue<byte[]>();
+		private readonly EQueue<BufferInfo> sendQueue = new EQueue<BufferInfo>();
 		private bool isConnected;
 		private Action disconnect;
 		private Action received;
@@ -96,7 +96,7 @@ namespace Model
 			}
 		}
 		
-		public Queue<byte[]> RecvQueue
+		public EQueue<byte[]> RecvQueue
 		{
 			get
 			{

+ 7 - 7
Unity/Assets/Scripts/Base/Object/ObjectEvents.cs

@@ -49,16 +49,16 @@ namespace Model
 
 		private readonly Dictionary<Type, IObjectEvent> disposerEvents = new Dictionary<Type, IObjectEvent>();
 
-		private Queue<Disposer> updates = new Queue<Disposer>();
-		private Queue<Disposer> updates2 = new Queue<Disposer>();
+		private EQueue<Disposer> updates = new EQueue<Disposer>();
+		private EQueue<Disposer> updates2 = new EQueue<Disposer>();
 
-		private readonly Queue<Disposer> starts = new Queue<Disposer>();
+		private readonly EQueue<Disposer> starts = new EQueue<Disposer>();
 
-		private Queue<Disposer> loaders = new Queue<Disposer>();
-		private Queue<Disposer> loaders2 = new Queue<Disposer>();
+		private EQueue<Disposer> loaders = new EQueue<Disposer>();
+		private EQueue<Disposer> loaders2 = new EQueue<Disposer>();
 
-		private Queue<Disposer> lateUpdates = new Queue<Disposer>();
-		private Queue<Disposer> lateUpdates2 = new Queue<Disposer>();
+		private EQueue<Disposer> lateUpdates = new EQueue<Disposer>();
+		private EQueue<Disposer> lateUpdates2 = new EQueue<Disposer>();
 
 		public static void Close()
 		{

+ 1 - 1
Unity/Assets/Scripts/Component/TimerComponent.cs

@@ -30,7 +30,7 @@ namespace Model
 		/// </summary>
 		private readonly MultiMap<long, long> timeId = new MultiMap<long, long>();
 
-		private readonly Queue<long> timeoutTimer = new Queue<long>();
+		private readonly EQueue<long> timeoutTimer = new EQueue<long>();
 
 		public void Update()
 		{

+ 7 - 7
Unity/Hotfix/Base/Object/ObjectEvents.cs

@@ -46,16 +46,16 @@ namespace Hotfix
 		
 		private readonly Dictionary<Type, IObjectEvent> disposerEvents = new Dictionary<Type, IObjectEvent>();
 
-		private Queue<Disposer> updates = new Queue<Disposer>();
-		private Queue<Disposer> updates2 = new Queue<Disposer>();
+		private EQueue<Disposer> updates = new EQueue<Disposer>();
+		private EQueue<Disposer> updates2 = new EQueue<Disposer>();
 
-		private readonly Queue<Disposer> starts = new Queue<Disposer>();
+		private readonly EQueue<Disposer> starts = new EQueue<Disposer>();
 
-		private Queue<Disposer> loaders = new Queue<Disposer>();
-		private Queue<Disposer> loaders2 = new Queue<Disposer>();
+		private EQueue<Disposer> loaders = new EQueue<Disposer>();
+		private EQueue<Disposer> loaders2 = new EQueue<Disposer>();
 
-		private Queue<Disposer> lateUpdates = new Queue<Disposer>();
-		private Queue<Disposer> lateUpdates2 = new Queue<Disposer>();
+		private EQueue<Disposer> lateUpdates = new EQueue<Disposer>();
+		private EQueue<Disposer> lateUpdates2 = new EQueue<Disposer>();
 
 		public static void Close()
 		{

+ 1 - 1
Unity/Hotfix/Component/TimerComponent.cs

@@ -30,7 +30,7 @@ namespace Hotfix
 		/// </summary>
 		private readonly MultiMap<long, long> timeId = new MultiMap<long, long>();
 
-		private readonly Queue<long> timeoutTimer = new Queue<long>();
+		private readonly EQueue<long> timeoutTimer = new EQueue<long>();
 
 		public void Update()
 		{

+ 8 - 4
Unity/Unity.csproj

@@ -12,12 +12,15 @@
     <ProjectTypeGuids>{E097FAD1-6243-4DAD-9C02-E9B9EFC3FFC1};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
     <TargetFrameworkIdentifier>.NETFramework</TargetFrameworkIdentifier>
     <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>
-    <TargetFrameworkProfile></TargetFrameworkProfile>
-    <CompilerResponseFile></CompilerResponseFile>
+    <TargetFrameworkProfile>
+    </TargetFrameworkProfile>
+    <CompilerResponseFile>
+    </CompilerResponseFile>
     <UnityProjectType>Game:1</UnityProjectType>
     <UnityBuildTarget>StandaloneWindows:5</UnityBuildTarget>
     <UnityVersion>2017.1.0p5</UnityVersion>
-    <RootNamespace></RootNamespace>
+    <RootNamespace>
+    </RootNamespace>
     <LangVersion>6</LangVersion>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
@@ -474,6 +477,7 @@
     <Compile Include="Assets\Scripts\Base\Object\Object.cs" />
     <Compile Include="Assets\Scripts\Base\Object\ObjectEventAttribute.cs" />
     <Compile Include="Assets\Scripts\Base\Object\ObjectEvents.cs" />
+    <Compile Include="Assets\Scripts\Base\EQueue.cs" />
     <Compile Include="Assets\Scripts\Base\QueueDictionary.cs" />
     <Compile Include="Assets\Scripts\Base\TryLocker.cs" />
     <Compile Include="Assets\Scripts\Base\UI\LayerNames.cs" />
@@ -538,4 +542,4 @@
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <Target Name="GenerateTargetFrameworkMonikerAttribute" />
-</Project>
+</Project>