OneBigLoser
OneBigLoser
发布于 2024-07-15 / 21 阅读
0
0

Queue的基本概念

想象你和朋友们在食堂排队买午餐。你们按照先来后到的顺序排队,先来的人先买,后来的人后买。这就是队列的基本概念:"先进先出"(First In, First Out,简称FIFO)。

在编程中,队列是一种常用的数据结构。它就像食堂的排队一样,先添加到队列中的元素,会先被取出。

Queue的用途和在游戏开发中的应用

队列在很多场景下都很有用,特别是需要按照顺序处理事情的时候。在游戏开发中,队列经常被用于以下场景:

  1. 事件处理: 游戏中的事件(如玩家输入、游戏对象碰撞等)可以放入队列,然后按顺序处理。

  2. 资源加载: 将需要加载的资源(如纹理、模型等)放入队列,然后逐个加载,避免一次性加载太多资源导致卡顿。

  3. 任务队列: 有些任务需要按照一定的顺序执行,可以使用队列来管理。

  4. 消息传递: 在某些游戏架构中,不同的游戏模块之间通过消息进行通信,这些消息可以放入队列,然后依次处理。

Queue的语法规则和如何声明

在C#中,队列由Queue<T>类表示,其中T表示队列中元素的类型。你可以这样声明一个队列:

Queue<int> numberQueue = new Queue<int>();

这行代码声明了一个存储整数的队列numberQueue。

Queue<T>类提供了一些方法来操作队列:

  • Enqueue(T item): 将元素添加到队列的末尾。

  • Dequeue(): 移除并返回队列开头的元素。如果队列为空,则抛出异常。

  • Peek(): 返回队列开头的元素,但不移除它。如果队列为空,则抛出异常。

  • Count: 获取队列中元素的数量。

  • Clear(): 移除队列中的所有元素。

示例代码

下面是一些简单的队列操作的示例代码:

Queue<string> messageQueue = new Queue<string>();

// 添加元素到队列
messageQueue.Enqueue("Hello");
messageQueue.Enqueue("World");
messageQueue.Enqueue("!");

// 输出队列中元素的数量
Console.WriteLine($"队列中有 {messageQueue.Count} 个元素");

// 访问队列开头的元素,但不移除它
string firstMessage = messageQueue.Peek();
Console.WriteLine($"队列开头的元素是: {firstMessage}");

// 移除并输出队列开头的元素
string message = messageQueue.Dequeue();
Console.WriteLine($"移除的元素是: {message}");

// 再次输出队列中元素的数量
Console.WriteLine($"现在队列中有 {messageQueue.Count} 个元素");

输出结果:

队列中有 3 个元素
队列开头的元素是: Hello
移除的元素是: Hello
现在队列中有 2 个元素

示例2:在游戏开发中的应用(任务队列)

using System;
using System.Collections.Generic;

class GameAction
{
    public string Description { get; set; }

    public GameAction(string description)
    {
        Description = description;
    }

    public void Execute()
    {
        Console.WriteLine($"Executing action: {Description}");
    }
}

class Program
{
    static void Main()
    {
        Queue<GameAction> actionQueue = new Queue<GameAction>();

        // 添加游戏动作
        actionQueue.Enqueue(new GameAction("Move forward"));
        actionQueue.Enqueue(new GameAction("Attack"));
        actionQueue.Enqueue(new GameAction("Defend"));

        // 处理游戏动作
        while (actionQueue.Count > 0)
        {
            GameAction action = actionQueue.Dequeue();
            action.Execute();
        }
    }
}

Queue的优缺点

使用队列的优点是:

  • 可以确保元素按照加入的顺序被处理。

  • 使用简单,概念清晰。

  • 在某些场景下(如事件处理、资源加载等),使用队列可以使代码更加清晰和易于管理。

缺点是:

  • 如果需要随机访问元素,队列的效率较低。

  • 如果需要在队列中间插入或删除元素,队列也不太适合(可以考虑使用链表)。

练习题

为了帮助你练习,我准备了几道题:

基础题目:

  1. 实现一个简单的打印任务队列。模拟多个文档被发送到打印机,然后按照发送的顺序打印。

  2. 实现一个简单的任务调度器。有多个任务需要执行,每个任务有一个优先级。任务按照优先级的顺序执行,优先级相同的任务按照加入队列的顺序执行。

进阶题目:

  1. 用队列实现一个简单的消息总线系统。不同的游戏模块可以向总线发送消息,然后总线按照接收到消息的顺序分发给各个模块。

  2. 实现一个资源加载器。有多个资源需要加载,每个资源有一个加载优先级。资源按照优先级的顺序加载,优先级相同的资源按照加入队列的顺序加载。要求资源加载过程可以随时暂停和恢复。


评论