news 2026/10/20 1:06:57

AI芯片低功耗设计全解析:从功耗原理到工程落地

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
AI芯片低功耗设计全解析:从功耗原理到工程落地

1. 为什么“功耗”成了AI芯片的头号天敌

这些年我做AI相关的开发,从云端服务器到边缘设备都折腾过不少,一个特别直观的感受是:AI芯片的功耗瓶颈,正在从“能用”变成“敢用”的边界问题。你看现在大模型卷得厉害,动不动就是几千亿参数,算力需求一路暴涨,可一到端侧、移动设备、嵌入式场景,功耗这堵墙马上就立起来了——性能再好看,功耗压不住,照样没法定制、没法量产、没法真实落地。

低功耗突破这个词,在业内已经喊了几年,但真正值得展开讲的东西,其实不只是某一个神奇电路,而是一门“如何在算力、功耗、时延之间做系统权衡”的工程学问。这里头有芯片架构上的选择,有软件工具链的配合,还有算法侧的稀疏化、量化、蒸馏这些手段的兜底。老实说,我自己刚开始接触低功耗AI芯片时,也以为就是把电压往低压一调完事,后来踩了不少坑才明白,这事情远比想象中立体得多。

这篇文章,我不打算给你堆一堆“功耗降了80%”之类的营销口径,而是想从工程实操的角度,拆解AI芯片低功耗技术的底层逻辑:功耗到底是怎么产生的,业界主流靠什么手段去压功耗,以及你在做边缘AI项目或选型芯片时,有哪些容易被忽略的经验要点。无论你是刚开始接触嵌入式AI的开发者,还是正在评估端侧推理方案的工程师,这篇文章应该都能给你一些靠谱的参考。

我个人有一个体会先放在这里:低功耗设计从来不是某一颗芯片的孤军奋战,而是算法、软件、硬件三条线一起收敛的结果,理解了这一点,后面讲技术点你就不容易迷路。

2. AI芯片功耗的核心来源:别只盯着“算力”看

2.1 功耗从哪里来:动态功耗与静态功耗

要理解低功耗突破,得先搞清楚AI芯片里的功耗到底消耗在哪些环节。我用一句大白话来总结:AI芯片的功耗,无非是“干活时烧电”和“闲着也烧电”两大类。

“干活时烧电”对应的是动态功耗,它和芯片内部晶体管的翻转频率直接相关。你跑一次神经网络推理,成千上万个乘法器、累加器在同步翻转,时钟一跑,功耗指标就蹭蹭往上走。公式上,动态功耗大致正比于电容、电压的平方和频率的乘积。这个公式看着简单,含义却很深刻——电压一旦降下来,功耗下降是指数级的,所以所有做低功耗的芯片,第一反应都是往电压上做文章。

“闲着也烧电”对应的是静态功耗,这个就纯粹是漏电电流在作怪。工艺越先进,晶体管尺寸越小,漏电反而越明显。芯片什么都不干,只要你给它通了电,它就在悄悄耗能。对于那种经常处于待机状态、偶尔才被唤醒的设备,静态功耗往往比动态功耗更让人头疼。

这里要特别提醒一点:很多人喜欢拿峰值功耗说事,但在实际项目里,真正决定你的电源方案、散热方案甚至电池续航的,其实是平均功耗和典型工作负载下的功耗曲线。只看峰值,会被带偏方向。

2.2 性能与功耗的矛盾:算力越高,发热越大

性能与功耗的矛盾,本质上是个物理问题。AI计算本质上是大量乘加运算的堆叠,算力上去了,单位时间内完成的运算多了,能量消耗自然水涨船高。你可能觉得这是废话,但在工程场景中,这个矛盾会被放大得特别明显。

我举个例子,一台数据中心里的高性能推理卡,功耗能做到几百瓦级别,这放在数据中心里有专门的液冷和供电系统兜底,那都不是事。可同样的算力需求,挪到一台手持设备或者无人机上,你的整机预算可能就几十瓦甚至几瓦,这时候你根本不敢让芯片持续满血输出,只能把它的频率往下压、把能跑的任务分段调度。

