这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
34. MongoDB 分片键设计与热点治理
分片键决定分片集群的写入分布与扩展上限。本文讲基数与频率与单调性准则、范围分片与哈希分片取舍、单调递增键热点治理、chunk 分布诊断、均衡器与 jumbo chunk 处理,以及 reshardCollection 重分片。
posts
这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
分片键决定分片集群的写入分布与扩展上限。本文讲基数与频率与单调性准则、范围分片与哈希分片取舍、单调递增键热点治理、chunk 分布诊断、均衡器与 jumbo chunk 处理,以及 reshardCollection 重分片。
本文系统讲解图像分割与实例分割,回答语义、实例、全景分割有什么区别、U-Net 与 DeepLabv3+ 怎么选、Mask R-CNN 的 ROIAlign 解决什么问题、SAM 何时值得用等实战问题。覆盖 FCN、U-Net 跳连、空洞卷积与 ASPP、ROIAlign、SOLO 与 SAM,并给出 DeepLabv3 推理与 IoU/Dice 计算两段可运行代码,附模型对比表、权衡与常见坑。
《游戏引擎实现原理》卷二《渲染引擎》全书导航页:说明本卷定位与卷一《引擎内核》的关系、本卷差异化(在 RHI 上从零实现、每节跑出真实产物、真实像素与计时结果),给出顺序通读、只读 RHI 四章、直奔帧图与后处理三条阅读路径,讲清 L1–L2 可运行性口径,并按五个部分列出 18 章 54 节的完整章节索引,另含周计划表与常见问题速查,方便读者按需定位、跳读与随时查阅。
9.2 的状态缓存砍不掉顶点缓冲的频繁切换,因为它按材质而非网格分组。这一节换一条把网格提到高位的批次键,把连续同网格的绘制并成一次实例化绘制:20 万次绘制在 64 网格场景降到 64 次,并跑出一次 draw(6,4) 画出四个彩色实例的真实像素。
写一个后端无关的状态缓存,记住当前管线、绑定组、顶点与索引缓冲,只在真正变化时下发;在 20 万次绘制的乱序与排序两种流上跑出「应用 / 跳过」两路计数,看排序能把管线切换从 199157 次砍到 512 次、又砍不掉什么,为下一节的实例化合批埋下引子。
把剔除后的可见项压进一条 32 位排序键:高 18 位决定批次归属、低 14 位决定前后顺序,再用稳定的 LSD 基数排序替代多字段比较器。在 20 万项的确定性场景上跑出三种排序的真实耗时对比,并正面校验不透明项确实近→远、透明项远→近。
把视锥剔除与 LOD 选择整体搬到 GPU:一个 compute 通道按包围球剔除、按距离选档,用原子计数器追加进对应 LOD 的实例缓冲,第二个通道写出三组 indirect 绘制参数;CPU 每帧只发三个 drawIndirect,并回读掩码与 CPU 逐对象比对验证一致。
用最长轴中位数分割把十万个 AABB 建成扁平二叉 BVH,把逐盒的线性剔除换成层次遍历;再把叶节点 AABB 与图元 AABB 摊平上传,用两个 compute 通道做两级视锥剔除,回读掩码与 CPU 的 bvhCull 逐位比对,验证完全一致。
从相机的视图投影矩阵抽出六个裁剪面,用 p-vertex 判定 AABB 与包围球的可见性;先跑通 CPU 侧剔除统计,再在 headless Chromium 里只把可见盒子按实例绘制,回读帧缓冲逐色核对被剔除的盒子一个像素都没画出来,全程附可复现代码。
把相机拆成 view / projection / viewProj 三个矩阵,从 viewProj 免费抽出六个裁剪面,再由屏幕坐标沿相机基座构造世界空间拾取射线,最后在 headless Chromium 里点一下屏幕、验证拾取命中的正是那个实例。
给场景图加上脏标记:改动一个节点只把它的子树标脏,更新时只重算被标脏的节点、并在重复标记时提前停止,再用一组确定性访问计数与逐字节像素比较,证明「脏更新」与「全量重算」产出的世界矩阵逐位一致、渲染画面也完全相同,从而让每帧只付出真正改动的那部分代价。
把 ECS 的扁平组件数组解释成一棵场景树:给每个实体补一个父索引,按拓扑序算出 world 矩阵,再展平成渲染器直接消费的实例列表,并在 headless Chromium 里用一次 instanced draw 画出全部实例、回读像素核对位置。
采样器不占显存,却决定纹理越界、缩放、倾斜时怎么被读:clamp / repeat / mirror 三种寻址、nearest / linear 两种过滤、以及各向异性的收益与代价;并用同一张 4x1 纹理实测三种寻址模式下的边缘像素回读。
把纹理的显存账算清楚:颜色 / sRGB / 深度格式各占多少字节、BC / ETC2 / ASTC 三族块压缩如何取舍、mipmap 链为什么让显存多出约三分之一;并实测 WebGPU 上哪些压缩格式必须靠扩展才能创建、哪些属于核心格式开箱即用。
把顶点描述成「格式 → 偏移 → arrayStride → shaderLocation」这条可运行的数据链:写出 helio 的顶点布局模块,用它程序化生成《微光岛》一块低多边形地形,并在 headless Chromium 里上传、回读、重算包围盒。
NullRHI 是 helio 的第三个后端:它不接触 GPU,把每一次 RHI 调用按顺序记进日志。于是渲染代码的调用序列变成可在 Node 里断言的纯数据,单测与 CI 不需要显卡、也不会因驱动差异而抖动。本节用同一段渲染代码分别跑 WebGPU 与 NullRHI,断言后者产出的调用日志。
同一套 RHI 接口的 WebGL2 实现:把 bind group 映射成 uniform block 与 texture unit、render pass 映射成 framebuffer object、WGSL 换成 GLSL ES 3.0。更关键的是能力降级——WebGPU 有而 WebGL2 没有的特性如何优雅退化,并用 clearColor 加 readPixels 真跑出像素断言。
helio 的 RHI 抽象在 WebGPU 上的落地:把资源、管线、命令、绑定四组接口逐条翻译成 WebGPU 调用,用自增整数句柄隔离后端细节,并真跑一次创建资源、录制渲染通道、提交队列、回读像素的完整流程,断言中心像素与清屏角像素,作为后端正确性的最小证据。
资源能传上去之后,一帧里反复创建销毁 buffer/texture 会把驱动拖垮、把显存切碎。本节复用卷一的大小类思路做一个 GPU 内存池,配显式预算与超限策略,统计复用率与峰值占用,并在真实 WebGPU 设备上跑三帧验证第 2/3 帧确实复用了第 1 帧创建的 buffer。
上一节把资源绑进了管线,但资源本身还没进 GPU。本节讲 writeTexture 与 copyBufferToTexture 两条上传路径,撞上 WebGPU 最著名的 bytesPerRow 必须对齐 256 字节的坑并抓出真实报错,再用一条 textureLoad 的 box filter 通道逐级生成 mipmap 并回读断言。