为什么大家用毒蘑菇看显卡
在渲染与硬件圈子里,毒蘑菇(尤其是红伞白点的毒蝇伞 Amanita muscaria,以及要人命的致命鹅膏)是一类很典型的测试素材:菌盖是大面积高饱和红色,上面散布高对比的白色疣斑,菌褶与菌环有大量细小重复结构,而它生长的林下环境是接近黑色的缓慢渐变。这几种特征叠在一起,等于同时给显卡出了四道题:精度、滤波、带宽和抖动。
显卡一旦有问题,往往不会让整张图糊掉,而是只在这几类区域先露馅:暗部渐变被切成一层层台阶(色带,banding),本该有细节的地方被抹成不自然的纯色方块,重复的图块在不同位置出现完全一样的像素,或者边缘出现规则噪点与锯齿状抖动。专业渲染里靠高样本数与蓝噪声抖动把这些藏起来;一旦算力不足、驱动异常、显存出错,抖动先崩,人眼也就先看到。
所以「给你看个毒蘑菇」慢慢成了一句暗号:不用装软件、不用跑几十分钟专业测试,看一张图就能大致判断这张卡健不健康。二手交易里用它筛矿卡、花屏卡、被刷过 BIOS 的假卡,比跑一整套 3DMark 效率更高。本站把这套思路搬进浏览器:用一段纯 WebGL 光线行进(raymarching)实时渲染的毒蘑菇森林当作负载,同时给出速度与健康的两条结论。
一次测试的四个阶段
点「开始测试」之后,页面按下面四个阶段推进。整个过程都在你的设备本地完成,网站不接收任何数据。
① 预热(约 1.8 秒)
先把着色器跑起来,让驱动完成编译与纹理/缓冲区分配,也让 GPU 从低频怠速升上来。预热的帧不参与计分,避免把驱动的一次性开销算进成绩。
② 加压采样(6 / 12 / 20 / 30 秒)
按你选的画质档位全速渲染,逐帧记录帧耗时;每档开始都有一段稳定期——前 0.45 秒与前 8 帧(第一档放宽到 1.35 秒 / 16 帧,因为驱动升频和着色器 JIT 的尾巴比想象的长;但一段的稳定期最多只占该段时长的 45%,否则短窗口下整段都在稳定、一个样本也采不到)只推进计时、不计入样本,避免把热身当成性能。单档采样固定一个档位跑满全程,分数直接可比;阶梯压力依次从温和→标准→高强度→极限加压,用来观察散热与供电的拐点(报告里每档各有一条柱状成绩)。阶梯模式的综合跑分只取「标准」档那一段(该段样本不足时取样本最多的一档),前后段衰减也在那一段内部计算——否则四档混合出来的中位帧耗时不属于任何档位,档位之间的负载差还会被误读成降频。
③ 画面体检
停帧抓取最后一帧,做四类像素分析:色带(暗部渐变的平坦段长度与跳变幅度)、异常平整色块(周围有细节却被抹平的 8×8 块)、重复图块(互不相邻却哈希完全相同的 32×32 块)、纯色垃圾像素与全黑覆盖。结论以 0–100 的「纯净度」进入总分,并把最可疑的区域放大 4 倍给你看。
④ 统计与评分
计算平均/中位/最差 1% 帧率、掉帧次数、帧间隔离散度、前后段衰减,再结合单帧真实耗时换算吞吐与综合跑分,最后写入本机历史并生成报告。如果单帧长过整个采样窗口(软件渲染、老核显或把倍率拉太高时常见),跑分器会自动降一档、把内部倍率降到 0.6×、并把窗口翻倍重测一次;报告的质量说明会写明它退到了哪一档,因为降级后的分数并不是你要求的那个工作量。
三个渲染后端与负载版本
同一份毒蘑菇场景可以由三条路径渲染:硬核模式(WebGL2/WebGL1)是默认,兼容性最好;WebGPU 模式跑的是同一套距离场与同一组成本系数,只是换成较新的 API,因此两者分数可以直接对比;兼容模式(Canvas 2D)是另一种负载,只考验填充与合成。页面会在后端不可用时自动降级,并在报告里写明实际使用的是哪条路径。
| 后端 | 负载内容 | 分数可比性 | 什么时候用 |
|---|---|---|---|
| 硬核 WebGL(默认) | 光线行进 + 软阴影 + AO + 体积雾(优先用 WebGL2,拿不到时回退 WebGL1) | 基准口径:另外两路都按它的成本系数计分 | 默认选择。跨设备对比、二手验卡都用它。 |
| WebGPU(实验) | 与 WebGL 完全相同的场景与成本系数,仅 API 不同 | 可直接与 WebGL 比分(同一份几何与成本系数) | 浏览器支持 WebGPU 时用来对比 API 开销与驱动实现质量。 |
| 兼容 Canvas 2D | 渐变、模糊、粒子与合成,几乎不考验着色器 | 另一种负载,不能与 WebGL / WebGPU 比分 | 没有 WebGL、驱动异常、软件渲染或只想快速看一眼时。 |
负载版本号
workload = mw-1.4.0 — 每次改动几何、相机轨迹或成本系数,版本号都会递增,并写进结果、报告与导出文件。不同版本的分数不可直接比较;对照历史成绩时,报告只会在同版本内给出差值。
为什么要这么较真:浏览器跑分没有厂商背书,如果哪天我们调整了菌盖形状或步进数,旧分数就会变成另一种量纲。留下版本号,你半年后翻出老记录时才知道该不该拿来对比。
跑分是怎么算出来的
浏览器的渲染循环被 requestAnimationFrame 与垂直同步限制,直接看 FPS 会把强卡压成「60」,没有区分度。所以本站的评分核心不是 FPS,而是单帧渲染耗时:优先使用 GPU 计时器查询(EXT_disjoint_timer_query_webgl2)拿到单帧真实时间;驱动不提供时,自动在一帧里多渲染几遍(报告里的 passes ×N),让 GPU 始终处于满载,从而用帧间隔反推单帧耗时。
成本系数 = (光线步进数 ÷ 96) × (1 + 0.42×软阴影 + 0.055×AO 采样) × 细节倍率^0.5
综合跑分 = 吞吐 × 成本系数 × 42
画质档位与分辨率倍率不同时,分数依然可比:分辨率提高会让 MPix/s 下降,但成本系数同步上升。
这样做的含义很直白:分数正比于你的显卡每秒能算完多少「本站这道题」的像素。兼容模式(Canvas 2D)用绘制量近似成本系数,因此与硬核模式的数量级一致,但两种引擎的绝对分数不等同——Canvas 主要吃填充与合成,测不出着色器与带宽瓶颈,所以我们始终并列显示引擎标签。
总分(0–100)与评级(🍄)是两件事
评级只看综合跑分落在哪一段(金针菇级 → 致命鹅膏级),描述你的速度水位;总分是加权健康度:吞吐 50% + 稳定 17% + 纯净度 15% + 均匀度 8% + 持久 10%。速度快但画面体检不合格,总分照样低——这正是要抓的卡。
读懂报告里的每一张图
帧率曲线
横轴是采样时间,纵轴是瞬时帧率;实线是最近约 24 帧的平均值,紫虚线是三点滑动平均(看趋势用),绿虚线是 60fps 参考线,阶梯模式下每个压力段用淡色底纹区分。健康的曲线是「贴着参考线的平直带」;持续下滑是降频,毛刺下陷是卡顿/掉帧,阶梯状下台阶多半是系统功耗策略切换。
帧耗时分布
横轴是单帧毫秒数,纵轴是出现次数。理想情况是一根窄峰。峰右侧的长尾就是掉帧元凶(超过 33ms 染成红色);出现双峰通常是同步/丢帧造成的「一半帧、两倍时长」。紫线标注中位数。
阶梯压力 / 场景巡测的各段表现
阶梯压力是四档帧率的柱状对比:柱子应该按压力递增而平滑下降;如果某一档突然掉一大截,说明那一档的负载正好越过了你的显存/带宽/散热临界点。场景巡测则是固定一档跑完六个场景,每根柱子是一段归一化吞吐(分数),哪根最短就说明你对那一类效果(软阴影、AO、体积雾还是填充)最敏感;只有在硬核 WebGL / WebGPU 模式下这种比较才有分辨力。
关键数字
- 平均帧率 / 1% 低帧:前者看总体水位,后者看体验下限。1% 低帧与平均值的比值低于 70% 就该关心稳定性。
- 单帧耗时:真正可比的核心量,报告用反推后的单帧 GPU 耗时;MPix/s 是每秒完成的像素量。
- 掉帧次数与占比:超过 50ms 的帧计数。帧间隔离散度 CV 越小越稳(0.1 以内算平顺)。
- 前后段衰减:把采样期分成四段,比较最前 25% 与最后 25% 的平均帧耗时。超过 10% 说明在降频,配合阶梯压力看更准。
- passes ×N 与 GPU timer:前者说明系统为了绕开垂直同步每帧渲染了几遍,后者说明是否拿到了真实 GPU 计时(是=数据更可信)。
四类画面异常,分别意味着什么
| 现象 | 画面看起来 | 常见原因 | 下一步 |
|---|---|---|---|
| 暗部色带 | 夜空/雾的渐变变成一圈圈台阶 | 输出被截成低位深、驱动/显示器抖动异常、HDR 或 6bit+FRC 面板 | 关掉浏览器硬件加速对比一次;换 8bit 输出或另一台显示器复测;只在同一台机器复现则多为面板或驱动 |
| 异常平整色块 | 苔藓有细节,某块却是一整片纯色 | 显存/光栅化错误、超频过头、供电不稳 | 恢复默认频率与 BIOS,重测 3 次;稳定复现请当作硬件问题对待 |
| 重复图块 | 不同区域出现一模一样的碎块纹理 | 分块渲染器缓存异常、驱动 bug | 更新或回滚驱动;笔记本请确认用的是独显而非核显 |
| 垃圾像素与全黑 | 突然出现纯紫、纯绿的块,或整帧黑 | 着色器编译失败、上下文丢失、硬件故障前兆 | 换浏览器复测(Edge/Chrome/Firefox);若仍异常,跑阶梯压力看是否随温度恶化 |
体检结论不是唯一判据:截图压缩、浏览器缩放、显示器抖动都会干扰。判定的正确姿势是连续 3 次、同一档位复现同一个异常,并且换一台设备或浏览器对照。
分数明显偏低?按这个顺序排查
- 确认用了独显:笔记本双显卡常默认走核显。到系统显示设置里把浏览器指定为「高性能」,或在显卡控制面板强制独显;硬核模式的设备信息里
ANGLE一栏能看出实际渲染后端。 - 接通电源 + 高性能计划:电池模式下 GPU 会被限功耗,测出来的分数不代表真实性能。
- 检查浏览器硬件加速:设置里关掉「使用硬件加速」会退化成软件渲染(设备信息里出现
SwiftShader/llvmpipe就是这种情况),此时分数没有参考价值。 - 关闭抢资源的程序:其他标签页的视频/游戏/挖矿/下载、屏幕录制、多显示器高刷扩展、Windows 硬件 GPU 调度、HDR 桌面合成,都会吃掉带宽。
- 更新(或回滚)驱动:刚升级驱动后建议重启再测;某些驱动版本会改变着色器编译质量。
- 拉长采样时间:6 秒容易受瞬时负载影响,比较设备时用 20 或 30 秒,并看「稳定 / 持久」两项。
二手显卡自查清单
线下验卡时间紧,用这套浏览器流程 5 分钟能出结论(手机也能打开,现场不用装驱动):
- 先看设备信息:型号、显存相关字段、是否软件渲染、
ANGLE后端。型号与卖家描述不符(例如写着 3060 实际是 3060 Laptop 或被改名)就先警惕。 - 标准画质单档 12 秒 ×3:三次分数差距应小于 8%。波动大说明散热、供电或显存不稳。
- 阶梯压力 20 秒:看四档柱子和「前后段衰减」。极限档明显崩、或最后一段比第一段慢 15% 以上,通常是散热被清灰/硅脂压住了,或长期高负载老化。
- 打开报告的「渲染画面」放大看:菌盖白斑边缘是否毛刺、暗部渐变是否台阶、苔藓是否有方块状抹平。体检结论「轻微异常 / 可疑 / 异常明显」三档任一出现,都要求换一张对比。
- 极限分辨率复测一次:把倍率拉到 1.5–2.0×。带宽或显存有暗病的卡,往往在标准档正常、高倍率下崩得离谱。
- 保存证据:导出分享图与 JSON,卖家承诺与实测对照留档,7 天验证期内足够用。
场景与画质档位
| 场景 | 压力侧重 | 说明 |
|---|---|---|
| 毒蘑菇·幽林 | 对比度与暗部抖动 | 黄昏林下的红伞白斑毒蝇伞,苔地与雾气层次最丰富,默认场景。 雾密度 0.05 · 细节八度 5 · 自发光 0.06 |
| 夜光菌·霓虹 | 雾积分与发光累积 | 自发光菌盖与浓雾叠加,考验发光累积、雾积分与暗部抖动。 雾密度 0.055 · 细节八度 4 · 自发光 0.52 |
| 死亡帽·体积光 | 次表面与色阶过渡 | 强逆光穿透菌盖的次表面散射,最容易看出色带与过渡断层。 雾密度 0.13 · 细节八度 6 · 自发光 0.1 |
| 微观·孢子 | 高频细节与精度 | 微距镜头 + 高频细节,把纹理过滤与浮点精度逼到极限。 雾密度 0.04 · 细节八度 7 · 自发光 0.45 |
| 极光菌·夜境 | 填充率与带宽 | 冷色天空与远景相机,填充率与视角带宽压力大,适合看整体吞吐。 雾密度 0.085 · 细节八度 5 · 自发光 0.95 |
| 档位 | 步进数 | 分辨率倍率 | 软阴影 | AO 采样 | 成本系数 |
|---|---|---|---|---|---|
| 温和 | 56 | 0.75× | 不可用 | 3 | ×0.57 |
| 标准 | 96 | 1.00× | 支持 | 5 | ×1.69 |
| 高强度 | 132 | 1.15× | 支持 | 5 | ×2.50 |
| 极限 | 168 | 1.30× | 支持 | 6 | ×3.49 |
| 地狱 | 200 | 1.45× | 支持 | 6 | ×4.39 |
我们知道的局限
- 分数不可跨工具比较:与 3DMark、FurMark、OCCT 的测试内容与计分完全不同,只能在本站内比较设备。
- 浏览器是共享环境:合成器、其他标签页、系统桌面都可能加入噪声,因此报告强调稳定性指标而非单点最高分。
- 无后台时钟:切到其他窗口时浏览器会暂停计时(报告里的 hiddenPauses 会记录),跨设备比较时请保持页面在最前台。
- 兼容模式不是同一种测试:Canvas 2D 几乎不考验着色器与带宽,用它的成绩与硬核模式并排比较会严重高估设备。
- 体检有假阳性:显示器抖动、浏览器色彩管理、图像缩放都会影响暗部统计,务必用多次复现来判定。
术语表
- 色带 / Banding
- 渐变本该平滑,却因为位深不足或量化截断,变成一条条可见的台阶。本站在暗部渐变上专门统计平坦游程与跳变幅度。
- 抖动 / Dithering
- 用规则噪声打散台阶,让有限的位深看起来更平滑。蓝噪声抖动是现代渲染管线的常见做法,也是"关掉就能看见色带"的那层伪装。
- 光线行进 / Raymarching
- 沿视线一小步一小步前进,每步都问"距离表面还有多远"。步数越多、场景越复杂,单帧计算量越大,是天然的 GPU 负载。
- 环境光遮蔽 / AO
- 通过在法线方向多次采样,估算一处表面被自身遮挡的程度,让菌褶、根部与地面接触处变暗。采样次数越多开销越大。
- 软阴影 / Soft shadow
- 朝光源再走一次光线,根据遮挡程度给出渐变而非硬边的阴影。真实但昂贵,是档位之间差异最大的开销之一。
- 填充率 / Fill rate
- 每秒能写出多少像素。分辨率、倍率与叠加层数都在考验它,所以高倍率往往比高步数更快暴露低端显卡。
- 1% 低帧
- 所有帧里最慢那 1% 的等效帧率,比平均值更贴近主观流畅度。
- 掉帧 / Jank
- 单帧耗时超过 50ms 的次数。数量不多也可能被明显感知,因为画面在那一刻停顿了。
- 降频 / Throttling
- 温度或功耗达到上限后,GPU 主动降低频率保护自身,表现为帧耗时随时间上升。
- ANGLE
- Chrome/Edge 用来把 WebGL 翻译到 Direct3D、Vulkan 或 Metal 的中间层。设备信息里的 ANGLE 后端能帮你确认实际用的是哪块显卡。
- SwiftShader
- CPU 模拟 GPU 的软件实现。出现这个词说明硬件加速没生效,此时的跑分与显卡无关。
- 垂直同步 / VSync
- 渲染结果与显示器刷新对齐,帧率因此被钉在 60/120 等档位上;这也是浏览器跑分必须改用单帧耗时的原因。
- 每帧渲染次数 / passes
- 为了突破垂直同步限制,在同一帧里多次渲染场景;帧间隔除以次数即近似单帧耗时。
- MPix/s
- 每秒完成多少百万像素的着色计算,是本站吞吐的基本单位(再乘以画质成本系数得到跑分)。