这就是为什么这几年大家都在讲“算力与能效的平衡点”——不是追求极致算力,而是在给定功耗预算内,尽可能压榨出更多的有效推理帧率或吞吐量。做AI芯片低功耗,本质上是在帮系统把每一瓦功耗都转换成有效算力,尽量减少空转、等待和无效计算。

2.3 从系统视角看功耗瓶颈:芯片、内存、散热一个都跑不掉

芯片本身只是功耗链条上的一环,真实系统里,内存、散热、供电这些外围环节,往往比芯片还容易成为瓶颈。我之前做边缘部署的时候,踩过一个很典型的坑:芯片标称功耗挺漂亮,但配了个低效率的DC-DC电源模块,加上DDR内存持续高频刷新,整体功耗直接比芯片裸片翻了一倍还多。

内存功耗在AI推理中占比相当高,尤其是大模型场景下,权重参数要不断地从DRAM搬到计算单元。业内有个近似说法,做一次浮点运算的能量,和从片外内存搬一个数据比,开销差了一两个数量级,真正烧电的往往不是“算”,而是“搬”。这也是为什么几乎所有低功耗AI芯片都在拼命做片上缓存、数据重用和数据压缩。

散热也一样。功耗和散热是耦合的,功耗降不下来,温度就上去,温度一高,漏电又变大,静态功耗进一步抬升——妥妥的正反馈恶性循环。所以低功耗不仅是省电问题,也是温控问题。很多时候降低功耗不是为了省那几度电,而是为了让芯片能在密闭无风扇的环境里稳定工作不降频。

3. 低功耗突破的三大主流方向:电压、架构、算法协同

3.1 近阈值电压计算:把电压压到临界区

前面提到过,动态功耗和电压平方成正比,所以降电压永远是最直接的手段。以前的芯片给核心供电动辄0.8V、0.9V,现在很多低功耗AI芯片直接往0.4V~0.6V这个区间冲,这就叫近阈值电压计算。所谓“阈值电压”,就是晶体管开始导通的那个临界电压点。把工作电压压到接近阈值,功耗能大幅降低,但代价是性能也会明显下滑,时序收敛难度陡增。

这里要说一个工程上特别实际的问题:近阈值电压下,芯片对工艺偏差变得极其敏感。同一片晶圆上,不同位置的晶体管阈值电压可能有偏差,低压下这种偏差被放大,导致不同芯片跑同一个频率,有的能稳跑,有的直接时序违规。所以做近阈值芯片,往往要给芯片加体偏压校准、片上电压调节器、甚至自适应时钟树,这一套设计复杂度翻倍。

我自己并不建议普通开发者预期“换一颗近阈值芯片就能直接跑原来的模型”,因为软件侧也要配合:要把任务切得更碎,用好异步调度,避免出现瞬时功耗尖峰。低压芯片最怕的,就是那种“等一下我突然满载”的负载模式,分分钟触发电压塌陷。

业界典型的做法,是让芯片在低电压区运行在较低频率,配合大量并行处理单元,用“广度换速度”——频率降了,但并行度提上去,总吞吐不掉链子。这也是很多端侧AI加速芯片的通用套路。

3.2 数据流优化与片上存储:少搬数据比少算账更重要

这个点我想多说两句,因为它是很多人理解低功耗AI芯片时最大的盲区。你去看AI芯片的架构框图,里面最大面积往往不是计算单元,而是SRAM缓存和NoC总线——为什么?因为数据搬运的成本太高了,厂商宁愿把面积砸在缓存上,也要减少对外部DRAM的访问次数。

以卷积神经网络为例,如果卷积核权重反复从内存加载,每一层计算都要产生海量的内存访问。而如果你能在片上把输入特征图分块缓存好,让数据在缓存里被反复重用,功耗下降就是肉眼可见的。做AI芯片架构设计的很多人,核心工作就是在“调度数据怎么移动”,而不是“把乘法器做得更快”。

