3D渲染测试:看你的显卡怎么应付实时光线步进
这不是一个转动的方块。每个像素都朝3D体积射出一条光线,每一帧沿着光线步进最多一千次,每一步都要算一遍Mandelbulb公式。所以一个没有贴图、没有三角形的场景也能把显卡压垮,也因此它是着色器吞吐量的公平测试。
30秒。手机从低画质开始。
渲染是怎么做的
画布上大约一百万个像素,片元着色器为每一个像素从摄像机朝场景射出一条光线,沿着它小步前进。每一步都代入Mandelbulb距离公式问一句「我进到形状里了吗?」。答案翻转的那一刻,再用几次二分法把交点算准,然后着色。
画质档位决定每一步要把Mandelbulb公式迭代几次。低是2次,极高是12次。每多一次迭代,每条光线的每一步运算量都跟着翻倍,所以同样的像素数下,极高大约是低的六倍工作量。
着色用的是简单的反射模型,颜色取自到中心的距离,彩虹色的表面就是这么来的。整条管线没有任何贴图采样,整张图都是算出来的。
这个渲染压的是什么
片元着色器吞吐量
几乎所有工作都是像素着色器里的浮点运算:乘方、三角函数、开根号,每个像素几百次。游戏的光照和后期处理靠的就是这个单元。
循环和分支
光线碰到表面或离开体积就提前退出,所以相邻像素的工作量不一样。分支发散处理得好的显卡能保住FPS,处理不好的会停顿。
1024 × 1024的填充率
画布固定是约一百万像素的正方形,再缩放到适合你的窗口。这样手机和4K显示器的结果才能互相比较。
它不压的是什么
没有一个测试能覆盖整张显卡。这些部分在这里是闲着的。
| 显卡的哪一部分 | 为什么闲着 | 去哪里测 |
|---|---|---|
| 顶点和几何单元 | 场景只有两个铺满屏幕的三角形,所有形状都来自像素着色器。 | 多边形密集的游戏或3DMark |
| 纹理单元和显存带宽 | 没有采样任何贴图,除了着色器本身没有东西放在显存里。 | 贴图或显存测试 |
| 视频解码 | 没有播放视频。 | 4K视频播放测试 |
| 温度和频率 | 浏览器读不到传感器。 | HWiNFO、GPU-Z、MSI Afterburner |
怎么解读数字
以中画质为准的大致预期。上限受屏幕刷新率限制。
| 如果你看到 | 通常代表 |
|---|---|
| 平均值顶在刷新率上,最低值紧跟在后 | 显卡还有余力。升一档找它的上限。 |
| 平均值明显低于上限,最低值接近平均值 | 这张显卡在这个档位的稳定、诚实的成绩。 |
| 平均值不错,最低值低很多 | 卡顿。有东西打断了测试:后台标签页、通知,或者降频刚开始。 |
| 独立显卡却只有个位数 | 浏览器大概跑在核显上,或者硬件加速关了。 |
跑出干净结果的小技巧
- 关掉其他在播视频或跑WebGL的标签页,它们共用显卡。
- 测试中不要改窗口大小。画布会重新缩放,要花掉一帧。
- 定时测试中不要拖动或缩放。30秒内摄像机是锁住的,这样每一次测试用的都是同一个视角。
- 跑两次。有些驱动第一次会把着色器编译时间算进去。
3D渲染测试常见问题
关于这个渲染测试到底测什么的常见疑问。
这算真正的3D跑分吗?
它是真实的显卡负载,但很窄:测的是像素着色器吞吐量和分支处理,不是几何或显存。把它当成显卡性能的一个维度,不是游戏跑分的替代品。
为什么没有贴图?
这样结果只取决于显卡的运算单元。加了贴图会把显存带宽混进数字里,更难解读。
Mandelbulb是什么?
Mandelbrot集合的三维亲戚。它的表面由公式定义而不是网格,所以显卡必须为每条光线算出表面在哪里。这正是它适合当压力场景的原因。
为什么画布是正方形?
固定1024 × 1024的画布意味着每台设备渲染的像素数一样,手机和台式机在同一档位下才能比较。
显示器分辨率会影响成绩吗?
不会。画布永远是1024 × 1024,再缩放适配。屏幕刷新率倒是有影响:它限制了FPS的上限。
为什么转动视角FPS会变?
早早碰到表面的光线会早早停下。屏幕上空白区域多的视角要走更多步,跑得更慢。这就是定时测试要锁住摄像机的原因。
