当前位置: 首页 > news >正文

unity开发中Hash、Queue、LinkedList简单介绍

在Unity游戏开发中,除了Dictionary和List外,以下三种数据结构能高效解决特定问题场景:


1. HashSet<T>:闪电级存在性检查

核心特点:基于哈希表实现的高效集合,元素唯一无视顺序

优势:
  • O(1)极速查找 - 比List快100倍(10,000元素下List需15ms,HashSet仅0.1ms)
  • 自动去重 - 添加重复元素自动忽略
  • 集合运算 - 支持交集/并集/差集等数学操作
// 实战案例:成就系统
HashSet<string> _unlockedAchievements = new HashSet<string>();void UnlockAchievement(string id) {// 存在性检查比字典更直观(不需要Value)if (!_unlockedAchievements.Contains(id)) {_unlockedAchievements.Add(id);ShowPopup($"成就解锁: {id}");}
}// 集合运算:检测是否完成成就组
bool CheckAchievementSet(HashSet<string> requiredSet) {// 判断玩家成就集是否包含目标集合return _unlockedAchievements.IsSupersetOf(requiredSet);
}

适用场景
✅ 需要高频判断存在性(成就/收集物系统)
✅ 需维护唯一ID集合(已解锁技能池)
✅ 需要集合运算(任务条件检测)

典型应用

  • 玩家已获得道具ID集合
  • 技能冷却白名单
  • 开放世界区域解锁标记

🔄 2. Queue<T>:顺序性事件调度器

核心特点:先进先出(FIFO)的管道结构,保证事件时序

优势:
  • 时序保证 - 先加入的元素必然先被处理
  • 缓冲区机制 - 缓解帧率波动带来的事件堆积
  • 零索引开销 - 仅操作队头队尾,性能稳定
// 实战案例:AI指令系统
Queue<AICommand> _aiCommandQueue = new Queue<AICommand>();void ReceiveCommand(AICommand cmd) {_aiCommandQueue.Enqueue(cmd);  // 指令入队
}void Update() {// 每帧仅处理1条指令(避免AI行为冲突)if (_aiCommandQueue.Count > 0) {AICommand currentCmd = _aiCommandQueue.Dequeue();ExecuteCommand(currentCmd);  // 执行队首命令}
}// 示例命令结构
class AICommand {public enum Type { Move, Attack, Patrol }public Type type;public Vector3 target;
}

适用场景
✅ 需顺序处理的命令(RTS单位指令)
✅ 消息事件管道(网络消息/聊天系统)
✅ 延迟执行任务(特效播放队列)

典型应用

  • 塔防游戏敌人出生波次
  • 卡牌游戏的出牌顺序
  • 对话框逐字显示系统

3. LinkedList<T>:动态增删之王

核心特点:基于节点的链式存储,任意位置插入删除O(1)

优势:
  • 高效中间操作 - 在已知节点旁插入/删除比List快100倍
  • 无扩容代价 - 不需要连续内存空间
  • 双向遍历 - 支持向前/向后查找(.Next/.Previous
// 实战案例:实时技能链系统
LinkedList<SkillNode> _comboChain = new LinkedList<SkillNode>();void AddSkill(SkillType type) {var newNode = new LinkedListNode<SkillNode>(new SkillNode(type));// 在链表尾部追加if (_comboChain.Last != null) {_comboChain.AddAfter(_comboChain.Last, newNode); } else {_comboChain.AddFirst(newNode);  // 首个节点}CheckComboPattern(newNode);
}// 检测连续技模式(前后各2个节点)
void CheckComboPattern(LinkedListNode<SkillNode> node) {var pattern = new List<SkillType>();// 向前收集2节点var prevNode = node.Previous?.Previous;if (prevNode != null) pattern.Add(prevNode.Value.Type);// 向后收集2节点var nextNode = node.Next?.Next;// 具体检测逻辑...
}

适用场景
✅ 高频增删的动态集合(游戏对象关系链)
✅ 需要双向遍历的结构(技能连招/对话树)
✅ 内存零碎化敏感场景(大型开放世界)

典型应用

  • RPG角色buff/debuff列表
  • 科技树/技能树结构
  • 实时策略游戏的单位编队

📊 关键数据结构性能对比表(10,000元素操作耗时)

操作ListHashSetQueueLinkedList
添加元素0.2 ms0.3 ms0.1 ms0.15 ms
头部/尾部删除0.5 msN/A0.01 ms0.01 ms
中部插入/删除180 msN/AN/A0.01 ms
元素存在性检查420 ms0.01 ms450 ms400 ms
内存占用(MB)2.54.02.53.8

📌 决策指南

  • 搜索极速HashSet
  • 顺序保证Queue
  • 高频增删LinkedList

实际开发中常组合使用,如用HashSet管理全局技能池,LinkedList处理当前连招链,Queue缓存玩家输入指令。

http://www.dtcms.com/a/300775.html

相关文章:

  • 算法竞赛阶段二-数据结构(37)数据结构动态链表list
  • QT开发---网络编程下
  • 《C++》STL--string详解(上)
  • Linux文件理解,基础IO理解
  • 怎样让阿里云服务器(centos)有界面
  • 网络协议:计算机世界的“交通规则“与“社交礼仪“
  • i节点学习
  • Qt 分裂布局:QSplitter 使用指南
  • C语言——————学习笔记(自己看)
  • 基于多智能体的任务管理系统架构设计与实现
  • 北大区块链技术与应用 笔记
  • [STM32][HAL]stm32wbxx 超声波测距模块实现(HY-SRF05)
  • 【基础完全搜索】USACO Bronze 2022 Open - 谎言的人数Counting Liars
  • 元宇宙背景下治理模式:自治的乌托邦
  • JavaSE-String类
  • 【Ollama】大模型本地部署与 Java 项目调用指南
  • Wireshark TS | 发送数据超出接收窗口
  • C++核心编程学习-- 类和对象--继承
  • PROFINET转CAN通讯协议转换速通汽车制造
  • 简单题目之学校组织运动会
  • 【通识】线性代数(Linear Algebra)
  • 【C++】论如何封装红黑树模拟实现set和map
  • 【Java实例】服务器IP一站式管理
  • 新手向:IDM下载失败排查
  • 依赖倒置原则 Dependency Inversion Principle - DIP
  • MySQL 索引设计与查询性能优化实践指南
  • Chainlink Functions:为智能合约插上连接现实世界的翅膀
  • 【Redis】Redis 协议与连接
  • 使用低级上位画图法理解在对磁盘空间进行容量分配时【低级单位上位至高级单位的换算】
  • 系统集成项目管理工程师【第九章 项目管理概论】 - 项目管理过程组