按数据流方向划分,目前主流的有三类:权值固定、输出固定和行游走。你说这概念听着抽象,但实际用大白话说,就是决定“计算过程中,哪个数据待在原地不动,哪个数据被挪来挪去”。不同的数据流适合不同的网络结构,比如全连接层和卷积层的最优数据流就不一样。所以在选型芯片时,我会比较关注这个加速器对主流网络结构的数据流适配情况,如果它只对某一类网络优化得很极致,换一个网络结构它的功耗表现可能就大打折扣。

3.3 稀疏化与模型压缩:从算法侧减轻硬件负担

再往上层看,低功耗不只有硬件的事。神经网络里大量权重其实接近零,激活值也有不少冗余,把这些冗余去掉,计算量就能砍掉一大截,功耗自然跟着降。这背后的道理很直白:不做的计算,才是最省电的计算。

稀疏化的落地方式,一般是在训练时做剪枝,把低于阈值的权重直接剪掉,再用重训练把精度拉回来。剪枝后的模型变成稀疏矩阵,但CPU和通用GPU跑稀疏矩阵的加速比非常有限,倒是很多AI芯片里专门做了“跳跃计算”逻辑或者稀疏感知处理单元,真正能让“零不参与计算”变成现实。这是软硬件协同设计的典型范例。

量化则是另一条更成熟的路子。把FP32的权重和激活压缩成INT8甚至INT4,内存带宽需求降到原来的四分之一甚至八分之一,对应的功耗减少非常可观。而INT8量化对精度的影响,在大多数推理任务里几乎可以忽略不计,这也是为什么边缘AI芯片清一色标配INT8算力,IC设计公司做的AI加速IP也都在往低比特方向加码。

我在做项目验证时,通常第一步做的不是换芯片、调电源,而是先把算法模型的体积压一压,量化、剪枝、蒸馏一并上了之后,再看功耗曲线,经常发现还没动硬件,功耗就已经降了不少。这也印证了前面那句话:低功耗是算法、软件、硬件一起配合出来的系统工程。

3.4 动态电压频率调节与功耗管理:让芯片学会“见菜下饭”

除了芯片本身的设计手段,还有一个特别实用、基本所有商用AI芯片都支持的能力——动态电压频率调节,也就是DVFS。这玩意儿说白一点,就是让芯片在跑简单任务时自动降低频率和电压,在跑复杂任务时再把性能拉满。

不过DVFS用起来是要动脑子的。如果你调度的策略太死板——比如只要一有任务就切到最高频——那DVFS基本就是个摆设,功耗降不下来。比较好的做法是结合任务队列的深度、帧率的目标、时延的容忍度,做一个小型的功耗调度器。譬如一个视觉检测任务,如果期望帧率只要15 FPS,那芯片根本不需要跑到最高频率,调到25 FPS左右的档位就够了,此时功耗可能能省下40%以上。

这让我想起一个朋友在嵌入式设备上的调优案例:他们用某款端侧AI芯片做人形检测,功耗和散热要求都很严格。一开始芯片中负载跑得发热明显,后来把模型从FP32量化到INT8,再去调整DVFS策略选择了一个“够用就好”的频率档位,最终功耗下降了大约六成,而检测帧率只损失了不到两成,效果立竿见影。这个案例说明,很多时候低功耗的潜力在系统侧,而不在芯片侧。

所以做低功耗项目,不要执着于“我的芯片功耗数字是多少”,要关心“我的系统在典型负载下的功耗曲线是多少”。前者是芯片的原生属性,后者才是你能真正优化出来的空间。

4. 从选型到部署:一套可复用的低功耗AI实践路径

4.1 你需要关注的关键芯片参数

很多开发者在选型AI芯片时,第一反应是看“TOPS算力”,也就是每秒万亿次操作。这个参数确实是重要参考,但我建议你同时关注另外几个指标,它们对低功耗落地的影响甚至更大。

