最新文章
-
RMSNorm vs LayerNorm:去均值化到底要不要
LayerNorm 做减均值除方差两件事,RMSNorm 只做缩放一件;从不变性角度分析两者差别,解释 RMSNorm 为什么够用且更快。
-
账户表设计:客户、资金账户、证券账户的三层模型
券商核心系统的账户不是一张表,而是客户、资金账户、证券账户三层。这篇讲清三层的职责边界、主键设计,以及一码通时代客户与股东代码的关系结构。
-
SceneMultiplayer 架构:MultiplayerAPI 与 ENet 的组合分层
Godot 高层多人 API 是三层结构:MultiplayerPeer 管字节流、SceneMultiplayer 管编解码与寻址、你的节点脚本管语义。这篇逐层拆开讲,重点解释为什么 NodePath 要做整数缓存,以及换传输层为什么只需改一行。
-
导入管线:EditorFileSystem 的扫描与 .godot/imported 目录
Godot 运行时不直接读 PNG/WAV,而是读 .godot/imported 里的转换产物。这篇讲 EditorFileSystem 的全量与增量扫描、.import 文件的字段含义,以及改一张贴图到底触发了哪些连锁反应。
-
KV Cache 原理与复杂度推导:一次"以空间换时间"的完整算账
逐 token 解码时重复计算历史 K/V 是主要浪费;推导有无 cache 的计算量差异,并算出 KV cache 的显存占用公式。
-
ReLU 死亡问题与初始化
ReLU 负半轴梯度恒为零,一个神经元一旦整体滑入负区就永久失活;从 pre-activation 分布推死亡概率,解释 Kaiming 初始化为什么恰好对症,以及大模型里死神经元为什么换了形态依然存在。
-
合规报表:监管报表的生成管线
一套数据要喂证监会、证券业协会、结算公司三套报表,口径各不相同;监管口径一变,全链路重算加追溯。这篇讲报表管线的调度模型、勾稽校验,以及为什么口径变更永远赶死线。
-
Chaos 碰撞检测:FImplicitObject 层级与窄相位
拆解 Chaos 的碰撞几何体系:FImplicitObject 类型族、BroadPhase 到 NarrowPhase 的管线、GJK/EPA 在 Chaos 里的具体形态,源码基于 UE5.3。
-
混音线程:AudioServer 的锁竞争实测 —— 音频线程和游戏线程的边界
音频线程每 10.7ms 必须完成一次混音,游戏线程的任何鲁莽 API 调用都可能去抢同一把锁。这篇拆 AudioServer 的线程模型、哪些调用真会进临界区、以及一个放大锁竞争的实测方法。
-
行列式与逆矩阵的导数:Jacobi 公式,以及它在归一化流里的角色
推导 dX⁻¹=−X⁻¹dX·X⁻¹ 与 d log det X=tr(X⁻¹dX) 两条公式,说明后者为什么是归一化流、高斯 MLE 的代数支点,以及"让 log det 便宜"如何决定流模型的架构。
-
GameplayTag 体系:层级标签的匹配为什么这么快
FGameplayTag 本质是全局注册表里的一个 32 位索引:层级关系编译期固化成父链缓存,匹配是整数比较而非字符串遍历。这篇讲注册表结构、查询机制和项目实践的坑。
-
AttributeSet 与聚合器:BaseValue/CurrentValue 为什么分开存
属性的 CurrentValue 不是一个字段而是每次查询时对全部生效 GE 的分层求值:BaseValue 管永久成长,聚合器管临时修正,分开存是为了让 GE 的撤销幂等且与施加顺序无关。
-
LayerNorm 的反向传播推导:均值-方差耦合带来的三项修正
完整推导 LayerNorm 的反向梯度:均值与方差都依赖输入,VJP 因此多出两项投影修正,最终梯度是"去均值、去方向"后的缩放版本。
-
多 SceneTree 的可行性:为什么插件里不能随便 new MainLoop
SceneTree 表面上是可替换的 MainLoop,但渲染、输入、视口、单例注册全围绕"一棵树"假设搭建;要第二棵树,官方给的答案是 SubViewport 而不是第二个 SceneTree。
-
数据去重的三个层次:exact、near 与 semantic 的成本收益账
同一份网页可能被爬几十遍,不去重的语料等于把一部分 token 预算花在重复样本上。这篇按 exact → near → semantic 三个层次拆解去重的原理(哈希、MinHash-LSH、嵌入聚类)、各自的去重率和算力成本,给出什么规模该做到哪一层的实操建议。
-
GDScript 类型推导与 static typing:analyzer 的双遍检查
analyzer 用两遍遍历解决"先用后声明"问题:第一遍解析继承和成员签名,第二遍才检查函数体。这篇讲两遍各自做什么、推导的边界在哪、以及类型标注为什么能让代码快一倍。
-
lambda 与 Callable 的捕获语义:拷贝还是引用
GDScript 的 lambda 捕获是"按值拷贝"——但 Variant 的拷贝语义让这句话有坑:int 是真拷贝,Array/Dictionary 是写时复制的共享,Object 是指针拷贝。这篇用三个实验把捕获规则钉死,并给出循环捕获和生命周期两个实战建议。
-
PackedScene 的序列化格式:.tscn 文本与 .scn 二进制对照
.tscn 和 .scn 装的是同一份 SceneState,只是一个用文本一个用二进制。这篇逐段解剖文本格式的四个区块,对照二进制格式的 RSCC 文件头结构,以及什么场景该选哪种。
-
AudioStreamPlayer 的播放调度与 pitch:变调不变速的实现
play() 之后声音不是立刻出来,而是要等设备缓冲轮转;pitch_scale 改的不是音频数据而是重采样相位步长。这篇讲播放调度的内部状态机、seek 与 start offset 的差异、以及为什么 pitch 变化音高和时长一起变。
-
SGD 动量的物理类比:速度变量的指数平均为什么管用
动量法给梯度下降加一个"速度"变量,让参数像带惯性的小球一样滚过 Loss 山谷。这篇从heavy ball 物理模型推出动量更新的离散形式,定量算它对一致方向的加速和对噪声方向的抑制分别是多少,并解释 β=0.9 这个默认值的来历。