diff --git a/Client/Assets/Scripts/Managers/Buffer.cs b/Client/Assets/Scripts/Managers/Buffer.cs new file mode 100644 index 0000000..e6613e9 --- /dev/null +++ b/Client/Assets/Scripts/Managers/Buffer.cs @@ -0,0 +1,163 @@ +using System; +using System.Collections.Concurrent; +using System.Threading; + +namespace Managers +{ + + /// + /// 双缓冲静态类,用于逻辑计算线程与主线程之间的数据同步。 + /// + /// 要同步的数据类型。 + public static class DoubleBuffer + { + /// + /// 当前用于写入的缓冲区。 + /// + private static T _writeBuffer; + + /// + /// 当前用于读取的缓冲区。 + /// + private static T _readBuffer; + + /// + /// 用于同步缓冲区交换的锁对象。 + /// + private static readonly object _lock = new object(); + + /// + /// 初始化双缓冲类。 + /// + /// 初始值,用于初始化两个缓冲区。 + public static void Initialize(T initialValue) + { + _writeBuffer = initialValue; + _readBuffer = initialValue; + } + + /// + /// 写入数据到当前写缓冲区。 + /// + /// 要写入的数据。 + public static void Write(T data) + { + lock (_lock) + { + _writeBuffer = data; // 将数据写入写缓冲区 + } + } + + /// + /// 交换读写缓冲区,使主线程可以读取最新的数据。 + /// + public static void SwapBuffers() + { + lock (_lock) + { + // 交换读写缓冲区 + T temp = _readBuffer; + _readBuffer = _writeBuffer; + _writeBuffer = temp; + } + } + + /// + /// 从当前读缓冲区读取数据。 + /// + /// 当前读缓冲区中的数据。 + public static T Read() + { + lock (_lock) + { + return _readBuffer; // 返回读缓冲区中的数据 + } + } + } + + /// + /// 网络消息缓冲区类,用于在网络线程和主线程之间进行线程安全的消息传递。 + /// + public static class NetworkMessageBuffer + { + /// + /// 缓冲区的最大消息数量。 + /// + private static readonly int MaxMessageCount; + + /// + /// 存储消息的线程安全队列。 + /// + private static readonly ConcurrentQueue MessageQueue; + + /// + /// 用于控制缓冲区是否已满的信号量。 + /// + private static readonly SemaphoreSlim BufferSemaphore; + + /// + /// 初始化网络消息缓冲区类。 + /// + static NetworkMessageBuffer() + { + MaxMessageCount = 100; + MessageQueue = new ConcurrentQueue(); + BufferSemaphore = new SemaphoreSlim(MaxMessageCount, MaxMessageCount); + } + + /// + /// 向缓冲区添加一条消息。 + /// 如果缓冲区已满,则等待直到有空间可用。 + /// + /// 要添加的消息内容。 + public static async void AddMessageAsync(string message) + { + // 等待缓冲区有可用空间 + await BufferSemaphore.WaitAsync(); + + try + { + // 将消息添加到队列中 + MessageQueue.Enqueue(message); + } + catch (Exception ex) + { + Console.WriteLine($"AddMessageAsync Error: {ex.Message}"); + } + } + + /// + /// 从缓冲区中读取一条消息。 + /// 如果缓冲区为空,则返回 null。 + /// + /// 缓冲区中的第一条消息,如果缓冲区为空则返回 null。 + public static string ReadMessage() + { + if (MessageQueue.TryDequeue(out string message)) + { + // 释放一个缓冲区空间 + BufferSemaphore.Release(); + return message; + } + + return null; + } + + /// + /// 获取当前缓冲区中的消息数量。 + /// + /// 当前缓冲区中的消息数量。 + public static int GetMessageCount() + { + return MessageQueue.Count; + } + + /// + /// 清空缓冲区中的所有消息。 + /// + public static void ClearBuffer() + { + while (MessageQueue.TryDequeue(out _)) { } + } + } +} \ No newline at end of file diff --git a/Client/Assets/Scripts/Managers/Buffer.cs.meta b/Client/Assets/Scripts/Managers/Buffer.cs.meta new file mode 100644 index 0000000..8852415 --- /dev/null +++ b/Client/Assets/Scripts/Managers/Buffer.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 44d2ac59153c45a4bdab4c6eef6ddcec +timeCreated: 1752585193 \ No newline at end of file