第一个是能效比,单位是TOPS/W。这个参数直接告诉你每瓦功耗能换来多少算力,在低功耗场景里,它的优先级应该高于绝对算力。举个例子,A芯片算力20 TOPS但功耗10W,能效比只有2;B芯片算力8 TOPS但功耗只要1W,能效比是8。如果系统预算只给2W,A芯片根本跑不起来,B芯片反而有余力。所以别被大数字冲昏头脑。

第二个是典型功耗和峰值功耗的差距。有些芯片峰值功耗标得很高,但典型功耗非常低,这种芯片在突发任务时可能需要额外电源余量,但你平均功耗很好看。反过来,有些芯片峰值和典型差距很小,说明它整个工作区间里都烧电。放在终端产品里,前者在待机场景下优势巨大,后者在持续满载场景下反而简单粗暴。

第三个是内存通道数和位宽。前面说了数据搬运是功耗大头,芯片外部接口带宽丰富,意味着权重喂到计算单元的速度更快,计算单元空转等待的时间更短,整体有效功耗更低。

4.2 功耗评估的正确步骤:别被规格书里的数字忽悠

假设你手里有一颗AI芯片的规格书,标称功耗和能效比都非常漂亮。但我要提醒你,规格书里的数字往往是在特定条件下测出来的——比如特定网络结构、特定批大小、特定频率、特定温度。你直接拿它预估自己的项目,十有八九要踩坑。

我习惯的做法,是先做一轮芯片实测评估,步骤大概是这样的:

  1. 先把芯片厂商的SDK跑通,确认推理接口和模型转换工具链没问题。
  2. 选一个和目标场景相近的模型,跑一批不同batch size和输入分辨率下的功耗采样。
  3. 用功率分析仪或高精度电流探头记录长时间运行的功耗曲线,观察“瞬时尖峰”和“平均功耗”。
  4. 把结果和规格书对比,算出差距,然后根据差距做散热和供电的设计冗余。

这套流程看着繁琐,但价值很大。我在实际项目里见过不止一次,规格书上标平均功耗3W,实测能到5W以上,如果前期没有实测做预留,整机散热方案做薄了,后期量产就等着返工吧。

4.3 软件工具链和模型优化流程

工具链这一块,我要单独拎出来说,因为它的重要程度被普遍低估了。一台好的AI芯片,性能上限能发挥到什么程度,跟软件SDK的关系太大了,低功耗项目的软件工具链尤其如此。

当前很多边缘AI芯片厂商都提供模型转换、量化校准、编译部署的全套工具。你在做模型移植时,有几个关键开关一定要把握好:一是量化方式,尽量用感知量化或者混合精度量化,而不是简单的训练后量化,后者在低比特下掉点严重;二是批处理大小,有些加速器在小batch下效率极高,但batch一大功耗和时延变化就非线性了,需要实测找出甜点;三是内存复用策略,好的编译器会主动安排中间激活值的生命周期,减少缓存溢出和内存拷贝。

我个人的经验是,在花大精力调整DVFS策略之前,先把模型层面能压的空间压完。模型量化到INT8、剪枝掉冗余参数、能蒸馏就蒸馏,这一套组合拳下来,推理精度几乎不掉,但功耗和时延往往有立竿见影的效果。模型侧拿到结果了,再去调硬件侧的电压频率档位,这样每一步的收益都看得见摸得着,不至于做半天不知道优化到哪里去了。

另外,为了保证完整性,我还想提一下“模型蒸馏”。蒸馏的思路,是用一个大模型的输出作为软标签,去训练一个小模型,让小模型在参数量小一个量级的情况下,尽可能逼近大模型的表达力。这和量化、剪枝不冲突,可以叠加使用。我见过一些团队在高功耗预算压力下,用蒸馏配合量化,硬是把原本跑不动的模型塞进了低功耗芯片里,精度还维持在可以接受的范围。这是一条高性价比的路线,尤其在算法团队实力强、硬件算力资源紧张的项目里特别值得优先考虑,因为它做的数学工作都在训练阶段完成,推理侧几乎零额外成本。

