The ryg blog

RSS: https://fgiesen.wordpress.com/feed/
Fabian Giesen 的博客,著名图形程序员,关于图形学、游戏开发与底层编程的技术写作。

ryg_rans 不是库,是算法玩具示例

ryg_rans 是 rANS 算法的玩具示例,不是生产库,作者明确反对直接使用。实际推荐:用隐式交错双状态方案,32位目标用16位重归一化,64位目标用32位重归一化;自适应模型用指数移动平均法;静态概率用 tANS 替代;alias table 方法不推荐。
评论点赞收藏12 天前

关于 PivCo-Huffman 合并操作的技术评论与优化建议

这是一条针对 PivCo-Huffman 合并算法的技术评论。作者分享了自己实现类似合并循环的经验,并指出虽然结果相似,但未使用某些优化技巧。他提到一个具体的代码优化手段:通过展开循环来避免减法操作,从而提升性能。整体内容简短,侧重于个人工程实践和微优化技巧。
评论点赞收藏54 天前

PivCo-Huffman 合并操作深度解析

Frgg Giesen 深入分析了 PivCo 与 Huffman 编码合并操作的底层逻辑。文章探讨了在特定数据压缩场景下,两种算法结合的工程实现细节与性能权衡,属于硬核技术探讨,适合对算法优化和底层原理感兴趣的开发者。
评论点赞收藏55 天前

锁定 Intel 13/14 代 CPU 的硬件 Bug 根源

文章通过 Epic Games 的崩溃统计数据,确认了 Intel 13/14 代 CPU 桌面端存在的硬件故障根源。作者指出这并非罕见的解码器问题,而是更底层的硬件缺陷,解释了为何此前难以复现和定位。这一发现对受影响的硬件用户、开发者以及关注 Intel 产品质量的技术社区具有重要参考价值,提供了关于该重大硬件 Bug 的最新实证分析。
评论点赞收藏60 天前

为什么 ASTC 几乎独用地使用了 ISE 编码?

文章深入解析了 ASTC 纹理压缩格式中独特的整数序列编码(ISE)机制。作者指出,虽然大多数编码方案仅处理 2 的幂次范围,但 ISE 能够高效处理任意范围的均匀分布小整数。这对于 ASTC 在块内传输少量但非标准范围的参数至关重要,展示了其在特定工程场景下的优化取舍。
评论点赞收藏73 天前

Unary码的简单批量解码方法

Unary codes 是通用变长编码的基础模块,常用于构建 Golomb、Rice 等更复杂的编码方案。本文介绍了一种简单的批量解码 unary codes 的方法,利用 SIMD 指令优化解码过程,提升处理效率。作者通过代码示例和性能对比,展示了该方法在视频解码等场景中的实际应用效果。
评论点赞收藏75 天前

深度解析:为什么《见证者》是解谜游戏的异类

作者玩了30-40小时《见证者》后,认为它与传统解谜游戏完全不同。传统游戏侧重规则应用和心流,而《见证者》侧重规则发现和认知顿悟。作为前开发者,作者惊叹于游戏极高的整体一致性,没有任何工业化的拼凑痕迹。文章对比了《时空幻境》的叙事,强调《见证者》是关于认识论和视角的纯粹体验,而非简单的任务堆砌。
评论点赞收藏165 天前

疯狂者的元编程:一次极限代码压缩的实战复盘

作者回忆在制作96k极限游戏.kkrieger时,为压缩体积开发了一个名为Lekktor的工具。该工具通过代码覆盖率分析,自动剔除未执行的路径并插入if(0)来精简C++源码。虽然成功将体积压入限制,但也导致部分从未触发的代码(如碰撞检测、菜单逻辑)被误删,引入了隐蔽Bug。这是一次高风险元编程实验的实战复盘。
评论点赞收藏165 天前

图形管线之旅 2011:系列索引

这是 Fabian Giesen 著名的图形管线系列文章的索引页。作者指出市面上缺乏介于宏观概览和微观组件之间的中等粒度资料,因此撰写了这套基于 GPU 实际硬件实现(D3D/OpenGL)的深度解析。文章面向具备现代 3D API 经验和并行编程基础的图形程序员,详细列出了从软件栈、内存架构、顶点处理、光栅化到计算着色器等 13 个部分的目录。评论区显示该系列在业内极具影响力,被许多开发者视为入门和深入理解 GPU 底层机制的经典指南。
评论点赞收藏248 天前

为什么我不应该自称“内容创作者”

作者强烈反对自愿使用“内容创作者”这一称呼,认为“内容”是分发方(平台/媒体)为了将创作物流化、去人格化而使用的术语。文章指出,这反映了现代数字创作中创作者主体性的丧失,将富有创造性的工作降格为单纯的物流和数据处理环节。
评论点赞收藏301 天前

