Unity粒子特效优化指南:风暴与暴风雪效果的性能调优实战
1. 项目概述当粒子遇上风暴在Unity里做特效尤其是像风暴、暴风雪这种大规模、高密度的自然现象绝对是性能的“试金石”。很多开发者包括我自己在早期项目里都踩过这样的坑场景里放一个看起来很酷的暴风雪远处看还行镜头一拉近或者角色在风雪里跑几步帧率就断崖式下跌手机直接变暖手宝。这背后本质上是粒子系统这个“性能吞噬兽”在不受控制地消耗着GPU和CPU资源。“风暴与暴风雪效果”听起来是一个美术需求但在Unity引擎里它首先是一个技术优化课题。这类效果的核心矛盾在于视觉上需要海量的粒子来模拟雪花、雨滴、尘埃的随机性和覆盖感而性能上又要求我们必须严格控制粒子的数量和计算复杂度。你不能简单地把Max Particles调到10000然后指望它能在移动端流畅运行。因此这个“优化指南”的目标非常明确在有限的性能预算内用一系列“组合拳”策略实现视觉冲击力和运行效率的最佳平衡。它适合所有需要在Unity中实现高质量、高性能粒子特效的开发者无论是独立游戏制作人还是大型团队的技术美术或客户端程序员。接下来我将拆解从设计思路到具体参数调优的全过程分享那些只有真正在项目里“趟过雷”才能积累的经验。2. 核心优化思路与架构设计在动手调参数之前必须先建立正确的优化思维。优化不是简单地把数值调小而是有策略地分配资源、欺骗视觉用最小的代价换取最好的效果。2.1 性能瓶颈分析CPU与GPU的双重压力Unity的粒子系统是一个相对复杂的模块其性能消耗主要分布在两个地方CPU端主线程负责粒子系统的更新逻辑。这包括每一帧计算新粒子的发射、每个存活粒子的运动位置、旋转、速度更新、碰撞检测、触发事件等。粒子数量越多更新逻辑越复杂比如使用Force over Lifetime、Noise等模块CPU的负担就越重。当CPU成为瓶颈时你会看到Profiler中ParticleSystem.Update或相关脚本的耗时很高但GPU可能还很空闲。GPU端负责粒子的渲染。每个粒子本质上是一个或多个面片通常是四边形GPU需要处理这些面片的顶点变换、着色器计算、纹理采样和混合。粒子数量、面片大小、着色器复杂度特别是片段着色器、以及使用的混合模式如Additive、Alpha Blend直接决定了GPU的填充率和带宽压力。GPU瓶颈通常表现为帧时间很长但CPU耗时正常。对于风暴和暴风雪效果其特点是粒子数量极多、生命周期长、覆盖范围广。这往往意味着同时给CPU和GPU带来巨大压力。因此我们的优化策略必须是双向的、分层的。2.2 分层级细节LOD策略远观与近玩这是优化大规模环境特效的黄金法则。核心思想是根据摄像机距离动态调整特效的细节程度。玩家在远处时根本看不清单个雪花的形状和运动细节这时完全可以用更少的粒子、更简单的着色器来模拟“一片白茫茫”的感觉。当摄像机拉近时再逐步提升细节。在Unity中实现粒子系统的LOD通常有几种方式使用多个粒子系统预制体制作高、中、低三个版本的暴风雪粒子系统。通过脚本根据距离动态启用/禁用或替换它们。这是最直接、控制粒度最细的方法。利用粒子系统自身的Emission模块通过脚本动态调整rate over time或bursts参数随着距离增加而减少发射率。调整粒子渲染器远距离时可以降低粒子的Max Particle Size或者切换到一个更简单的、不接收阴影的材质球。一个实用的技巧是不要只做“开/关”两种状态。可以设置多个距离阈值例如0-20米用高清版本复杂噪声运动接收阴影20-50米用中清版本简化运动粒子数减半50米以外用低清版本仅保留基础发射和颜色粒子数降至1/4。这样过渡会更平滑。2.3 视觉欺骗的艺术用纹理和着色器弥补数量我们永远无法用真正“足够多”的粒子去填满整个风暴空间。这时就需要视觉欺骗。使用高质量、带有Alpha通道的序列帧纹理一张好的雪花纹理可以包含多种不同形状、不同透明度的雪花。通过序列帧动画让少量粒子在生命周期内播放这些纹理就能在视觉上创造出雪花种类丰富、变化多样的感觉远比单纯增加粒子数量高效。在着色器中做文章这是高级优化的关键。例如我们可以编写一个自定义的粒子着色器Surface Shader或Unlit Shader实现以下优化软粒子Soft Particles让粒子与场景几何体交叉时边缘平滑过渡避免生硬的穿插这能提升视觉质量让少量粒子与环境的融合更好。屏幕空间抖动Screen-space Dithering在片段着色器中对粒子的Alpha进行基于屏幕坐标的细微抖动可以模拟出比实际粒子密度更高的“噪点”感尤其在运动模糊下效果更佳。利用顶点色和UV动画用一个粒子面片通过顶点色控制不同区域的透明度配合UV滚动可以模拟出一缕风或一片雪花团的效果用一个粒子实现原本需要多个粒子的视觉复杂度。注意自定义着色器虽然强大但引入不当也会成为新的性能瓶颈。务必确保着色器指令数ALU在目标平台的可接受范围内并善用Shader LOD。3. 粒子系统参数精细化调优有了顶层设计我们进入Unity Particle System组件面板对每一个可能“浪费性能”的参数进行精细调整。以下配置以暴风雪为例风暴效果雨、闪电、尘埃原理相通侧重点略有不同。3.1 发射Emission模块控制源头这是控制粒子数量的总闸门。Rate over Time随时间发射率这是主要控制项。不要拍脑袋设一个值。先在目标设备上设定一个你能接受的最低帧率如移动端30帧。在场景中放置你的风暴特效打开Profiler逐步调高发射率直到帧率开始跌破目标线。这个值就是你的性能上限。对于全屏暴风雪在高端手机上这个值可能只在50-100之间在PC上可以到数百。Bursts爆发谨慎使用。风暴是持续效果而非间歇性爆发。除非你要模拟一阵阵的狂风否则尽量不用Bursts因为它会造成粒子数量的瞬时尖峰容易引发帧率波动。实战心得与其用一个超高发射率的单一发射器不如使用多个低发射率的发射器。例如将一个大范围的暴风雪拆分成3-4个较小范围、发射率较低的粒子系统将它们的位置略微错开。这样做有两大好处一是可以更灵活地控制不同区域的密度比如近处密远处疏二是当摄像机移动时可以通过动态启用/禁用远处的发射器来节省性能。3.2 形状Shape模块定义影响范围风暴不是从一个点爆发的它有一个影响体积。Shape类型对于笼罩整个场景的暴风雪Sphere球体或Box盒子是最佳选择。Cone锥形更适合局部风源如从洞口吹出的风。Radius/Scale半径/尺寸这个尺寸不要盲目设得巨大无比。它定义了粒子出生的随机范围。设得太大会导致大量粒子出生在远离摄像机、根本看不见的地方白白浪费性能。一个原则是尺寸略大于摄像机最远需要看到的效果范围即可。可以结合摄像机远裁剪平面Far Clip Plane来设定。技巧使用Box形状时可以将Y轴高度尺寸设得较小而XZ平面地面范围设得较大。这样粒子出生在一个相对扁平的空间里更符合风雪从天而降、在地面附近累积的物理直觉也避免了在无用高空区域生成粒子。3.3 生命周期内Over Lifetime参数让运动更高效粒子出生后的行为是性能消耗的大户。Velocity over Lifetime随时间速度这是制造风感的核心。给一个持续的、主导方向的力如Z轴负方向模拟北风。关键优化点尽量使用恒定值Constant或简单的两个值之间的随机Random Between Two Constants。避免使用复杂的曲线Curve除非必要因为曲线采样需要更多计算。Limit Velocity over Lifetime限制速度强烈建议启用。当粒子受到多种力如速度、噪声力作用时其速度可能变得异常大导致粒子飞快地飞出视野范围生命周期还没结束就看不见了这是极大的浪费。启用此模块设置一个合理的速度上限Speed并选择适当的Dampen阻尼比例可以将“跑飞”的粒子拉回让它们在你的视野内停留更久有效提升粒子的“利用率”。Noise噪声这是让粒子运动看起来自然、随机、有湍流感的关键模块但也是CPU性能杀手。Strength强度从低值开始微弱的风雪扰动可能只需要0.1-0.5。Frequency频率降低频率可以让噪声变化更平滑计算开销更小。对于缓慢飘落的雪0.1-0.3足矣。Scroll Speed滚动速度同样低速滚动如0.1就能产生持续变化的效果。Octaves倍频这是最重要的参数它控制噪声的细节层次。每增加一档计算量几乎翻倍。对于粒子噪声永远从1开始尝试绝大多数情况下1 Octave已经能提供足够好的随机性。只有在极近景特写且性能预算极其充裕时才考虑增加到2。最佳实践先不开Noise把其他所有效果调好。最后像挤牙膏一样一点一点地增加Noise的强度并密切观察Profiler中CPU耗时的变化。找到一个视觉可接受和性能可承受的平衡点。3.4 渲染Renderer模块最终的绘制成本这是GPU开销的最终决定者。渲染模式Billboard广告牌是最省性能的因为所有粒子始终面向摄像机顶点计算简单。对于暴风雪这是默认且最佳选择。Mesh模式仅在你需要渲染特定形状如一片独特的六边形雪花模型时使用但代价高昂。材质Material使用Particles/Standard Unlit或Particles/Standard Surface等Unity内置粒子着色器是性能最优的起点。如果需要自定义务必遵循3.2节提到的着色器优化原则。排序模式Sort ModeYoungest First或Oldest First。对于半透明Alpha Blended的雪花正确的排序对避免渲染错误很重要但这会引入额外的CPU排序开销。如果粒子非常多且小有时使用By Distance按距离或甚至None不排序在视觉上产生的错误并不明显却能节省可观性能。这需要实际测试和取舍。最大粒子大小Max Particle Size限制单个粒子在屏幕上能占据的最大像素比例。防止某个粒子因为距离摄像机过近而变得巨大无比消耗大量填充率。通常设置为0.25-0.5屏幕高度的25%-50%是一个安全范围。4. 高级技巧与实战组合方案掌握了基础参数优化后我们可以通过一些组合方案和高级技巧将效果和性能再提升一个档次。4.1 动静结合背景静态粒子层这是应对开放大世界风暴的利器。思路是将整个风暴效果拆分成“动态层”和“静态/准静态层”。动态层使用一个上述优化过的标准粒子系统负责渲染在摄像机附近、中景区域飘落的雪花。这个层粒子数量可以控制得比较精细。静态层对于远景、或者被物体遮挡的后方大量风雪我们用一个“取巧”的办法。可以创建一个巨大的、半透明的、带有动态风雪纹理的Quad面片或自定义网格将其放置在摄像机前方稍远的位置并让其纹理缓慢滚动或扰动。这个层没有真正的粒子模拟只是一个简单的网格渲染GPU开销极低却能营造出铺天盖地的风雪背景感。在Shader中可以结合场景深度图让这个面片在遇到近处物体时自动淡出避免穿帮。4.2 利用粒子系统的碰撞与触发虽然碰撞检测Collision模块非常耗性能但在风暴效果中我们可以创造性地、低成本地利用它。地面积雪效果不要试图用持续发射的粒子来模拟地面不断累积的厚雪。那会需要海量粒子且难以管理。一个高效的做法是启用一个低发射率、生命周期较长的粒子系统让其粒子缓慢下落。启用Collision模块将Collision Mode设为WorldType设为Planes。你可以添加一个或多个代表地面的碰撞平面。关键设置将Collision的Lifetime Loss生命周期损失设为1Dampen阻尼和Bounce反弹都设为0。同时在Trigger触发模块中添加一个Callback选择Callback类型并关联一个脚本。在脚本的OnParticleTrigger或OnParticleCollision方法中当粒子碰撞到地面时不再销毁粒子而是将其速度设为0并可能的话将其材质切换为一个更静态的“积雪”材质。这样每个落地的粒子就变成了一个静态的“积雪点”。你可以通过脚本控制这些静态点的最大数量并定期清理旧的。这用极少的动态粒子模拟出了持续的积雪累积过程。4.3 性能监控与动态降级没有一劳永逸的优化。必须建立性能监控和动态调整机制。编写性能感知脚本创建一个脚本每秒钟或每几帧检查一次Time.deltaTime帧时间或直接读取Application.targetFrameRate的达成情况。建立质量等级预设好几套粒子系统参数如低、中、高对应不同的发射率、噪声强度等。动态切换当脚本检测到帧率持续低于阈值如28帧超过一定时间如2秒则自动将特效质量降一级。当帧率回升并稳定在较高水平如55帧一段时间后再尝试提升一级。这种动态调整可以确保游戏在各种复杂场景下都能保持流畅。5. 常见问题与排查清单即使按照指南优化实践中还是会遇到各种问题。下面是一个快速排查清单问题现象可能原因排查与解决思路帧率低下Profiler显示CPU耗时高1. 粒子总数 (Max Particles) 过高。2.Emission Rate过高。3.Noise模块强度/倍频过高。4. 使用了复杂的Velocity over Lifetime曲线。5. 粒子更新模式为ParticleSystemUpdateMode.Normal且时间缩放影响大。1. 在Profiler的CPU使用率中找到ParticleSystem.Update或相关脚本看其耗时。2. 逐步降低发射率、最大粒子数。3.首要尝试关闭或大幅降低Noise模块的Octaves和Strength。4. 将复杂的曲线改为常量或两常量随机。5. 考虑将不重要的环境粒子系统设为ParticleSystemUpdateMode.UnscaledTime避免游戏暂停时它们也停止。帧率低下Profiler显示GPU耗时高渲染线程1. 屏幕上同时存在的粒子面片过多Overdraw严重。2. 粒子材质使用了复杂的片段着色器高ALU指令。3. 粒子使用的纹理分辨率过高。4. 渲染模式错误地使用了Mesh而非Billboard。1. 使用Unity的Overdraw视图模式查看屏幕填充情况。2. 在GPU Profiler中查看对应着色器的耗时。3. 降低粒子纹理分辨率如从1024x1024降至512x512。4. 检查并确保使用Billboard渲染模式。5. 尝试在粒子渲染器中启用Occlusion Culling需要设置正确边界。粒子看起来闪烁或排序错乱1. 半透明粒子排序错误。2. 多个粒子系统渲染顺序冲突。3. 着色器中的深度写入ZWrite设置不当。1. 尝试调整粒子渲染器的Sort Mode如从None改为Youngest First。2. 通过调整粒子系统或渲染器组件的Order in Layer或Sorting Layer来明确层级。3. 对于自定义半透明着色器确保ZWrite是OffZTest通常是LEqual。粒子运动不自然像“纸片”或“僵硬”1. 运动力过于单一缺乏随机性。2. 粒子大小和速度缺乏变化。3. 缺少Noise扰动或强度太低。1. 在Start Speed、Start Size上使用Random Between Two Constants。2.谨慎地启用并微调Noise模块从低强度、低频率、1 Octave开始。3. 使用Rotation over Lifetime让粒子缓慢自旋。粒子在特定角度如俯视下突然消失粒子渲染器的Render Alignment设置问题。将Render Alignment从默认的View改为World。这样粒子面片将始终与世界坐标轴对齐而不是摄像机在某些视角下更稳定。但注意这可能会让粒子在看向其边缘时变薄。移动设备上发热严重综合了上述CPU和GPU的高消耗且移动端散热差。1. 实施4.3 节的动态降级方案确保在低端机上自动切换到最低配置。2. 在移动平台上将Graphics Tier设置为较低等级这可能会自动替换为更简单的粒子着色器。3. 终极方案为移动端单独制作一套粒子数更少、纹理更小、完全禁用Noise的特效预制体。最后我想分享一个最深刻的教训优化是一个迭代和权衡的过程。没有“最好”的设置只有“最适合”你当前项目性能目标和目标平台的设置。最好的方法是在目标设备上建立一个固定的性能测试场景每做一次调整就记录下帧率和发热情况。数据比直觉更可靠。当你成功地将一个原本卡顿的全屏暴风雪优化到能在主流手机上流畅运行时那种成就感绝不亚于实现了一个炫酷的新功能。