4.4 低功耗部署的几个工程细节

部署阶段还有一些不太起眼但很要命的细节。比如上电顺序。很多AI芯片有多路电源轨,CPU核、NPU核、IO、DDR各自独立供电,上电顺序不对,轻则芯片不启动,重则损坏器件。低功耗芯片因为电压低、电流小,对电源时序更加敏感,这里一定要严格照着参考设计来。

散热设计也值得多说一句。低压低功耗芯片感觉上不需要什么散热,但实际未必——你的设备如果是密闭塑料外壳,哪怕芯片平均功耗只有1W,热点也可能非常集中。我之前调试过一个摄像头产品,芯片标称功耗1.5W,装在塑料壳子里持续跑AI识别,外壳温度直接飙到60多度,后面加了导热垫才压下来。低功耗不等于免散热,热点管理同样要做扎实。

5. 实测场景复盘:一个低功耗视觉检测项目的完整记录

5.1 项目背景与选型对比

为了让你对上面这些理论有更落地的感知,我分享一个自己参与的模拟项目X的完整复盘。项目要求是做一个便携式的工业视觉检测设备,用于识别产线上的缺陷工件。设备只能用电池供电,整机功耗预算压得很死,AI部分只能分到1.5W左右,同时要求检测帧率不低于8 FPS,检测精度不能低于95%。

一开始我们评估了几种方案:通用MCU加轻量模型、带NPU加速的低功耗SoC、以及FPGA方案。结果对比很明显:

  • 通用MCU功耗确实低,但算力太过有限,跑轻量模型也只能勉强跑到2-3 FPS,远不够用。
  • FPGA方案灵活性强,但功耗和成本都偏高,而且开发周期长,排期上吃紧。
  • 带NPU的低功耗SoC方案,能效比最高,配套工具链成熟,成为最终选择。

选型对比表我列一下,供你参考:

方案算力表现整机AI功耗开发周期结论
通用MCU2-3 FPS0.3W短算力不足,放弃
FPGA高5W+长功耗超标,放弃
NPU SoC8-12 FPS1.2W中平衡最佳,选中

5.2 模型优化与量化细节

设备定下来之后,算法的优化工作是重头戏。我们原来跑的是一个检测模型,精度好,但参数和计算量都偏大,直接在NPU上推理,帧率只有3-4 FPS,功耗倒是没超,但时延完全没法接受。

模型侧我们做了三步:第一步是做通道剪枝,把不重要的特征图通道剪掉,计算量压缩了约五分之二;第二步是蒸馏,用大模型做教师网络给小模型“补课”,把精度拉回到剪枝前的96%以上;第三步是感知量化训练,把权重和激活从FP32压到INT8,权重文件直接缩到四分之一。

这三步走完,模型计算量大约只剩下原来的四成,NPU推理帧率提升到了9 FPS左右,精度维持在95%以上。功耗反而从1.2W降到了0.9W,因为单位任务的计算量变小,芯片完成任务后有了更多低功耗待机时间。

这里顺便提醒一下,感知量化训练比想象中更容易掉坑。最典型的坑就是:训练时量化和推理时量化的方式不一致,导致导出模型之后精度崩掉。解决方法是训练和推理共用同一套量化伪算子逻辑,并且在校准数据集的选择下功夫——校准集一定要贴近真实业务数据的分布,用一张通用数据集做校准,部署到实际场景里往往精度损失比预期大,这点我吃过亏。

5.3 DVFS策略调试与最终效果

硬件侧我们花了比较多时间在DVFS策略上。NPU支持多个频率档位,从低到高跨了好几个区间。一开始我们天真地想,直接把频率设到最高档,反正功耗预算内。实测发现,最高档下瞬时功耗尖峰非常吓人,电池电压会被拉低,系统偶尔出现莫名其妙的芯片复位。

