集成显卡也能跑400帧的方块游戏

Software occlusion culling in Block Game

集成显卡也能跑400帧的方块游戏

我的工作站仅配备 AMD Ryzen 7 5700G 的集成 Radeon Vega 8 显卡,性能并不强劲。为了让 Block Game 在低配设备上流畅运行,我决定尝试编写一套纯 CPU 实现的软件遮挡剔除方案。通过构建基于深度的“mipmap”层级结构,并在后台线程中利用 1D 数组追踪遮挡物形状,这套系统成功剔除了至少 50% 的区块。在洞穴等复杂场景下,剔除率甚至高达 95%,让我的弱鸡设备实现了 400+ 的帧率。这不仅避开了复杂的 GPU 算法,还证明了在低分辨率下通过软件渲染优化性能的巨大潜力。

在室内和地下洞穴场景中,它甚至可以剔除高达 95% 的区块,即使在我的弱鸡系统上也能实现 400+ 的帧率。
  1. Pannoniae

    不错的文章 :) 是的,这本质上就是 CPU 和 GPU 性能之间的权衡。剔除(culling)有不同的类型。有像背面剔除(backface culling,硬件支持,不渲染背对你的三角形)和视锥体剔除(frustum culling,不渲染相机看不到的物体)这样基础的东西。几乎每款游戏都会用到这些。

    对于遮挡剔除(occlusion culling)来说,情况就稍微复杂一些,因为你可以在 CPU 上用大致两种方式来实现:要么像文章里那样在 CPU 上进行低分辨率的光线投射/软件渲染,并据此进行剔除。这是一种自适应的工作负载,你可以分配更多的线程或 CPU 算力,它能扩展出更好的剔除效果,从而减少 GPU 需要渲染的像素。

    你也可以使用 GPU 剔除,但这做起来更复杂,而且会占用 GPU 资源,这就陷入了一个两难境地——你想用 GPU 剔除来降低 GPU 负载,但集成显卡通常很难应付计算着色器,而且内存带宽普遍不足,所以执行一次剔除遍历可能会抵消掉你原本可能获得的剔除收益。

    而独立显卡拥有足够的原始算力和内存带宽,可以直接提交视锥体内的所有内容,让大部分内容通过深度测试被剔除。

    我想知道,如果在 CPU 上构建一个连通性图会不会更快,比如每个区块都知道邻居是否可见,反之亦然。渲染时遍历这个区块图并提交可见的区块,有点像一种原语的垃圾回收机制来确定存活对象。剔除效果可能会差一些,但我推测……

  2. keyle

    哇,HN 上居然有技术文章。这是怎么回事?我们回到 2022 年了吗?/s

同日更多故事

2026-09-29