自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(28)
  • 收藏
  • 关注

原创 定点数确定性物理碰撞库

FixedPhysX 用不到 200 行核心代码类型安全 + 双分派:用抽象 +统一入口,把"圆 vs 圆 / 圆 vs 盒 / 盒 vs 盒"的 N² 组合收敛为几个具体方法,并通过"盒 vs 圆 = 圆 vs 盒取反"消除重复。算法简洁且刻意避开浮点陷阱:圆 vs 圆用平方距离早退、圆 vs 盒用"投影 + 钳制 + 最近点",全程只有整数和固定迭代的开方/查表,没有任何运行时浮点依赖。响应分层清晰:位置修正(推穿出)与速度修正(

2026-09-15 19:18:06 77

原创 定点数运算库

本库是一个完全确定性的定点数数学库,专为帧同步(锁步同步)多人游戏设计。为什么要用定点数?在帧同步架构中,所有客户端必须独立计算出完全一致的结果。IEEE 754 浮点数在不同 CPU 架构、不同编译器优化级别下,舍入行为可能不同(如 x87 vs SSE 指令集),导致计算结果出现微小偏差,进而破坏帧同步的一致性。定点数以整数为基础进行运算,在所有平台上保证比特级一致。特点说明整数运算所有运算基于long(64位有符号整数),跨平台结果一致双缩放因子。

2026-07-22 20:07:23 267

原创 KCP帧同步网络框架

Unity MOBA 帧同步网络层:KCP(基于 UDP 的 ARQ 可靠传输)

2026-06-17 14:20:53 314

原创 EPA算法实现细节

EPA(Expanding Polytope Algorithm,扩展多面体算法)在 GJK 判定两凸体相交后,通过反复扩展 Minkowski 差上的多面体来逼近真实的穿透深度、接触法线和接触点。核心思想GJK 终止时给出一个包围原点的单纯形(1~4 个顶点)将该单纯形扩展为封闭多面体反复取离原点最近的面,沿其外法线取新支撑点,把多面体向外"膨胀"当新支撑点到面的距离不再显著增加时,最近面即逼近 Minkowski 差的真实表面。

2026-06-15 16:47:30 590

原创 GJK算法实现细节

Case条件返回值含义Case 1找到分离轴且间隙 > margin+contactDist,确定两形状不相交Case 2CloseGJK 收敛,返回两形状表面最近点/法线/距离Case 3dist ≤ eps且未退化(Contact单纯形逼近原点,两形状重叠Case 4退化()或 32 次迭代耗尽Close或Contact无法继续收敛,用阈值判定Case 4 的接受阈值→Close;否则 →Contact。

2026-06-14 16:41:22 166

原创 UIFramework

本文档梳理的实现机制,以及它和当前项目业务 UI 的关系。需要先明确一点:项目里存在一套通用的,但当前业务 UI 主线大量使用的是另一套更轻的。两者思想相近,但调用链不同。新增业务 UI 时通常应优先沿用现有业务链路;只有准备统一改造 UI 管理方式时,才考虑让通用接管窗口/面板。

2026-06-05 21:25:27 267

原创 GJK+EPA算法

即 A 中沿方向 d 最远的点。| 问题 | 答案 ||—|—|| GJK 解决了什么 | 判断两个凸体是否相交;不相交时求最近距离 || 关键抽象 | Minkowski Difference:相交 ⇔ 原点在其中 || 计算手段 | 支撑函数按方向采样极值点,逐步构造 simplex || GJK 的核心循环 | 取 simplex 最近点 → 沿 -p 方向 support → Johnson 算法收缩判断 || EPA 解决了什么 | 已知相交,求穿透深度和碰撞法线 |

2026-06-05 21:15:47 449

原创 Unity协程的原理

而协程调度器就是依据迭代器函数返回的内容进行之后的处理,例如yield return null,当调用开启协程函数后,Unity拿到了这个协程的迭代器内部就会等待一帧执行yield return null下一步的逻辑。1.协程函数本体:就是一个能中间暂停的返回函数,如果不通过开启协程方法执行协程,Unity的协程调度器是不会帮我们管理协程函数的,但是我们可以手动执行。2.协程调度器:是unity内部实现的,会在对应时机帮我们执行协程函数。Unity只实现了协程调度部分,协程本质上就是一个C#迭代器方法。

2026-05-01 14:49:43 76

原创 计算机图形学 — Transform

非均匀缩放

2026-05-01 14:48:36 39

原创 操作系统特征

摘要:操作系统具有四个基本特征:1)并发性,指多个程序宏观上同时运行,微观上交替执行;2)共享性,资源可被多个进程共同使用,包括互斥共享和同时共享两种方式;3)虚拟性,通过空分复用和时分复用技术将物理实体转化为多个逻辑实体;4)异步性,进程执行因资源限制而具有不可预测性。这些特征相互关联,其中并发性是最基础的特征。