后面改成动态调度策略:检测空闲时,NPU降频进入低功耗状态;检测任务到来时,先以中频档启动,检测到目标后再拉到高频档做精确识别。整个调度策略实现下来,平均功耗降到了0.8W左右,瞬时尖峰被控制住,系统再没出现复位问题。

这个案例我最想分享的心得是:低功耗项目的成功与否,不止取决于芯片选型和模型优化,还取决于你把功耗曲线打磨得是否平滑。平滑的功耗意味着电源子系统和散热子系统都不会被“暗算”,产品的稳定性和寿命才有保障。

6. 避坑经验与工程习惯清单

6.1 容易被忽视的工具链与实测陷阱

工具链这块的坑,我列几个典型的给你提个醒。一是编译器版本不一致导致算子调度差异很大,换一个SDK版本,帧率和功耗都可能出现明显波动,所以项目一旦定型就别频繁升级工具链。二是低功耗芯片在调试状态下功耗会虚高,因为调试接口和日志输出本身就在额外耗电,量产固件要记得把调试通道关干净。三是供电测量不能只测平均电流,要用示波器抓瞬态电流波形,否则你会错过那些看不见的电压跌落和电流毛刺。

6.2 稳定性优先:功耗、温度、模型的三角平衡

从项目管理的角度看,低功耗AI项目最容易犯的错误,是孤立地把“功耗”当成唯一KPI,结果把温度、时延甚至模型精度都给带崩了。功耗降了,可能只是因为你关闭了某些加速特性,或者偷偷减了帧率——这种“假降耗”根本没有意义。

我习惯的做法是,每次调整都用一个固定的测试基准来验证:同一段输入数据、同样的环境温度、跑足30分钟记录平均功耗、帧率、精度和温度。所有优化动作都按这个基准做前后对比,确保每次改动都是正向的。这套基准看上去笨,但在长周期项目中能省下大量排查问题的时间——因为你永远知道谁动了什么维度。

6.3 值得关注的后续演进方向

讲完已经成熟的技术,再聊聊行业里正在酝酿的几个方向,这些方向不在乎你能不能立刻用上,但能帮助你在未来选型和项目预研时更有方向感。

一个是存内计算,把计算放进存储阵列里,减少数据搬运,理论上能把AI推理功耗压到一个非常低的量级,但目前还受限于精度和工艺成熟度。另一个是自适应电压调节与片上AI功耗管理结合,由芯片自己判断负载类型,动态微调电压档位,把DVFS从“策略表”进化成“实时决策”。还有就是超低比特量化,从INT4走向INT2乃至二值化网络,这在部分特定任务上已经能兼顾功耗和精度,未来潜力可观。

作为从业者,我的态度是:技术演进往往会比我们预期的慢,但方向已经足够清晰——低功耗AI不再是一个“补充选项”,而是越来越多场景里的硬约束。能在功耗约束下做出好产品的团队,在未来几年会非常吃香。

我个人在实际操作中的体会是,低功耗项目最考验的不是某一项单点技术,而是工程综合能力——算法懂压缩、硬件懂电源、软件懂调度,缺一样都会在量产阶段被反噬。最后再分享一个小技巧:无论你用什么芯片,一开始就把模型的原始版本、优化后版本、推理结果比对脚本全部存档,后面调功耗、调精度、排查问题时,你会感谢当初这个懒习惯。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/20 1:06:52

ESP32-S3 + Arduino 实战:从点灯到轻量 AI 视觉应用

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/20 1:06:37

ESP32轻量作物模型开发实战:边缘计算赋能智慧农业

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/20 1:06:12

GCC多文件编译与工程化实践:从单文件到增量构建

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/20 1:06:02

TinyML入门实战:从零在MCU上部署关键词唤醒模型

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/20 1:05:01

锂电池测试设备控制方案选型:PMC600运动控制器实现多通道高同步

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/20 1:05:01

FFmpeg实战:用ARM盒子实现5路RTMP推流全攻略

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华