相关新闻

终极完整指南:CMWTAT Digital Edition Windows数字权利激活工具深度解析

终极完整指南:CMWTAT Digital Edition Windows数字权利激活工具深度解析

终极完整指南:CMWTAT Digital Edition Windows数字权利激活工具深度解析 【免费下载链接】CMWTAT_Digital_Edition CloudMoe Windows 10/11 Activation Toolkit get digital license, the best open source Win 10/11 activator in GitHub. GitHub 上最棒的开源 Win…

2026/10/17 15:40:42 阅读更多 →
程序员究竟该干什么?技术向善,什么才叫做向善

程序员究竟该干什么?技术向善,什么才叫做向善

一、那架还在飞的战机 你见过那个画面吗?人类早就死光了,变成骷髅了,但天空里的战机还在按程序轰炸。无人机还在互相锁定、开火、投弹。地面上什么都没有了,连废墟都懒得炸了,但它们还在飞。因为程序没停。 这不是科幻…

2026/10/17 5:30:09 阅读更多 →
Cocos Creator微信小游戏启动流程全解析与性能优化实战

Cocos Creator微信小游戏启动流程全解析与性能优化实战

1. 项目概述:为什么我们需要深挖启动流程?如果你是一名Cocos Creator开发者,并且你的项目最终目标是发布到微信小游戏平台,那么你大概率遇到过这样的场景:在编辑器里跑得好好的游戏,一发布到微信开发者工具…

