把知识变成
可探索的系统
算法、数据结构、游戏 AI 与工程设计。普通笔记用于系统阅读,重点主题配有可单步调试的交互实验。
你的学习进度
学习章节
6 CHAPTERS · UPDATED 2026-07-28基础结构与状态建模
集合、状态表达、C# 语义、二叉堆与优先队列。
算法、空间与碰撞
图搜索、算法工具箱、碰撞检测与 NavMesh。
游戏 AI、导航与群体行为
行为树、HTN、MCTS、局部避障与群体协同。
游戏运行时与战斗系统
生命周期、缓存、命令事件与完整战斗判定。
UI、配置与网络闭环
数据绑定、配置热更新、网络预测与可观测性。
工程架构与底层能力
Gameplay、ECS、C++、内存与并发。
交互专题
17 LABS · LEARN BY DOING一次技能从输入到结束
沿激活闸门、运行实例、编排、命中、结算与清理逐步调试完整链路。
Effect / Buff 生命周期
对比瞬时、持续、周期、叠层、刷新、到期和主动移除。
目标筛选与命中判定
拖动角色与目标,拆开圆形、扇形、盒形的粗筛和精确判断。
资源作用域与引用释放
观察请求合并、缓存命中、Owner 矩阵和最终底层释放。
网络预测与服务器校正
调整延迟与丢包,对齐输入 Tick、预测轨迹、权威状态和重放队列。
虚拟列表与节点复用
用固定槽位滚动大量数据,观察索引映射、复用和异步取消。
配置数据生成管线
从源数据到强类型快照,观察分层校验、错误袋、索引和发布闸门。
UI 页面栈与面板池
拆解打开、覆盖、返回、复用、绑定清理和旧回调冲突。
状态来源与技能仲裁
用来源账本和阶段矩阵拆解标签聚合、激活阻挡、预输入与打断清理。
命中后的运动与投射物
沿运动策略、扫掠命中、击退曲线、碰撞反馈和终态清理逐步调试。
属性脏标记与局部重算
观察实体粗筛、属性精筛、同帧合并、即时刷新和失效引用清理。
A* 寻路
逐步观察代价、Open / Closed 集合与 Parent 回溯。
怪物集群 AI
在手动与自动模式间切换,观察群体决策的最小闭环。
二叉堆优先队列
同步观察数组与树,逐步调试 BubbleUp 和 BubbleDown。
Flags / BitMask
覆盖组合、判断、移除、合法叠加与互斥结果建模。
随机系统
对比权重、保底、洗牌袋、Seed 与稳定随机。
空间划分
覆盖九宫格、空间 Hash、四叉树和两阶段范围查询。
专题地图
10 CATEGORIES全部笔记
61 ARTICLES · 按分类展开工程设计25 ARTICLES
动作游戏完整战斗判定
一次攻击不是“检测到重叠就扣血”,而是攻击实例、空间候选、合法性过滤、同次攻击去重、防御规则、伤害结算和反馈表现组成的流水线。每一层都应能解释目标为什么被命中或被拒绝。
未开始对话系统:节点、条件、效果与跳转
对话节点保存当前内容,选项表示可以走的边,Condition 只判断能否选择,Effect 在选择成立后修改状态,Jump 用稳定 ID 进入下一个节点。判断和修改必须分开,否则仅仅显示选项就可能消耗物品。
未开始对象池
对象池用“回收后再次使用”代替高频创建和销毁。它减少分配和实例化抖动,但不会自动重置旧状态;池中对象只是暂时空闲,不是全新对象。
未开始对象生命周期状态与异步竞态
异步结果回来时,“对象引用还不为空”不足以证明结果仍然属于当前对象。生命周期状态和 generation token 要共同回答:对象是否还活着、是否仍是发起请求时的那一代。
未开始缓存:建立、失效、版本与重建
缓存是可重建副本,权威来源才决定正确数据。失效表示“现有副本不能继续被信任”,版本号用来阻止旧的异步重建结果覆盖更新的数据。
未开始门面模式与泛型消重
门面把底层 ECS、存储或网络细节收在稳定 API 后面;泛型 helper 抽取多个入口中完全相同的流程,只把类型和少量差异作为参数。前者控制依赖方向,后者减少重复实现。
未开始命令模式:队列、撤销与事件边界
Command 表达“请执行一个动作”,可以排队、记录结果并按明确规则撤销;Event 表达“某件事已经发生”,监听者不应决定原动作是否成立。撤销依赖执行时保存的事实,不能靠重新猜一个反向操作。
未开始命中后的运动与投射物
投射物每帧应从旧位置扫掠到新位置,候选按命中时间排序后依次经过阵营、重复命中、穿透次数和目标间隔等规则。命中后的击退也要按时间曲线的增量推进,不能每帧重复叠加累计总量。
未开始配置热更新:版本一致性与失败可见性
热更新应先完整下载和验证一套不可变配置快照,再用一次原子切换让新请求看到新版本。不能逐张表边下载边替换,否则同一次业务可能混用两个版本。
未开始配置数据生成管线:让错误停在构建期
配置管线把策划源数据依次经过结构、引用和业务语义校验,只有全部通过才生成强类型快照和索引。目标不是“尽量把坏数据读进去”,而是让错误在构建期带着行号和字段名暴露。
未开始事件队列:延迟、监听、调试与事件风暴
事件队列把“事件发生”和“监听者何时处理”分开,能稳定顺序并避免深层同步重入;代价是结果不再立刻可见,还必须定义延迟、容量和事件风暴策略。
未开始事件系统与发布订阅
发布订阅让发送者只声明“发生了什么”,而不直接调用 UI、音效、成就等具体模块。它降低直接依赖,但也会让调用链变得隐形,所以事件载荷、订阅生命周期和调试记录必须明确。
未开始数据驱动 Timeline:从编辑器到实体消费
Timeline 源数据由编辑器修改,构建阶段把它验证并编译成运行时快照,播放实例按固定逻辑帧推进,Clip 只发语义命令,最终由实体系统仲裁和落地。编辑器预览、配置快照和运行实例是三个不同状态。
未开始网络抖动缓冲、快照插值与可观测性
抖动缓冲故意把显示时间放在最新服务器时间之后一小段距离,用已收到的两帧快照做插值。它用固定的额外延迟换取平滑,不能消除丢包,也不能替代本地预测。
未开始网络预测与服务器校正:先响应,再用权威结果收敛
客户端立即用本地输入预测,服务器按 Tick 生成权威状态;客户端收到确认后回到服务器状态,删除已确认输入,再重放尚未确认的输入追上当前时刻。校正不是简单把角色瞬移到旧快照。
未开始虚拟列表与节点复用:滚动一万条数据,只保留一小扇窗口
虚拟列表只创建“可见数量 + 缓冲数量”的节点,滚动时改变节点绑定的数据索引和位置,而不是为每条数据创建一个 UI 对象。节点数量与总数据量解耦。
未开始一次技能从输入到结束
技能流程应把输入意图、激活预检、资源提交、运行实例、时间线、目标查询、Effect 和结束清理分开。预检可以失败而不产生副作用,一旦提交资源就必须保证后续成功结束或明确回滚。
未开始状态来源与技能仲裁
状态标签不能只记录“有或没有”,还要记录由谁添加。多个技能都提供 Stunned 时,移除其中一个来源不应把另一个来源仍维持的状态一起清掉;技能仲裁则根据阶段和优先级决定新旧实例怎样共存。
未开始资源生命周期统一管理
资源管理的核心不是“在哪里调用 Load”,而是谁拥有引用、何时释放以及异步结果回来时作用域是否还有效。统一句柄和作用域能让加载与释放形成一一对应的责任链。
未开始资源作用域与引用释放:让“谁还需要它”成为可观察状态
资源系统至少要能观察资源记录、请求记录和作用域记录。相同资源的并发请求应合并底层加载,但每个调用者仍获得独立引用责任;Dispose 作用域只释放属于该作用域的引用。
未开始ECS:实体、组件、系统与数据布局
ECS 是一种组织大量游戏对象的方式。先记住一句话:
未开始Effect 与 Buff 生命周期:从一次申请到彻底清理
Definition 是静态配置,Spec 是本次申请参数,Runtime Effect 才是目标身上持续变化的实例。Apply Gate 先判断能否应用,之后才修改属性、建立周期任务和叠层状态;到期或移除时必须按相反责任顺序清理。
未开始UE Gameplay 框架:职责与状态流
UE Gameplay 框架把规则、全局可观察状态、玩家连接和可控制实体分给不同对象:GameMode 负责服务端规则,GameState 负责复制的全局状态,PlayerController 代表玩家连接,Pawn 是当前被控制…
未开始UI 数据绑定:依赖追踪与批量刷新
UI 数据绑定应记录“哪个显示结果依赖哪些源数据”,源数据变化时只标记相关绑定,再在统一刷新点合并更新。它不是每个字段一变就立即递归刷新整棵 UI。
未开始UI 页面栈与面板池:导航历史、活动实例与可复用对象不是一回事
页面栈记录返回顺序,活动实例表回答某页面现在是否打开,面板池保存已经关闭但可复用的对象。一个页面出现在导航历史中,不等于它当前仍有活动实例。
未开始计算机基础02 ARTICLES
算法11 ARTICLES
集群 AI 槽位分配与非攻击意图
槽位分配解决“多只怪物围住同一目标时各自站哪里”,稳定分配解决“不要每帧换座位”,非攻击意图解决“没拿到攻击权的怪物仍然做什么”。三者共同避免所有怪挤向同一点或原地发呆。
未开始空间划分:九宫格与四叉树
空间划分先按位置缩小候选范围,再做精确距离或碰撞判断。九宫格适合分布较均匀、查询半径接近格子大小的对象;四叉树会在局部密集处继续切分,适合密度变化较大的空间。
未开始目标筛选与命中判定:从世界坐标到入选原因
命中判定应逐层缩小集合:空间粗筛只负责找“可能靠近”的对象,阵营和状态过滤负责排除不合法目标,形状精判才回答是否真正位于圆、扇形或盒形内。不要让最昂贵的精判直接面对全世界对象。
未开始启发式决策模型:怪物集群候选打分
启发式打分把多个“不完全确定但有偏好”的条件变成同一尺度的分数,然后选择当前最高分候选。过滤负责排除绝对不能选的对象,打分只比较剩余对象,执行前还要再次验证世界状态。
未开始算法工具箱:二分、Top K、并查集与动态规划
这四种工具解决的不是同一类问题:二分缩小有序搜索区间,Top K 只保留最重要的 K 项,并查集维护不断合并的分组,动态规划复用重复子问题。先识别问题形状,再选择工具。
未开始图遍历与最短路:BFS、DFS、Dijkstra
BFS 按层扩展,适合无权图最少边数;DFS 沿一条分支深入,适合遍历、回溯和结构检查;Dijkstra 每次扩展当前累计成本最低的节点,适合边权非负的最短路。三者的差异主要在“下一步从哪里取节点”。
未开始物理碰撞检测基础:Broad Phase、AABB、OBB、BVH 与 SAT
碰撞检测分阶段,是因为“快速排除绝大多数不可能碰撞的对象”比“对所有对象都做精确几何计算”更划算。Broad Phase 产生候选对,Narrow Phase 再用 AABB、OBB、SAT 或其他形状算法确认。
未开始A 星寻路中的 G 值与 Parent 回溯
A 星中的 G 是从起点走到当前节点的真实累计成本,H 是到终点的估计成本,F = G + H 用来选择下一步扩展谁。Parent 不保存整条路径,只记录当前最优路线从哪里来。
未开始CCD:连续碰撞检测与高速穿透
离散碰撞只检查一帧开始和结束的位置,高速物体可能在两次采样之间跨过障碍。CCD 检查整段运动区间,并尝试求出首次接触时间 TOI。
未开始GJK:凸形状碰撞检测理解笔记
GJK 不直接枚举两个凸形状的所有边是否相交,而是在 Minkowski Difference 的支持点上构造 Simplex,并不断判断这个 Simplex 能否包围原点。原点在其中意味着两个原形状重叠。
未开始NavMesh:多边形寻路与动态障碍
NavMesh 寻路先在“可行走多边形图”上找到一条走廊,再通过门户和漏斗算法把多边形序列收紧成实际拐点。搜索得到的多边形列表不是角色最终要逐点行走的折线。
未开始游戏逻辑常用模式05 ARTICLES
时间控制小模式:冷却、计时器、延迟与 Tick
冷却回答“现在能不能再次使用”,计时器回答“还剩多久”,延迟触发回答“到点执行一次什么”,Tick 回答“按什么频率重复更新”。它们都使用时间,但保存的状态和到点后的行为不同。
未开始属性脏标记与局部重算
属性脏标记是在普通 Dirty Flag 上增加“哪一项变了”。全局标记回答是否需要刷新,局部标记集合回答只重算 Attack、Defense 还是 Speed,避免一个速度 Buff 让全部属性重新计算。
未开始随机系统
随机系统不是只有 Random.Range。普通随机决定等概率抽取,加权随机决定不同概率,可复现随机保证相同 seed 得到相同序列,保底和洗牌袋则主动限制连续坏结果。
未开始位标记 Flags 与 BitMask
Flags 用一个整数的不同二进制位保存多个互不排斥的真假状态。按位或负责添加,按位与负责检查,按位与反码负责移除;读懂它的关键是观察每一位,而不是把整数当普通数值。
未开始脏标记 Dirty Flag
脏标记把“数据已经变化”和“派生结果已经重算”分成两个时刻。它适合多次写入、较少读取且重算有成本的场景,目的不是让计算消失,而是把重复计算合并。
未开始游戏AI与逻辑建模05 ARTICLES
局部避障:RVO 与 ORCA 理解笔记
RVO 和 ORCA 不负责从地图起点规划到终点,它们只在短时间范围内调整当前速度,避免附近移动体即将发生的碰撞。输入是位置、半径、当前速度和期望速度,输出仍是一个速度。
未开始行为树执行栈、节点返回值与中断
行为树节点每次 Tick 只返回三种结果:Success、Failure 或 Running。组合节点根据子节点返回值决定停在哪、继续谁;中断则必须沿当前运行路径执行清理,不能只把根节点状态改掉。
未开始状态机、行为树、效用 AI 与 GOAP 对比
FSM 直接定义状态怎样切换,行为树组织每帧决策流程,效用 AI 给候选行为打分,GOAP 根据前置条件和效果搜索行动序列。它们不是从低级到高级的替代关系,而是用不同方式回答“现在做什么”。
未开始HTN 与 MCTS 决策模型
HTN 从设计者给出的任务分解规则生成可执行计划,MCTS 通过多次模拟估计行动结果。HTN 更依赖明确的领域知识,MCTS 更依赖可快速复制和推进的状态模型。
未开始Steering、RVO、ORCA 与速度空间
Steering 先产生“我想怎样移动”的期望速度,RVO/ORCA 再根据邻居把危险速度裁掉,移动控制器最后把可行速度落到角色。位置空间描述目标在哪里,速度空间描述下一小段时间采用什么速度。
未开始知识路线01 ARTICLES
C++基础03 ARTICLES
C++ 对象模型、虚表与动态绑定
动态绑定解决的是:代码手里只有基类指针,却要在运行时调用真实派生类型的覆写函数。C++ 标准保证调用语义,虚表和虚指针只是编译器常用的实现方法,不应被当成语言强制布局。
未开始C++ 左值、右值、移动语义与任务队列
左值和右值描述表达式怎样关联对象,移动语义允许资源所有权从一个对象转交给另一个对象。std::move 本身不搬任何字节,它只是把表达式转换成可以匹配移动操作的形式。
未开始RAII、智能指针与资源所有权
RAII 的核心是把“谁负责释放”绑定到对象生命周期。uniqueptr 表达唯一责任,sharedptr 表达共同延长生命周期,weakptr 只观察;它们首先是所有权语义,其次才是指针工具。
未开始CSharp基础数据结构06 ARTICLES
集合常见配套语法
var、泛型、out、lambda 和 foreach 不是五套孤立语法,它们经常共同出现在一次集合查询中:泛型约束元素类型,lambda 描述条件,out 返回额外结果,foreach 顺序消费集合,var 让局部类型由右侧表达…
未开始集合排序查找筛选
排序改变整个集合的顺序,查找返回一个元素,筛选产生多个匹配元素,判断只返回真假,删除则会修改原集合。它们可能使用相似的 lambda,但结果类型和副作用完全不同。
未开始Dictionary 常用操作与深入用法
Dictionary<TKey, TValue> 用唯一 key 定位 value。它适合回答“ID 为 205 的玩家数据是什么”,不适合回答“生命值最低的玩家是谁”,后者仍需要遍历或额外索引。
未开始HashSet:把“是否见过”变成可观察的状态
HashSet<T> 只记录“某个值是否已经出现”,不保存重复次数,也不提供按下标访问。它最有价值的地方是把“检查是否存在”和“首次加入”合成一次 Add。
未开始List 常用操作与删除规则
List<T> 是可按下标访问、会保持顺序的动态数组。真正容易出错的不是 Add,而是删除后后续元素左移,导致下标和遍历位置发生变化。
未开始Queue 与 Stack 常用操作
Queue 和 Stack 保存的可以是同一批数据,区别只在“下一次取谁”:Queue 先进先出,Stack 后进先出。选择它们是在选择处理顺序,而不仅是在选择 API。
未开始没有找到匹配的笔记,换一个关键词试试。