人工智能
从大语言模型到 RAG、Agent 与本地 AI 工具,记录原理、工程实现和实践经验。

从大语言模型到 RAG、Agent 与本地 AI 工具,记录原理、工程实现和实践经验。
整理计算机科学与图形学常用的数学基础、直观推导和数值方法。
汇总常见数据结构、算法范式、题目分析与可复用的解题方法。
记录游戏引擎、玩法系统、渲染管线以及 Unity、Unreal 等项目实践。
对比 C++、Go、Rust、C#、Python、SQL 等语言的语法、运行时与工程实践。
记录绘画基础、观察方法、造型练习以及面向视觉创作的学习过程。
从 GAMES 系列课程到 Vulkan 与实时渲染,梳理图形学理论和实现。
聚焦操作系统、体系结构、编译原理以及并发等底层系统知识。
记录架构、设计模式、后端开发、工具链与可维护软件的工程方法。
收录游戏、ACG、技术与生活中的观察、体验和阶段性思考。
记录单片机控制算法、程序结构与嵌入式开发中的基础知识。
go 中, 所有的参数传递都是值传递, 即所有函数收到的都是一个副本, 只是这个副本可能是普通的值类型, 也有可能是一个指针类型而已.
简单的, 或许可以将其大体上分为“普通类型”, 共享底层数据的类型, 和组合上述两种的类型. 比如
var a int = 10
b := a
此处 a, b 为两个独立的变量, 修改不会互相影响.
而对于 slice / map 来说, 或许可以理解成我们持有它们只是一个 view, 所以哪怕复制了变量, 其保存的地址依旧相同, 也就是说对于一个 slice / map 复制了多份, 不是复制多份其存储的所有数据, 而是复制了这个视图, 其底层依旧指向同一段存储的数据, 所以对于这样的多个变量进行其存储的数据修改, 从宏观上会影响到所有的 Copy
接着对于复合类型就非常好解释了, 比如 struct, 其默认行为可以类似为浅拷贝.
type Player struct {
HP int
Items []int
}
a := Player{
HP: 100,
Items: []int{1, 2, 3},
}
b := a
b.HP = 50
b.Items[0] = 999
fmt.Println(a.HP) // 100
fmt.Println(a.Items[0]) // 999
也就是全部字段都会复制过去, 不过具体的复制方式看其究竟为什么类型
定义一块内存空间,可以存储不止一种类型的变量 —— 从这个说法上有点像是 Union,不过行为上更加丰富
比较重要的,Union 只提供一块可以被多种类型复用的内存空间,但是在具体生产环节,对象还有析构/构造/复制/移动,甚至是异常处理等复杂的生命周期 / 内存管理问题,此时 Variant 就会帮忙进行管理(因为变量拥有所有权)
Bounding Volume Hierarchy,正常来说,对于一条 ray,我们需要查询空间中所有存在的几何面,这很贵,于是借助 BVH 对空间中存在的几何面先进行分层,快速地排除一部分不可能击中的面。
其中使用 “Volume” 是因为它是一个更大的概念,而 AABB 是一个非常常见的包围体的实现,因为其求交操作非常的便宜
假设我们有若干几何面被一个 Volume 包裹住,那么如果当前的 Ray 与这个更大的包围盒没有交那么必定和其中所有的物体都没有交,由此快速过滤一些不可能击中的面
主要用于快速判断两个元素是否属于同一个集合,主要有两个操作
find(x),判断 x 属于哪个集合Union(x, y),合并 x,y 所在的两个集合(可恶,小时候在 CSDN 上好像还写过并查集笔记)