标签:渲染
-
Vulkan 后端初始化:instance、device 与 queue 的选择逻辑
vulkan_context.cpp 按四层递进初始化 Vulkan:instance 选验证层、physical device 按能力打分挑卡、logical device 凑齐扩展和队列族;读懂选择逻辑能解释大半"启动失败 / 用了核显"的问题。
-
后处理链源码:FPostProcessing 的 Pass 顺序与设计逻辑
拆解 UE5 后处理链的 pass 顺序:每个 pass 为什么在那个位置、RDG 化后的组织方式、调优时改哪一环,源码基于 UE5.3。
-
Nanite 光栅化与 VisBuffer:软件光栅写可见性缓存
为什么 Nanite 要拆软硬两条光栅路径、VisBuffer 里到底存了什么、材质分类 pass 怎么把几何和着色解耦。
-
GPU 剖析:stat gpu 与 RenderDoc 联用
从 stat gpu 的 Pass 耗时聚合到 RenderDoc 的单次绘制抓取:两层工具各看到什么、各自的坑(时间戳粒度、异步重叠、移动端失真),以及怎么从 Pass 耗时反推内容问题。
-
descriptor set 与 UniformSet 的缓存策略:绑定资源时的哈希查表
uniform_set_create 不急着建 Vulkan descriptor set,先对完整绑定内容算哈希查缓存;命中一次查表省下 vkAllocateDescriptorSets,这是高 draw call 场景下绑定期开销的主要来源。
-
Slate 渲染:FSlateDrawElement 如何合并成 Draw Call
UI 的 draw call 数不是 widget 数:讲清 DrawElement 到 RenderBatch 的合并规则,以及纹理图集在其中的决定性作用。
-
Lumen Final Gather:屏幕探针与 SDF 追踪的间接光闭环
拆解 Lumen Final Gather 的完整链路:屏幕探针怎么布置、SDF 追踪怎么取Radiance、时域累积怎么滤波,源码基于 UE5.3。
-
-
Nanite 流送:Cluster Page 的按需加载与驻留管理
拆解 Nanite 流送的驻留模型:page 粒度如何选、剔除结果怎么变成加载请求、显存池满时的换出策略,源码基于 UE5.3。
-
Virtual Shadow Map:虚拟页表的阴影贴图
拆解 Virtual Shadow Map 的设计:为什么需要 16K 虚拟分辨率、页表怎么映射、缓存命中率怎么决定性能,源码基于 UE5.3。
-
Lumen 硬件光追路径:HWRT 与 SWRT 的切换逻辑
对比 Lumen 的软件光追(SDF)与硬件光追(HWRT)两条路径:各自的数据结构、切换条件、质量差异和性能账本,源码基于 UE5.3。
-
Draw Call 优化:合并、实例化与 HLOD 的手段对比
场景侧降批的三条路线——离线合并、GPU 实例化、HLOD 空间聚类——各自的机制、适用场景和代价,以及"什么时候不该合并"的判断标准。
-
RenderingDeviceDriver 的诞生:4.3 拆出驱动层解决了什么问题
4.3 把 RenderingDevice 里"懂 Vulkan"的部分下沉成 RenderingDeviceDriver,让上层只剩资源与命令簿记;这次拆分给 D3D12/Metal 后端铺了路,也让 barrier 推导能在驱动层统一做。
-
-
引擎版本演进:3.x 到 4.x 还了哪些架构债
Godot 4.0 是一次刻意的"破而不立然后立",这篇对照 3.x 到 4.x 的架构变化:VisualServer 拆分、GDScript 重写、信号系统重设计,以及迁移时真正会咬人的差异。
-
纹理导入:VRAM 压缩格式的选择逻辑
PNG 再小也要解码成 RGBA8 上显存,VRAM 占用和磁盘体积是两回事。这篇算清 BC/ETC2/ASTC 的块压缩数学,讲 Godot 四种压缩模式的取舍,以及 export 时按平台选格式的具体配置。
-
Window 节点与 Viewport 的关系:4.x 把窗口做成节点解决了什么
4.x 让 Window 继承 Viewport 并进入场景树,窗口从此是一等节点:多窗口管理、per-window 渲染缓冲、子窗口嵌入都能用节点语义表达,代价是 Viewport 的类职责被拉宽。
-
GPU 内存分配子系统:内存池与 staging buffer 的上传路径
RD 的显存来自 Vulkan Memory Allocator 的池化分配,CPU 到 GPU 的上传统一走 staging buffer 中转;贴图加载慢和 device lost 两类问题,根子常在这两条路径的配额上。
-
RHI 抽象层:FRHICommandList 与平台后端
为什么 UE 要把命令录成"数据"再翻译一遍、FRHICommandList 与 ID3D12GraphicsCommandList 之间隔了几层、PSO 缓存为什么绕不开。
-
渲染线程模型:GameThread/RenderThread/RHIThread 的边界
三条线程各自干什么、ENQUEUE_RENDER_COMMAND 背后是什么队列、帧同步栅栏怎么保证游戏线程不踩渲染线程。
-
compute shader 管线:用 RenderingDevice 写第一个 GPGPU 程序
RD 的 compute list 把 GPGPU 压缩成"编译 SPIR-V、建 uniform set、begin/dispatch/end"三步;workgroup 尺寸与 dispatch 网格的关系是新手最容易算错的地方,本文用一个粒子求和例子走通全流程。
-
Node2D 与 CanvasItem:全局变换的脏标记传播
CanvasItem 用脏标记加惰性求值维护全局变换:改动只向上冒泡置位、计算只在读取时发生;理解了传播规则,才能解释为什么频繁改 transform 的 2D 游戏不必每帧全树重算矩阵。
-
GPU Scene 与 SceneProxy:场景数据如何上 GPU
拆解 UE5 的场景数据通路:FPrimitiveSceneInfo 怎么注册、SceneProxy 的游戏线程/渲染线程分工、GPU Scene 大缓冲的增量更新机制。
-
Nanite Cluster 剔除流程:两级 HZB 与持久线程的源码走读
拆解 Nanite 剔除流水线:DAG 按误差切割、两遍遮挡剔除、持久线程调度,源码基于 UE5.3。