2025-11-24 18:25:48 451

原创 用Unity复刻童年经典游戏—愤怒的小鸟

Header("地图卡片UI")]/// 初始点击时生成的关卡列表变量托拽赋值如下事先准备一个LevelListPrefab预设体用来动态创建加载每一关的的信息//记录所有类型的小鸟名字//显示小鸟数量//这里需要考虑鸟的数量为0时将遮罩盖住并且将按钮禁用//按钮的遮罩//存放所有小鸟的精灵//存放所有鸟的精灵//选择框的精灵//开始按钮的遮罩//选择框存放的小鸟字段赋值如下。

2025-11-20 11:01:01 1106

原创 操作系统概念

操作系统是管理和控制计算机硬件资源的基础系统软件,负责合理调度工作和分配资源,为用户及其他软件提供运行环境与接口。它通过程序接口实现系统调用功能,但普通用户无法直接使用这些接口,只能通过程序代码间接调用。操作系统作为计算机系统的核心,起着承上启下的关键作用。

2025-11-19 17:02:45 166

原创 Unity的Transform类

从子对象中找到某个对象(可以找到非激活的对象)游戏对象的世界坐标以(0, 0, 0)为原点。6.localRotation 本地四元数。10.Translate 朝给定的方向平移。该对象的前方(本地坐标系z轴的指向)5.rotation 相对世界四元数。15.root 该游戏对象的根对象。使游戏对象Z轴朝向给定的点。绕给定的点和给定的轴旋转。本地坐标,相对父物体坐标。

2025-01-13 21:04:45 381

原创 Unity初识

2025-01-03 22:45:21 214

原创 堆排序&基数排序&高级排序算法效率比较

利用大根堆的堆顶元素是所有元素中最大的性质排序的。

2024-11-03 21:01:16 529 2

原创 数据结构 ━ 堆

堆(heap)分为二叉堆、二项式堆、斐波那契堆,堆是非线性数据结构,相当于一维数组,有两个直接后继。堆又被称为优先队列,尽管名为优先队列,但堆并不是队列。因为队列遵循First in, First out,但是堆是按照元素的优先级取出元素。所以“堆”是实现调度器的理想数据结构。堆排序与快速排序、归并排序一样都是时间复杂度为O(N*logN)的排序方法。

2024-11-03 20:09:12 733

原创 排序算法 ━ 进阶篇

思想(递归):选取一个基准数,把小于基准数的数放在左边,大于基准数的数放在右边,然后分别对左右的数重复该操作,直到整个序列变成有序的循环条件:L < R1.选取基准数val = arr[L]2.从R开始找第一个 < val的数,放到L的位置,L++3.从L的位置开始往后找第一个 > val的数,放到R的位置,R--4.对基准数两边的序列重复以上操作快速排序优化:1.随着快排算法执行,数据越来越趋于有序,在一定范围内,可采用插入排序代替。

2024-10-29 11:44:42 814

原创 排序算法 ━ 基础篇

插入排序的效率最好,尤其是在数据已经趋于有序的情况下,采用插入排序效率最高。一般中等数据量的排序都用希尔排序,选择合适的增量序列,效率就已经不错了,如果数据量比较大, 可以选择高级的排序算法,如快速排序。

2024-10-28 20:52:29 1025

原创 二分搜索查找元素

二分查找算法(Binary Search Algorithm)是一种在有序数组中查找特定元素的搜索算法。它的基本思想是将目标值与数组中间元素进行比较,如果目标值等于中间元素,则查找成功;如果目标值小于中间元素,则在数组的左半部分继续查找;如果目标值大于中间元素,则在数组的右半部分继续查找。通过这种“折半”的方式,每次查找都将搜索范围缩小一半,从而提高查找效率。

