A2 带宽算不清,采集卡必丢帧:从像素时钟到 PCIe 通道的完整算法
做选型咨询这么多年,我最怕听到的一句话是:“相机标的 30 帧,我买张卡插上,不就能跑满了吗?”
这句话里藏着三个没算过的账:相机端到底能吐多快(取决于像素时钟,不取决于接口)、链路上真正跑的是多少(协议开销会吃掉一成到两成)、主机总线能不能吃得下(PCIe 通道数和代际一错,前面全白算)。这三笔账但凡漏算一笔,结果就是同一个——标称 30 帧,实跑 21 帧,偶尔还掉帧,而且查不出原因。
上一篇(A1)我们解决了"要不要上采集卡"的问题,这一篇解决下一个更硬的问题:上多大的卡、插在几条通道上、配多少缓存。全文给一套可以拿计算器照着敲的完整算法:五步带宽推导、四张速查表、DMA 与缓存的数学、实测三步法,最后用"4 路 500 万像素 30 帧到底选 x4 还是 x8"这个真实选型把公式跑一遍。
📚 本篇目录
- 三个真实翻车现场:带宽算错的代价
- 五步带宽推导:从像素时钟到 PCIe 通道
- 相机侧接口速率速查表
- PCIe 有效吞吐对照表(Gen1~Gen4 × x1/x4/x8)
- DMA、环形缓冲与内存:为什么"带宽够"还是会丢帧
- CPU 与中断:MSI-X、中断合并、NUMA 亲核
- 实测三步法:带宽自检 → 逐帧时间戳 → 丢帧定位
- 实战案例:4 路 500 万像素 30 帧,选 x4 Gen3 还是 x8
- 10 个坑位:都是用返工换来的
- FAQ:算完带宽后最高频的 6 个问题
- A2 速查清单(可截图保存)
一、三个真实翻车现场:带宽算错的代价
先讲三个我亲历或帮人排查过的现场。它们看起来是三个不同的故障,根因其实是同一件事——带宽的账只算了一半。
现场 1:4 路相机插一张卡,实跑只有 21 帧
某锂电项目,4 台 500 万像素相机要求 30 帧连续采集。工程师按"4 × 150 MB/s ≈ 600 MB/s"选型,挑了一张 PCIe Gen3 x4 的卡(理论 3.9 GB/s),觉得富余得很。上线后实测每台只有 21 帧左右,降帧率到 20 帧才稳定。
问题出在哪?他把卡插在了主板的第三条 x16 插槽上——那条槽物理长度是 x16,但电气走线只有 x1,而且是挂在南桥(PCH)下的。实际可用带宽不是 3.9 GB/s,而是985 MB/s × 0.8 ≈ 790 MB/s,再跟 NVMe 硬盘、网卡抢南桥的上行通道,最后留给采集的可能只剩 500 MB/s 出头。600 MB/s 的需求塞进 500 MB/s 的管子,掉帧是必然的。
现场 2:换了更快的卡,帧率一帧没涨
另一个项目,单台高分辨率相机跑不到标称帧率,客户第一反应是"卡不行",换了张更贵的、通道更多的卡,帧率纹丝不动。
因为瓶颈根本不在卡上——在相机端的像素时钟。那台相机在满分辨率下,传感器输出能力本身就被行消隐、帧消隐和像素时钟锁死在 18 帧;换什么卡都不可能跑出 30 帧。想提速只有三条路:降分辨率(ROI / 抽取)、开多 Tap 输出、换更高像素时钟的相机。采集卡只能保证"相机吐出来的数据不丢",它没法让相机吐得更快。
现场 3:白天一切正常,一到夜里就丢帧
最折磨人的是这类:连续跑 8 小时,前 6 小时一切正常,后面开始间歇性丢帧,重启又好了。
排查结论是两个叠加因素:一是杀毒软件的定时全盘扫描抢走了内存带宽和 CPU 时间,主机没能及时取走 DMA 写满的缓冲区,板载缓存扛了几十毫秒之后溢出;二是驱动没开中断合并,每帧一次中断,夜间系统任务一多,中断响应被延迟。带宽是够的,缓存和中断的账没算。
💡 选型提示
判断一个项目会不会掉帧,别只问"带宽够不够"。完整的三问是:**① 相机端吐得出来吗(像素时钟)?② 链路和总线运得走吗(带宽)?③ 主机端接得住吗(缓存 + 中断 + 内存)?**三问全过,才叫算清了。
二、五步带宽推导:从像素时钟到 PCIe 通道
下面这套推导我用了很多年,从相机数据手册一直算到主板插槽,五步走完就能定卡。建议拿计算器跟着敲一遍。
2.1 第一步:像素时钟 → 相机到底能吐多快
相机的"标称帧率"往往是在特定配置下测的(可能是开窗、可能是 8bit、可能是单 Tap)。真正的上限由**像素时钟(Pixel Clock)**和每时钟输出的像素数(Tap 数)决定。
像素率(Pixel/s) = 像素时钟(Hz) × 每时钟输出像素数(Tap) 帧周期 = (行有效像素 + 行消隐) × (帧行数 + 帧消隐) ÷ 像素率 相机最大帧率 = 1 ÷ 帧周期举个具体例子:一台相机像素时钟 80 MHz、单 Tap,分辨率 2448 × 2048,行消隐按 10% 估、帧消隐按 2% 估:
像素率 = 80 MHz × 1 = 80 MPixel/s 每行总像素 = 2448 × 1.1 ≈ 2693 每帧总行数 = 2048 × 1.02 ≈ 2089 每帧总像素 = 2693 × 2089 ≈ 5.62 MPixel 最大帧率 = 80 MPixel/s ÷ 5.62 MPixel ≈ 14.2 fps看明白了吗——这台相机在满分辨率、单 Tap 下物理上限就是 14 帧左右。如果项目要求 30 帧,选型阶段就得换相机或改配置(双 Tap 输出可以把像素率翻倍到 160 MPixel/s,帧率直接翻倍到 28 帧以上)。
⚠️ 避坑提醒
很多"采集卡跑不满帧率"的投诉,第一步就卡在这里:不是卡的锅,是相机端就吐不出来。**选型顺序永远是先算相机、再算链路、最后算卡。**反过来算,一定返工。
2.2 第二步:单帧数据量
单帧字节数 = 宽 × 高 × 每像素字节数 每像素字节数: Mono8 / Bayer8 = 1.0 字节 Mono10 / Mono12 = 2.0 字节(多数按 16bit 对齐存放) Mono10 Packed = 1.25 字节(紧凑打包,需驱动支持) RGB8 / BGR8 = 3.0 字节 RGB10 / RGB12 = 6.0 字节(按 16bit 对齐)500 万像素 Mono8 的单帧数据量:2448 × 2048 × 1 = 5,013,504 字节 ≈ 4.78 MB。注意这里用 MiB 还是 MB 差别不大,工程上按≈ 4.8 MB记就行,误差不会影响选型结论。
2.3 第三步:相机输出带宽
相机输出带宽(MB/s) = 单帧字节数 × 实际帧率接着上面的例子,跑 30 帧:4.78 MB × 30 = 143.4 MB/s。单台 500 万像素 @30fps 的相机,原始图像流就是143 MB/s——这个数字要刻在脑子里,它是后面所有估算的基准单位。千兆网口有效约 110 MB/s,所以单台 500 万 30 帧的相机千兆网根本吃不下一路,这是很多人第一次踩的坑。
2.4 第四步:加协议开销(1.1 ~ 1.25)
链路上传的不只是像素,还有包头、包间隔、校验、重传预留、突发间隙。不同接口的实际开销差别不小:
| 接口 | 典型开销系数 | 说明 |
|---|---|---|
| GigE Vision(1G/10G) | 1.15 ~ 1.25 | 以太网分包 + 包间隔 + 重传预留,包长越小开销越大 |
| USB3 Vision | 1.10 ~ 1.20 | 突发传输 + 主机控制器调度,多设备共享时取上限 |
| Camera Link | 1.02 ~ 1.05 | 几乎裸流,开销很小 |
| CoaxPress | 1.05 ~ 1.10 | 8b/10b 编码已含在链路速率里,额外开销小 |
| 同缆多相机 / 交换机汇聚 | 1.20 ~ 1.30 | 汇聚侧突发最严重,务必再留余量 |
2.5 第五步:换算到总线与 PCIe 有效带宽
链路总需求 = Σ(各相机输出带宽 × 对应开销系数) 所需 PCIe 有效带宽 = 链路总需求 × 1.05 ~ 1.10(DMA 突发与内存写放大) 校验条件:PCIe 有效带宽 × 工程效率系数(0.70 ~ 0.85) ≥ 链路总需求为什么 PCIe 还要再打个折?因为 PCIe 的理论速率是编码前的链路速率,扣掉编码开销(Gen1/Gen2 是 8b/10b,Gen3 及以后是 128b/130b)、事务层包开销、流控和读写切换,实际能持续搬数据的吞吐通常只有理论值的70%~85%。工程估算我一般直接取0.8,保守项目取 0.7。
三、相机侧接口速率速查表
算到链路这一步,需要这张表把"相机接口"翻译成"每秒能跑多少 MB"。表里给的是实际可用值(已扣除编码与协议开销),直接拿来跟相机输出带宽比大小即可。
| 接口 / 规格 | 链路速率 | 实际可用带宽 | 能带几路 500万@30fps(143 MB/s) |
|---|---|---|---|
| 千兆网(1GigE) | 1 Gbps | ≈ 110 MB/s | 不到 1 路(需降帧率或压缩) |
| 2.5G 网口 | 2.5 Gbps | ≈ 280 MB/s | 约 1.9 路 |
| 5G 网口 | 5 Gbps | ≈ 560 MB/s | 约 3.9 路 |
| 万兆网(10GigE) | 10 Gbps | ≈ 1,100 MB/s | 约 7.7 路 |
| USB3(5 Gbps) | 5 Gbps | ≈ 350 MB/s | 约 2.4 路(且多口共享控制器) |
| USB3(10 Gbps) | 10 Gbps | ≈ 800 MB/s | 约 5.6 路 |
| Camera Link Base | 2.04 Gbps | ≈ 255 MB/s | 约 1.7 路 |
| Camera Link Medium | 4.08 Gbps | ≈ 510 MB/s | 约 3.5 路 |
| Camera Link Full / 80bit | 5.44 Gbps | ≈ 680 MB/s | 约 4.7 路 |
| CoaxPress CXP-1(单 lane) | 1.25 Gbps | ≈ 125 MB/s | 约 0.87 路 |
| CoaxPress CXP-3(单 lane) | 3.125 Gbps | ≈ 312 MB/s | 约 2.1 路 |
| CoaxPress CXP-6(单 lane) | 6.25 Gbps | ≈ 625 MB/s | 约 4.3 路 |
| CoaxPress CXP-12(单 lane) | 12.5 Gbps | ≈ 1,250 MB/s | 约 8.7 路 |
| CXP-6 × 4 lane | 25 Gbps | ≈ 2,500 MB/s | 约 17 路(总线会先到瓶颈) |
💡 选型提示
表里"能带几路"是纯带宽视角的理论值,实际还要受相机端像素时钟(第一节)、主机总线、缓存和 CPU 三重限制。永远取四个限制里最小的那个作为最终结果——这就是木桶效应,也是选型里最容易漏的一步。
四、PCIe 有效吞吐对照表(Gen1 ~ Gen4 × x1/x4/x8)
这张表是选卡时最常用的一张,建议直接截图保存。左列是理论值(已扣编码开销),右侧灰字是工程可用值(再乘 0.8,用于最终校验)。
| 代际 / 通道 | x1 | x4 | x8 | x4 工程可用(×0.8) |
|---|---|---|---|---|
| Gen1(2.5 GT/s) | 250 MB/s | 1,000 MB/s | 2,000 MB/s | ≈ 800 MB/s |
| Gen2(5 GT/s) | 500 MB/s | 2,000 MB/s | 4,000 MB/s | ≈ 1,600 MB/s |
| Gen3(8 GT/s) | 985 MB/s | 3,940 MB/s | 7,880 MB/s | ≈ 3,150 MB/s |
| Gen4(16 GT/s) | 1,969 MB/s | 7,877 MB/s | 15,754 MB/s | ≈ 6,300 MB/s |
读这张表有三个必须注意的点:
- 插槽的"物理长度"不等于"电气通道数"。主板上常见的第二条 x16 长槽,电气可能只有 x4 甚至 x1,规格书里会写成 “x16 slot (x4 link)”。插卡之前一定查主板手册的通道分配表。
- 降速是静默发生的。转接卡、延长线、灰尘或金手指接触不良,都可能让链路从 Gen3 掉到 Gen1,带宽直接砍到四分之一,而且系统不会弹任何提示。用工具读当前链路速率(Link Speed / Link Width)是必做项,不能只看"设备管理器里认到了"。
- 通道会被抢。独显、NVMe 硬盘、万兆网卡、第二张采集卡都在抢 CPU 直连的那十几条通道。插满之后,主板会自动拆分或把部分槽切到南桥下,这时候"插在哪个槽"比"买哪张卡"影响更大。
五、DMA、环形缓冲与内存:为什么"带宽够"还是会丢帧
带宽只是第一道关。真正决定"连续跑 24 小时会不会掉帧"的,是主机端的接管能力。
5.1 DMA 描述符与突发:数据是怎么进内存的
采集卡的 DMA 引擎不是一字节一字节地搬,而是按**描述符(Descriptor)组织的:驱动预先在内存里排好一串描述符,每个描述符指向一块物理连续的缓冲区和长度;DMA 引擎按描述符顺序,以突发(Burst)**方式把数据写进去,写完一个就跳到下一个,同时给主机发一个中断通知。
这里的关键是描述符环的大小和物理内存连续性。描述符太少,DMA 会在环末尾空转等待驱动补充;缓冲区不连续,DMA 要切分成更多次突发,效率下降。所以驱动层普遍使用页锁定内存(Pinned / Non-paged Memory)——把缓冲区锁在物理内存里,禁止操作系统换页出去,保证 DMA 随时可写。
5.2 环形缓冲队列:为什么绝不能单缓冲
单缓冲(只有一块内存放图)的死穴在于:主机正在处理第 N 帧时,第 N+1 帧没地方写。要么 DMA 停住(相机端开始堆积、触发被拒),要么覆盖第 N 帧(算法读到半新半旧的图像,出现"错帧")。两种结果都是事故。
正确做法是环形缓冲队列(Ring Buffer):预分配 N 块帧缓冲,DMA 写指针和算法读指针各自向前走,只要算法平均处理速度跟得上采集速度,中间的瞬时卡顿就被 N 块缓冲吸收掉了。
所需缓冲帧数 N ≥ 处理流水线深度 + 抖动吸收量 抖动吸收量 = (可容忍的主机最大卡顿时间 × 数据率) ÷ 单帧字节数算个例子:单帧 4.78 MB,单路数据率 143 MB/s,要求能吸收 100 ms 的主机卡顿:
抖动吸收量 = 0.1 s × 143 MB/s ÷ 4.78 MB ≈ 3 帧 处理流水线深度(采集→预处理→推理→输出,通常 2~4 帧) N ≥ 3 + 3 = 6 帧 → 工程上取 8~16 帧/路 4 路 × 16 帧 × 4.78 MB ≈ 306 MB 常驻内存这就是为什么高带宽采集卡的机器内存不能只配 8 GB:光是图像缓冲就吃掉几百 MB 到几个 GB,再叠加算法模型、系统缓存和日志,16 GB 起步、32 GB 才从容。
5.3 内存带宽:被忽略的第三道关
很多人算完 PCIe 就收工了,忘了数据写进内存之后还要被读出来处理。一次典型的图像流程对内存的读写量是:
- DMA 写入:1 × 数据量
- 算法读取:1 × 数据量
- 预处理(去马赛克 / 格式转换 / 缩放):1 ~ 2 × 数据量
- 中间结果与输出:0.5 ~ 1 × 数据量
合计约3 ~ 5 倍数据量的内存流量。4 路 500 万 30 帧是 574 MB/s 的图像流,乘以 4 就是约 2.3 GB/s 的内存带宽占用。双通道 DDR4-3200 的理论带宽约 51 GB/s,看起来富余,但 CPU、显卡、系统任务都在抢同一条内存总线,实际可用往往只剩一半。路数一多,最先报障的往往不是 PCIe,而是内存带宽和 CPU。
六、CPU 与中断:MSI-X、中断合并、NUMA 亲核
这一节是"同样的卡、同样的带宽,为什么有人跑得稳、有人天天掉帧"的答案。
- MSI-X 中断:相比传统引脚中断,MSI-X 可以给每个队列分配独立中断向量,直接投递到指定 CPU 核,避免多设备共享中断线造成的延迟抖动。选卡时看驱动说明里是否支持,并确认系统里确实启用(设备管理器 / 系统中断分配里能看到)。
- 中断合并(Interrupt Coalescing / Moderation):把"每帧一次中断"改成"每 N 帧或每 X 微秒一次中断",能大幅降低中断风暴带来的 CPU 抖动。代价是延迟增加几十到几百微秒——高帧率场景要合并,低延迟触发场景要谨慎开大,按需调参。
- NUMA 亲核:双路服务器或高端工作站上,CPU 分两个节点、各自挂着本地内存。采集卡插在节点 A 的槽上,算法却跑在节点 B 的核上、用节点 B 的内存,数据就要跨节点互联传输,延迟和带宽都会打折。把算法进程绑到采集卡所属 NUMA 节点的核上(亲核/亲和性设置),是双路平台上收益最大的一步优化。
- 实时优先级与隔离核:对节拍极紧的场景,可以给采集线程提实时优先级,甚至隔离出 1~2 个核专供采集与触发响应,把系统调度抖动的影响降到最低。
⚠️ 避坑提醒
千万别让杀毒软件实时扫描、系统自动更新、远程桌面、录屏软件在生产机上跑。它们不会让带宽变窄,但会制造几十到几百毫秒的主机停顿——正好是板载缓存扛不住的量级。这类"夜里丢帧"的锅,八成在这里。
七、实测三步法:带宽自检 → 逐帧时间戳 → 丢帧定位
公式算完只是纸上推演,上线前必须实测。我用的三步法:
7.1 第一步:带宽自检(验证前五步算得对不对)
- 用采集卡配套的采图工具(或 SDK 示例程序)以目标配置连续采集 10 分钟以上,不做任何图像处理,只做"收 + 丢"。
- 记录三项:实际帧率、实测带宽(工具一般会显示)、链路速率(确认是 Gen3 x4 还是掉到了 Gen1 x1)。
- 实测带宽与理论计算偏差超过 20%,先别怀疑公式,先查链路速率和相机端配置(是否开启了抽取、是否真的跑在目标位深)。
7.2 第二步:逐帧时间戳(看抖动,不看平均值)
给每一帧记录帧序号 + 硬件时间戳,跑满几千帧后做差分统计:平均周期、最大周期、周期标准差(抖动)。平均值达标但抖动很大,说明系统存在间歇性抢占,后面一定会偶发掉帧。
7.3 第三步:丢帧定位(分清是哪一种丢帧)
| 现象 | 大概率根因 | 验证方法 |
|---|---|---|
| 帧序号跳号(1→2→4→5) | 传输/缓存丢帧:主机来不及取,缓冲溢出 | 看驱动统计里的 buffer overflow / dropped 计数是否增长 |
| 序号连续,但图像内容撕裂/半旧半新 | 错帧:缓冲区被提前复用(缓冲帧数太少或读写指针失控) | 减小帧率观察是否消失;增大缓冲帧数 |
| 序号连续,但总帧数比触发次数少 | 相机端丢触发:触发频率超过相机最大帧率(回到 2.1 节) | 对照相机手册的最大帧率,降触发频率验证 |
| CPU 占用率长期 > 85% | 处理瓶颈:不是卡的问题,是算法跑不动 | 停掉算法只采集,若帧率恢复即确认 |
| 只在特定时段/特定操作后掉帧 | 系统抢占:杀毒扫描、备份、更新、远程桌面 | 查系统日志与任务计划,生产机上全部关掉 |
八、实战案例:4 路 500 万像素 30 帧,选 x4 Gen3 还是 x8
把前面的公式完整跑一遍。场景:4 台 500 万像素(2448 × 2048)Mono8 相机,要求 30 fps 连续采集,走 CoaXPress 采集卡。
8.1 按五步推导
① 相机端(假设双 Tap / 像素时钟足够,30 fps 可达)——先确认成立 ② 单帧字节 = 2448 × 2048 × 1 = 5,013,504 B ≈ 4.78 MB ③ 单路带宽 = 4.78 MB × 30 = 143.4 MB/s 四路合计 = 143.4 × 4 = 573.6 MB/s ④ 开销系数(CXP 取 1.08)= 573.6 × 1.08 ≈ 619 MB/s ⑤ 加 DMA 突发系数 1.05 = 619 × 1.05 ≈ 650 MB/s ← 所需 PCIe 有效带宽8.2 三档卡的校验
| 方案 | 工程可用带宽 | 占用率 | 结论 |
|---|---|---|---|
| Gen3 x1(误插到 x1 槽) | 985 × 0.8 ≈ 790 MB/s | 82% | 勉强,突发一来就掉帧 —— 正是"现场 1"的翻车配置 |
| Gen3 x4 | 3,940 × 0.8 ≈ 3,150 MB/s | 21% | ✅ 推荐,留足余量给后续提速与多卡 |
| Gen3 x8 | 7,880 × 0.8 ≈ 6,300 MB/s | 10% | 性能过剩,且 x8 槽位稀缺、主板未必有,不建议 |
**结论:Gen3 x4 完全够用,上 x8 是浪费。**而且要注意——这个项目真正的风险点不在"x4 还是 x8",而在"这个 x4 是真 x4 吗"。必须确认插槽电气通道数、链路没有降速到 Gen1/Gen2。
8.3 如果需求变了呢?两档升级推演
升级 A:位深改 Mono10(按 2 字节存)+ 帧率提到 60 fps 单帧 = 2448 × 2048 × 2 = 9.56 MB 单路 = 9.56 × 60 = 573.6 MB/s;四路 = 2,294 MB/s × 1.08 × 1.05 ≈ 2,601 MB/s → Gen3 x4(3,150 MB/s 可用)占用 83%,已属临界,建议 Gen3 x8 或拆两张 x4 卡 → Gen4 x4(6,300 MB/s 可用)占用 41%,更从容 升级 B:4 路升到 8 路同规格(500万 Mono8 @30fps) 总需求 ≈ 1,300 MB/s → Gen3 x4 仍可(占用 41%),但中断、内存、散热压力翻倍 → 更推荐两张 x4 卡分摊(见 A3 篇的"一张卡多路 vs 多张卡拆分")💡 选型提示
选型心法:**不要按"刚好够"选,也不要按"越大越好"选,按"占用率 30%~50%"选。**低于 30% 说明买贵了,高于 60% 说明后续没有提速余量,高于 80% 就等着现场掉帧吧。
九、10 个坑位:都是用返工换来的
坑 1:插槽物理 x16、电气 x4(甚至 x1)
最常见的翻车点。查主板手册的通道分配表,不要看槽有多长。有条件就用工具读链路宽度确认。
坑 2:被独显抢走通道
插了独显之后,CPU 直连通道被拆分成 x8 + x8,采集卡只能拿到被拆分后的部分。做视觉推理的机器要提前规划:卡插 CPU 直连槽,显卡按需降级或改用计算卡。
坑 3:链路静默降速到 Gen1
延长线、转接卡、金手指氧化都会导致降速,而且没有任何提示。上线前必查 Link Speed / Link Width,并写进验收单。
坑 4:M.2 固态与采集卡抢通道
很多主板的第二条 M.2 与某个 PCIe 槽共享通道,插上固态后采集卡从 x4 变 x2。装机清单里要逐条核对共享关系。
坑 5:内存带宽瓶颈先于 PCIe 到来
3~5 倍数据量的内存读写放大,路数一多最先卡的是内存。内存容量和通道数都要留余量(双通道起步,四通道更好)。
坑 6:BIOS 设置没开
Above 4G Decoding、Resizable BAR、VT-d(若要用直通)等选项没开,可能导致卡识别不到或缓冲区分配失败。装机流程里固定加一步"BIOS 检查项"。
坑 7:只看相机端帧率,不看主机端收到多少帧
相机在自拍,主机在丢帧——两边统计对不上是常态。以主机端成功收到的完整帧数为准,这是唯一真实的产能指标。
坑 8:缓冲帧数按默认值,从不算
默认 3 帧在空载时没事,一有系统卡顿就溢出。按 5.2 的公式算,再乘 1.5 倍余量。
坑 9:算带宽时忘了"同时性"
多台相机用同一个触发器,会在同一毫秒一起爆发。平均带宽够不代表瞬时扛得住——突发场景要在平均值上再乘 1.2~1.5。
坑 10:把"实测 10 分钟"当成验收
10 分钟跑通不代表 8 小时稳定。验收至少要覆盖一次完整的换班/批处理周期,并开启系统日志监控。夜间丢帧的坑,白天永远测不出来。
十、FAQ:算完带宽后最高频的 6 个问题
Q1:带宽占用率算出来 90%,能上线吗?
不建议。90% 意味着任何一点系统抖动、任何一次突发都会掉帧。要么加通道(x4 → x8 或换 Gen4),要么拆成两张卡分摊,要么降低相机端的实际流量(降帧率、开 ROI、开抽取、改位深)。生产系统请按 30%~50% 占用率设计。
Q2:为什么我换了更快的卡,帧率一点没涨?
九成是卡在了相机端:像素时钟 + Tap 数 + 消隐决定了相机物理上限。回看 2.1 节把相机最大帧率先算出来,如果上限本身就低于需求,换卡无用,只能改分辨率、开多 Tap 或换相机。
Q3:Gen4 的卡插在 Gen3 的槽上能用吗?能用多少?
能用,PCIe 向下兼容,但会按 Gen3 的速率跑——带宽直接减半。反过来 Gen3 的卡插 Gen4 槽,也只有 Gen3 的速度。链路速率取两端较低者,这是硬规则。
Q4:多张采集卡,通道数怎么分才合理?
先看每卡的实际需求,再按"占用率 30%~50%"分配。原则是优先保证每张卡都插在 CPU 直连槽上,避免把卡挂到南桥(PCH)下与硬盘、网卡抢上行带宽。两张 x4 通常比一张 x8 更容易插好,也更利于中断分摊——这个话题 A3 篇会展开讲。
Q5:板载缓存越大越好吗?
不是。板载缓存是抗抖动的保险,不是提速手段。它的作用是吸收主机几十毫秒级的停顿,典型容量能扛几十到几百毫秒的流量就够了。缓存过大则成本上升、且掩盖了本该暴露的系统卡顿问题。先用缓存扛住抖动,再回头把系统卡顿的根因消掉(关杀毒、隔离核、提优先级)。
Q6:我算出来的数跟厂商手册对不上,谁错了?
先检查四个常见差异:① 单位(MB/s 与 MiB/s、Gbps 与 GB/s 混用);② 是否扣了编码开销(8b/10b 或 128b/130b);③ 位深是否按对齐后的字节数算(Mono10 常按 2 字节存);④ 是否含消隐(相机端帧率算消隐,链路带宽不含)。把这四个对齐,两边通常能对上。
十一、A2 速查清单(可截图保存)
✅ 带宽与总线选型 12 项
- ☐ 已按像素时钟 × Tap 算出相机端最大帧率(不是查标称值)
- ☐ 已算清单帧字节数(注意位深对齐:Mono10 通常按 2 字节)
- ☐ 已按 单帧 × 帧率 算出每台相机的输出带宽
- ☐ 已按接口类型乘上开销系数(GigE 1.15~1.25 / USB3 1.1~1.2 / CXP 1.05~1.1 / CL 1.02~1.05)
- ☐ 多相机同时触发已额外乘 1.2~1.5 突发系数
- ☐ 已用 PCIe 对照表校验,并乘了 0.7~0.85 工程效率系数
- ☐ 占用率落在 30%~50% 区间(<30% 买贵了,>60% 没余量,>80% 必掉帧)
- ☐ 已查主板手册确认插槽电气通道数(非物理长度)
- ☐ 上线前已用工具确认 Link Speed / Link Width 未降速
- ☐ 已按公式算出缓冲帧数(抖动吸收 + 流水线深度),并配足内存
- ☐ 已完成实测三步法:带宽自检 / 逐帧时间戳 / 丢帧定位
- ☐ 验收跑满一个完整生产周期(含夜间),系统日志无异常
写在最后
采集卡选型里有个反直觉的事实:**大部分"卡的故障",其实都是账没算清。**相机端的账(像素时钟)、链路的账(协议开销)、总线的账(通道与代际)、主机的账(缓存、中断、内存)——四本账记全了,卡的选择会自己浮出来。
下一篇(A3)我们往系统层面再进一步:多相机场景下一张卡多路还是多张卡拆分、触发体系怎么搭、行同步与编码器怎么接、上线后八大故障怎么排。那篇是落地篇,这篇是它的算术基础——先把这篇的公式保存到你的选型笔记里。
← 上一篇:A1 工业相机一定要上采集卡吗?一张图讲清它在视觉系统里的位置
下一篇:A3 多相机 + 采集卡:同步、触发与缓存的工程落地 →