提交 b4847d0d 编写于 作者: T tanghai

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

上级 8bff1303
......@@ -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>
......
......@@ -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)
{
......
......@@ -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;
......
......@@ -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>();
......
......@@ -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)
{
......
......@@ -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)
{
......
......@@ -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)
......
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;
......
......@@ -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)
......
......@@ -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);
......
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();
}
}
}
\ No newline at end of file
fileFormatVersion: 2
guid: dab3474e94a21ed4a87252287c00c567
timeCreated: 1505386149
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
......@@ -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)
......
......@@ -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
{
......
......@@ -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()
{
......
......@@ -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()
{
......
......@@ -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()
{
......
......@@ -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()
{
......
......@@ -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>
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册