2024-10-28 12:45:10 526

原创 数据结构之队列

队列是一种操作受限的线性表,队列只允许在表的一端进行插入,在表的另一端进行删除。可进行插入的一段称为队尾,可进行删除的一端称为队头。队列的主要特点就是先进先出。依照存储结构可分为:顺序队和链式队。

2024-10-26 21:51:41 938

原创 双向循环链表的实现

特点: 每一个节点除了数据域,还有next指针域指向下一个节点,pre指针域指向前一个节点 头节点的pre指向末尾节点,末尾节点的next指向头节点。构造函数与双向链表不同的是,需要将p->next->pre指向头结点,并且循环结束条件是p!构造函数与双向链表不同的是,需要将头结点的next指向头结点,头结点的pre指向头结点。除了循环结束条件(p!= this->head) ,其他和双向链表一致。= this->head) ,其他和双向链表一致。尾插元素不需要找尾结点,头结点的pre就指向尾结点。

2024-10-24 13:21:21 375

原创 单向循环链表的实现及相关算法

先让头结点指向p->next,再回收p指向的结点内存,回收完后,将p重新指向头结点的下一个结点,循环该过程,直到p指向头结点,退出循环后最后回收头结点指向的内存空间。创建一个新结点,将该结点的next指向头结点的next,头结点的next指向新结点,还需要判断原来的链表存不存在有效结点,不存在的话需要将尾结点重新更新指向成tem。创建一个新结点,用指针tem维护,将该结点的next指向头结点,将之前的尾结点的next指向新结点,并更新尾结点的指向为tem。

2024-10-24 13:18:01 827

原创 单向链表的理解及相关算法

让p指向头结点的下一结点,并将链表头结点置空,q指向p->next,遍历链表,先将p->next保存在q中,再将其头插到head中,将保存的地址q重新赋值给p,循环上述过程,直到p指向nullptr退出循环,完成了单链表逆序。先创建一个指针指向头结点,遍历链表,让头节点指向它的下一个结点,回收p指向的内存空间,此时p就成了野指针,需要将其重新指向头结点,直到p为nullptr时,循环结束。这里删除后,不直接return,而是将p重新指向q指向的结点的下一个结点,否则p为野指针,继续操作会导致程序崩溃。

2024-10-24 13:13:06 568

原创 动态数组的实现及相关算法

创建两个指针,p指向首地址,q指向数组尾元素地址,交换二者的值,之后,p向右移动一个元素位置,q向左移动一个元素位置,循环上述过程,直到p越过了q,循环结束,此时完成了逆序。循环以上过程,直到p越过了q,循环结束,最终所有值为value的元素在数组的最左边,p地址往后的元素里就没有值为value的元素了,返回该地址。也是一样,先判断传入位置的有效性,再将该位置往后的所有元素向前挪动一个位置,此时被删除的元素被后面的元素所覆盖掉了,容纳数减一。创建两个变量,p等于数组首索引值,q等于数组尾索引值。

2024-10-24 13:08:50 650

原创 栈的理解及相关算法

栈(Stack):是只允许在一端进行插入或删除的线性表。首先栈是一种线性表,但限定这种线性表只能在某一端进行插入和删除操作。栈顶(Top):线性表允许进行插入删除的那一端。栈底(Bottom):固定的,不允许进行插入和删除的另一端。空栈:不含任何元素的空表。栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构。

2024-10-24 13:02:25 2261 1

原创 线性表的基础概念及其相关算法

本文章将会阐述动态数组、链表的实现过程以及相关的算法线性表,数据结构中最简单的一种存储结构,专门用于存储逻辑关系为"一对一"的数据。线性表,基于数据在实际物理空间中的存储状态,又可细分为顺序表(顺序存储结构)和链表(链式存储结构)。是数据结构的基础。

2024-10-19 21:13:27 1801

原创 基于Easyx的打字游戏

基于链表的数据结构,接受到玩家交互返回的指令后,对链表上的萝卜对象增删,以及萝卜对象的行为实现。

2024-10-12 16:41:48 1912

原创 数据结构与算法的基本概念

算法是特定问题求解步骤的描述,在计算机中表现为指令的有限序列,算法是一种独立存在的解决问题的思想和方法对于算法而言,编程语言不重要,重要的是思想。

2024-10-11 22:05:39 806 2

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除