2026/10/17 14:16:50 阅读更多 →

最新新闻

Qt界面美化实战:基于JSON主题配置的通用UI架构设计

Qt界面美化实战:基于JSON主题配置的通用UI架构设计

简介:本资源是一套基于Qt开发的高颜值、跨平台通用界面示例工程,面向Qt初学者与中阶开发者,聚焦GUI设计实战,解决传统界面风格单一、适配性差、代码复用率低等常见痛点。压缩包共41个文件(294KB)&#xff0…

2026/10/17 15:42:09 阅读更多 →
OpenStack网络实战:Neutron模型、VXLAN与排错全解析

OpenStack网络实战:Neutron模型、VXLAN与排错全解析

简介:《OpenStack网络实战精讲》是一份面向云计算工程师与网络架构师的PDF电子书,系统讲解Neutron在OpenStack云平台中的核心作用。内容覆盖虚拟网络架构、SDN原理、ML2插件、Open vSwitch、安全组与分布式路由,并延伸至VLAN感知虚拟机、BGP动…

2026/10/17 15:42:09 阅读更多 →
viewer.min.js实现高效图片预览:配置、API与多场景实战指南

viewer.min.js实现高效图片预览:配置、API与多场景实战指南

简介:viewer.min.js 是一款专为前端开发者打造的轻量级图像查看器 JavaScript 库,核心解决网页中高分辨率图片的交互预览需求,支持缩放、旋转、平移、全屏查看等常用操作,并可在 Vue、React 或原生 JS 项目中无缝集成。这份 zip 压…

2026/10/17 15:42:09 阅读更多 →
智能音频播放器组件网页模板:架构设计与状态机实现

智能音频播放器组件网页模板:架构设计与状态机实现

简介:这是一套面向前端开发者与网页设计学习者的智能音频播放器组件网页模板,适用于音乐分享、在线教育、播客等需要嵌入音频播放功能的场景。资源围绕HTML5 audio标签、JavaScript控制与Audio API接口展开,涵盖播放暂停、音量调节、进度控制…

2026/10/17 15:42:09 阅读更多 →
红黑树删除全解析:双黑节点、修复分支与工程实现

红黑树删除全解析:双黑节点、修复分支与工程实现

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

2026/10/17 15:42:09 阅读更多 →
Codex 作为 AI 编程工具,普通人可用 TaoToken 处理哪些日常任务?

Codex 作为 AI 编程工具,普通人可用 TaoToken 处理哪些日常任务?

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

2026/10/17 15:41:08 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/16 14:23:36 阅读更多 →