Skip to content

YuuFrag学习记录 共享笔记库

与你的相遇就是奇迹

CATEGORIES

016 篇文章

人工智能

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

026 篇文章

数学

整理计算机科学与图形学常用的数学基础、直观推导和数值方法。

0323 篇文章

数据结构与算法

汇总常见数据结构、算法范式、题目分析与可复用的解题方法。

0449 篇文章

游戏开发

记录游戏引擎、玩法系统、渲染管线以及 Unity、Unreal 等项目实践。

0556 篇文章

编程语言

对比 C++、Go、Rust、C#、Python、SQL 等语言的语法、运行时与工程实践。

062 篇文章

美术

记录绘画基础、观察方法、造型练习以及面向视觉创作的学习过程。

0728 篇文章

计算机图形学

从 GAMES 系列课程到 Vulkan 与实时渲染,梳理图形学理论和实现。

0822 篇文章

计算机系统

聚焦操作系统、体系结构、编译原理以及并发等底层系统知识。

0930 篇文章

软件工程

记录架构、设计模式、后端开发、工具链与可维护软件的工程方法。

106 篇文章

随笔

收录游戏、ACG、技术与生活中的观察、体验和阶段性思考。

112 篇文章

MCU

记录单片机控制算法、程序结构与嵌入式开发中的基础知识。

UPDATES

值传递

go 中, 所有的参数传递都是值传递, 即所有函数收到的都是一个副本, 只是这个副本可能是普通的值类型, 也有可能是一个指针类型而已.

简单的, 或许可以将其大体上分为“普通类型”, 共享底层数据的类型, 和组合上述两种的类型. 比如

go
var a int = 10
b := a

此处 a, b 为两个独立的变量, 修改不会互相影响.

而对于 slice / map 来说, 或许可以理解成我们持有它们只是一个 view, 所以哪怕复制了变量, 其保存的地址依旧相同, 也就是说对于一个 slice / map 复制了多份, 不是复制多份其存储的所有数据, 而是复制了这个视图, 其底层依旧指向同一段存储的数据, 所以对于这样的多个变量进行其存储的数据修改, 从宏观上会影响到所有的 Copy

接着对于复合类型就非常好解释了, 比如 struct, 其默认行为可以类似为浅拷贝.

go
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

也就是全部字段都会复制过去, 不过具体的复制方式看其究竟为什么类型

Variant

定义一块内存空间,可以存储不止一种类型的变量 —— 从这个说法上有点像是 Union,不过行为上更加丰富

比较重要的,Union 只提供一块可以被多种类型复用的内存空间,但是在具体生产环节,对象还有析构/构造/复制/移动,甚至是异常处理等复杂的生命周期 / 内存管理问题,此时 Variant 就会帮忙进行管理(因为变量拥有所有权)

BVH

Bounding Volume Hierarchy,正常来说,对于一条 ray,我们需要查询空间中所有存在的几何面,这很贵,于是借助 BVH 对空间中存在的几何面先进行分层,快速地排除一部分不可能击中的面。

其中使用 “Volume” 是因为它是一个更大的概念,而 AABB 是一个非常常见的包围体的实现,因为其求交操作非常的便宜

假设我们有若干几何面被一个 Volume 包裹住,那么如果当前的 Ray 与这个更大的包围盒没有交那么必定和其中所有的物体都没有交,由此快速过滤一些不可能击中的面

并查集

主要用于快速判断两个元素是否属于同一个集合,主要有两个操作

  • 查找,find(x),判断 x 属于哪个集合
  • 合并,Union(x, y),合并 x,y 所在的两个集合

(可恶,小时候在 CSDN 上好像还写过并查集笔记)

Released under the MIT License.