数据流图极速入门:用依赖关系透视性能瓶颈

作者提出一个简化的机器模型,用数据流图来分析C++代码的性能瓶颈。通过数组求和与链表求和的对比,指出循环间的依赖关系(如指针递增)往往比单次内存访问延迟更决定吞吐量。文章强调建立定量性能模型比单纯跑微基准测试更重要,能帮助开发者在写代码前预判性能问题,而非事后补救。
评论点赞收藏308 天前

CPU为什么要分多级缓存?

文章通过一个生动的办公室档案管理的类比,解释了为什么CPU缓存要分为L1、L2、L3多级,而不是合并成一个巨大的缓存。核心逻辑在于物理限制和访问效率:L1缓存必须极小且私有,以保证极低的延迟和高带宽,就像办公桌触手可及;L2和L3虽然容量更大,但访问速度变慢,需要协调机制。如果合并成大缓存,物理距离增加会导致延迟上升,且多核共享时会因竞争资源产生严重的协调开销。此外,指令缓存和数据缓存的设计目标不同,分开设计能避免妥协。这是一篇从底层硬件物理特性(如布线面积、功耗、路由拥塞)出发,深入剖析计算机体系结构设计的优质科普。
评论点赞收藏308 天前

以过于多种方式读取位数据(第一部分)

文章深入探讨了在字节流中高效读取变长位数据的技术细节。作者对比了MSB-first和LSB-first两种打包约定,分析了不同CPU架构下移位操作的未定义行为及性能差异,并展示了利用旋转指令、查找表等技巧优化位提取性能的方法。这是一篇面向底层开发者和编解码工程师的高质量技术深度解析。
评论点赞收藏330 天前

关于精确UNORM8转浮点数的评论

作者rrrola在评论中指出,对于snorm8和snorm16存在精确的浮点数转换公式,但对于unorm16似乎不存在这样的常数。他提供了一个近似公式,但在x=61457处开始出现误差。这反映了图形编程中定点数与浮点数转换的一个具体技术细节和潜在陷阱。
评论点赞收藏509 天前

行优先与列优先数组、行向量与列向量的辨析

文章澄清了图形编程中矩阵存储顺序(行/列优先)与向量表示(行/列向量)是两个独立的概念。很多开发者误以为它们必须绑定,导致混淆。作者指出,GL使用列优先存储和列向量,D3D使用行优先存储和行向量,但这只是历史遗留的约定。核心观点是:无论存储方式如何,矩阵乘法规则不变;选择行/列向量主要影响变换矩阵的组合顺序(左乘还是右乘)。作者建议遵循所用语言或库的默认约定,并在代码中保持一致性以避免错误。
评论点赞收藏527 天前

双MMAP魔法环形缓冲区的实现技巧

作者介绍了一种利用操作系统内存映射功能实现的“魔法环形缓冲区”。传统环形缓冲区在数据跨越边界时需要特殊处理或拷贝,而该技术通过将同一块物理内存多次映射到连续的虚拟地址空间,使得缓冲区在逻辑上被“展开”,从而消除了边界检查的复杂性。文章提供了Windows和Unix/Linux下的具体实现思路与代码链接,并解释了其在多线程通信中简化逻辑、减少浪费的优势。这是一个经典的底层系统优化技巧。
评论点赞收藏554 天前

UNORM与SNORM转浮点数的硬件实现详解

作者深入解析了在游戏图形渲染中,将定点数格式(UNORM/SNORM)转换为浮点数(Float)在硬件层面的具体实现机制。文章指出,这种转换并非简单的查表或复杂运算,而是可以通过巧妙的位操作和硬件特性高效完成。这对于理解GPU底层数据流水线、优化着色器性能以及编写高效的图形驱动代码具有极高的参考价值,适合对计算机图形学和硬件架构感兴趣的开发者阅读。
评论点赞收藏599 天前

Mrsse:Oodle Texture BC6H 编码中的误差度量

文章介绍了在实现 Oodle Texture 库的 BC6H(HDR 压缩格式)编码器时,如何设计一种新的误差度量方法(Mrsse)。由于 BC6H 处理的是高动态范围数据,数值跨度极大,直接比较浮点数误差会导致精度问题。作者指出 BC6H 内部将 float16 位模式视为半对数映射的 16 位整数进行处理,因此需要一种能反映人类视觉感知或实际重建质量的误差指标,而非简单的数学均方误差。这属于图形学底层算法的工程实践分享。
评论点赞收藏638 天前

登录芦苇

登录后关注作者、收藏内容和参与讨论。