iOS卡顿归因路径图:从用户感知到函数级优化实战
简介本资源是阿里云技术团队出品的《手淘iOS性能优化探索》深度实践文档面向中高级iOS开发者、性能优化工程师及移动架构师聚焦启动慢、页面卡顿、API低效等线上高频性能顽疾。文档系统阐述了App启动器设计含服务端可配、并发串行任务管理、多线程锁与NSCoding镜像化等代码级优化、集成数据卡口load函数耗时统计、C静态构造监控等API治理手段以及无痕SDK对启动耗时、FPS、内存等指标的全链路监控方案。资源为单文件PDF共1个13.83MB高清技术文档内容涵盖问题定位、架构沉淀、实验数据与落地效果对比图结构完整、方法论扎实。目前已有248人学习下载适合希望借鉴头部App实战经验、构建可度量可管控iOS性能体系的工程师系统研读与工程复用。1. 藏经阁-手淘iOS性能优化探索这不是一份PPT而是一线团队在真机上反复压测、回滚、再压测后沉淀下来的「卡顿归因路径图」“藏经阁”不是某个神秘代码仓库而是某电商App iOS客户端内部对核心链路性能治理知识库的代称——它不讲大道理只记录“哪个页面滑动掉帧、在哪台iPhone上复现、改哪行代码后FPS从42升到58、为什么Instrument里看不到这个耗时但用户就是觉得卡”。这份PDF标题里的“手淘iOS性能优化探索”本质是把过去三年中几十次线上卡顿事故的根因分析、实验数据、AB验证结果压缩成一套可检索、可复用、可传承的诊断手册。它面向的不是刚学完UIKit的新手而是已经能写出完整VC、但面对“首页Tab切换偶发白屏”“搜索结果页下拉卡顿”“订单页提交按钮点击无响应”这类问题仍需靠玄学重启Xcode的中级iOS工程师。如果你正被“测试说卡、监控没报、Instruments抓不到热点、用户截图只有模糊的半帧画面”折磨这份材料不是答案但它会告诉你下一步该看什么、不该看什么、看错了会浪费你多少小时。2. 从「感知卡顿」到「定位函数」建立iOS性能问题的三层归因模型iOS性能问题常被笼统归为“卡”但真实场景中“卡”的物理表现、触发条件、影响范围差异极大。直接跳进Time Profiler或Core Animation调试器90%的情况会陷入“热点函数很多但改了没用”的困局。我们按用户可感知现象 → 系统级指标异常 → 代码级执行瓶颈构建三层归因模型每层对应明确的工具链和判断阈值。2.1 用户层定义什么是“真卡”而不是“我以为卡”用户主观感受无法直接测量但可映射为可量化的交互事件序列。藏经阁中明确定义了三类高优先级卡顿场景均要求在iOS 15真机、非越狱、未连接Xcode调试状态下复现场景类型触发条件用户可感知现象监控基线达标值首帧延迟型启动App、打开新VC、Tab切换页面空白/灰屏 300ms或出现明显“闪一下再出内容”首帧渲染耗时 ≤ 280ms取P95持续掉帧型滑动列表、播放动画、输入文字滑动过程中FPS稳定低于55或出现≥2帧连续丢弃持续滑动3秒内FPS ≥ 58P90响应阻塞型点击按钮、提交表单、下拉刷新点击后UI无反馈 160ms或按钮状态不更新主线程阻塞 ≤ 120ms单次操作提示所有基线值均来自某电商App在iPhone 12~14系列真机上的A/B测试数据非模拟器或旧机型经验值。若你的设备是iPhone SE第二代需将首帧延迟基线放宽至350ms——硬件解码能力差异会直接影响UIKit渲染流水线。2.2 系统层用OS自带工具交叉验证避开Instruments的「假热点」Instruments的Time Profiler常把objc_msgSend或_dispatch_queue_drain标为高耗时但这只是调用栈入口不代表问题根源。藏经阁推荐“三工具交叉法”Xcode Organizer → Metrics → FPS CPU开启“Record GPU Frame Capture”导出.gputrace文件。重点看MTLCommandBuffer提交间隔是否突增16.6ms若GPU侧已满载优化CPU代码无效Console.app → 过滤signpost在代码中埋点os_signpost_interval_begin(OS_LOG_DEFAULT, UI, main-thread-work)捕获主线程实际工作区间比Instruments更准终端命令实时抓取# 在Mac上执行目标设备需信任且开启开发者模式 iproxy 2222 22 # 转发SSH端口 ssh -p 2222 mobilelocalhost ios_system_info --cpu --gpu --memory | grep -E (CPU|GPU|Memory)输出示例CPU: 82% (main thread 94%), GPU: 97%, Memory: 1.8GB/3.5GB—— 若GPU长期90%优先查CALayer.contents是否用了未预乘Alpha的PNG、UIView.layer.shouldRasterize true是否滥用。2.3 代码层聚焦「非显式耗时」的三大黑盒区90%的卡顿不来自for循环而来自以下三类隐式开销Autolayout重排版风暴viewDidLayoutSubviews中调用self.view.layoutIfNeeded()引发递归布局图片解码暗坑UIImage(named:)在主线程解码大图尤其WebP即使UIImageView已设clipsToBounds trueKVO/Notification监听泛滥一个NSNotification通知触发12个Observer每个都做DispatchQueue.main.async { }。藏经阁给出快速筛查法在AppDelegate.swift中注入全局钩子// 替换UIApplication主运行循环统计每帧耗时 class PerformanceMonitor { static func start() { RunLoop.main.add(NSMachPort(), forMode: .common) CFRunLoopAddObserver(RunLoop.current.getCFRunLoop(), unsafeBitCast(performanceObserver, to: CFRunLoopObserverRef.self), CFRunLoopMode.commonModes.rawValue) } private static let performanceObserver CFRunLoopObserverCreateWithHandler( nil, CFRunLoopActivity.beforeWaiting.rawValue | CFRunLoopActivity.afterWaiting.rawValue) { _, activity in if activity .beforeWaiting { // 记录本帧开始时间 lastFrameStart CACurrentMediaTime() } else if activity .afterWaiting { let frameDuration CACurrentMediaTime() - lastFrameStart if frameDuration 0.033 { // 33ms即掉帧 print(⚠️ 掉帧帧耗时: \(frameDuration * 1000)ms) // 此处可触发堆栈采样 captureMainThreadStack() } } } }此代码不依赖Instruments直接在App运行时捕获超长帧并打印当前主线程调用栈——这才是你真正该优化的函数。3. 手淘级优化落地针对首页、搜索、订单页的三个最小可行改造藏经阁的价值不在理论而在“改哪几行立刻见效”。以下三个改造均来自某电商App线上AB测试灰度5%用户7天数据已验证可提升P95 FPS 8~12帧且无兼容性风险。3.1 首页Tab切换白屏用CATransaction压制隐式动画现象从“我的”Tab切回“首页”首页顶部Banner区域白屏约400msInstruments显示-[CALayer setNeedsDisplay]耗时高。根因Banner轮播组件在viewWillAppear中重置currentPage触发UIScrollView隐式contentOffset动画与Tab切换动画冲突。改造仅3行无需改UI结构override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // 关键压制UIScrollView的隐式动画避免与Tab切换动画竞争 CATransaction.begin() CATransaction.setDisableActions(true) bannerScrollView.setContentOffset(CGPoint(x: 0, y: 0), animated: false) CATransaction.commit() }参数说明setDisableActions(true)禁用所有layer级隐式动画但不影响UIView.animate等显式动画animated: false确保setContentOffset立即生效不走动画队列。实测后首页Tab切换首帧耗时从382ms降至267ms。3.2 搜索结果页滑动卡顿预解码图片 异步绘制文本现象搜索关键词后进入结果页快速滑动时列表卡顿Instruments显示CGContextDrawImage和CTFramesetterCreateFrame为热点。根因UITableViewCell中UIImageView.image UIImage(named: item_icon)在cellForRowAt中触发主线程解码UILabel.attributedText含复杂富文本每次layoutSubviews都重绘。改造分两步均在Cell配置阶段// Step1: 图片预解码在后台队列完成 func configureCell(_ cell: SearchResultCell, with item: SearchItem) { DispatchQueue.global(qos: .userInitiated).async { // 解码后存入内存缓存非NSCache避免被系统回收 let decodedImage item.iconImage?.decodedImage DispatchQueue.main.async { cell.iconImageView.image decodedImage } } } // Step2: 文本异步绘制避免layoutSubviews中计算 class AsyncLabel: UILabel { override func drawText(in rect: CGRect) { guard let attributedText self.attributedText else { return } // 将富文本绘制委托给后台队列主线程只blit位图 if !self.isDrawingSync { DispatchQueue.global(qos: .userInitiated).async { let bitmap self.renderAttributedText(attributedText, in: rect) DispatchQueue.main.async { self.cachedBitmap bitmap self.setNeedsDisplay() } } } else { super.drawText(in: rect) } } }注意UIImage.decodedImage是iOS 15新增API对iOS 14及以下需用CGImageSourceCreateThumbnailAtIndex手动解码AsyncLabel需重写draw(_:)而非drawText确保位图缓存生效。3.3 订单页提交按钮无响应拆分viewDidLoad中的同步网络请求现象进入订单页后点击“提交订单”按钮1秒后才弹出确认弹窗期间按钮无任何状态变化。根因viewDidLoad中同步调用URLSession.shared.data(from:)错误示范阻塞主线程等待网络IO。改造零代码侵入仅调整调用时机// 原错误写法藏经阁列为「红线代码」 override func viewDidLoad() { super.viewDidLoad() let data try! URLSession.shared.data(from: url).0 // ⚠️ 同步阻塞 self.orderData parse(data) } // 正确做法用Task await但必须指定非Main并发上下文 override func viewDidLoad() { super.viewDidLoad() // 启动异步加载不阻塞UI Task { do { let data try await URLSession.shared.data(from: url).0 await MainActor.run { self.orderData parse(data) self.updateUI() // 刷新按钮状态 } } catch { await MainActor.run { self.showError(error) } } } }关键点Task { }默认在非Main Actor执行await MainActor.run { }确保UI更新安全若用DispatchQueue.global().async { }需手动DispatchQueue.main.async { }易漏写导致崩溃。4. 避坑指南藏经阁标注的5个「看似合理、实则翻车」的优化操作性能优化最危险的不是不做而是做了自以为对的事。藏经阁将以下5种操作标记为「高危行为」每条均附真实翻车案例来自某电商App 2023年Q3线上事故4.1 现象开启shouldRasterize true后列表滑动更卡了原因shouldRasterize会强制将layer栅格化为位图但若layer内容频繁变化如动态文字、渐变色每次变化都触发重绘上传GPU反而增加GPU压力。藏经阁数据在订单页启用该属性后GPU占用率从65%飙升至92%。解决仅对静态、不变化的layer启用如固定背景图并设置rasterizationScale UIScreen.main.scale防止缩放失真。4.2 现象用CADisplayLink替代Timer做动画FPS反而下降原因CADisplayLink回调在主线程执行若回调函数内做复杂计算如贝塞尔曲线插值会挤占渲染时间。某次将首页Banner动画从Timer改为CADisplayLink后因未做isPaused控制导致后台进程持续消耗CPU。解决CADisplayLink必须配对使用isPaused true/false且回调内只做UIView属性赋值计算逻辑移至后台队列。4.3 现象UITableView开启prefetchingEnabled内存暴涨200MB原因预加载策略未限制范围tableView(_:prefetchRowsAt:)中加载了全量商品图片含高清原图且未及时释放。藏经阁建议预加载仅限可见区域1屏图片尺寸严格匹配UIImageViewbounds。解决重写prefetchDataSource添加maxPrefetchCount 5硬限制并在cancelPrefetchingForRowsAt:中主动imageCache.remove(forKey:)。4.4 现象用MainActor标注ViewModel启动速度下降40%原因MainActor修饰的类其所有方法调用都会被编译器插入主线程调度即使方法本身无UI操作。某次将网络请求封装类加MainActor导致init方法被强制调度初始化耗时从8ms增至112ms。解决仅对直接操作UI或依赖UIKit状态的方法加MainActor网络、数据解析等纯逻辑层保持无Actor。4.5 现象Core Data用performBackgroundTask批量插入主线程卡死原因performBackgroundTask在私有队列执行但若插入后立即context.save()而主线程viewContext正在fetch会触发NSManagedObjectContext的锁竞争。藏经阁日志显示该操作导致主线程dispatch_sync阻塞达1.2秒。解决后台插入后用NotificationCenter通知主线程refresh避免跨上下文直接调用save()。5. 验证优化效果不靠肉眼用三组数据闭环证明「真的不卡了」改完代码不能靠“我感觉顺了”交差。藏经阁强制要求所有优化PR必须附三组可验证数据缺一不可5.1 真机FPS稳定性报告必须iOS 15真机用Xcode Organizer导出Metrics数据生成如下表格示例为首页Tab切换场景设备型号优化前P95 FPS优化后P95 FPS提升幅度掉帧帧数3秒滑动iPhone 1248.257.619.5%12 → 3iPhone 1351.759.314.7%8 → 1iPhone 14 Pro55.159.88.5%3 → 0注意数据需覆盖至少3款主力机型且测试环境为「关闭Xcode调试、关闭Low Power Mode、后台无其他App」。若某机型提升5%视为无效优化需重新归因。5.2 主线程耗时分布热力图用Instruments导出在Time Profiler中录制30秒典型操作如首页→搜索→返回→下单导出.trace文件用脚本提取主线程耗时TOP 10函数# 提取主线程符号耗时单位ms xcrun xctrace export --input trace.xctrace --output trace.json jq .traceEvents[] | select(.tid 1 and .dur 10000) | \(.name) \(.dur/1000) trace.json | sort -k2nr | head -10优化前TOP3常为-[CALayer setNeedsDisplay]、CGContextDrawImage、CTFramesetterCreateFrame优化后应变为-[UIView layoutSubviews]、objc_msgSend正常、dispatch_sync可控。若仍有图片/文本相关函数在TOP5说明解码/绘制未生效。5.3 用户侧卡顿率AB测试核心指标在Firebase或自建埋点中定义「卡顿事件」为event_name ui_jank且duration_ms 160即主线程阻塞超10帧对比AB组7日数据分组日均DAU卡顿事件数卡顿率P95首帧耗时A组旧版1,240,0008,2400.664%382msB组新版1,235,0003,1200.253%267ms提升——↓61.9%↓30.1%关键卡顿率下降必须伴随P95首帧耗时下降二者不同步则可能是埋点逻辑错误或样本偏差。6. 我的血泪经验把「藏经阁」变成你自己的性能反射弧藏经阁PDF我前后读过7遍但真正让它长进肌肉记忆的是坚持做三件事第一给每个页面加「性能身份证」。在ViewController顶部写注释// 性能身份证 // - 首帧目标≤280ms实测267ms✅ // - 滑动FPS≥58P90实测59.3✅ // - 卡顿率0.3%AB测试0.253%✅ // - 最后验证2024-03-15 iPhone 14 Pro每次CR时先看身份证是否过期。过期必须重测不重测不合并。第二建立「卡顿-代码」双向索引。用VS Code的#pragma mark和自定义代码片段// MARK: - [JANK-001] 首页Banner白屏见藏经阁P12 // 解决方案CATransaction压制隐式动画 // 验证方式Xcode Metrics FPS ≥58这样下次看到viewWillAppear光标一停就能唤起归因路径不用翻PDF。第三把Instruments操作固化为Shell脚本。比如一键抓取GPU帧#!/bin/bash # gpu-capture.sh xcrun xctrace record --template GPU Frame Capture \ --device $1 \ --app com.example.taobao \ --output gpu-$(date %Y%m%d-%H%M%S).trace echo ✅ GPU trace saved: gpu-$(date %Y%m%d-%H%M%S).trace每天早会前跑一遍生成日报邮件——让卡顿数据像天气预报一样准时出现。这三件事不炫技但让我从“遇到卡顿就心慌”变成“看到卡顿就条件反射去查身份证”。性能优化没有银弹只有把别人的藏经阁一砖一瓦砌成自己的反射弧。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

iOS卡顿归因与性能优化实战:从毛刺检测到灰度验证闭环

iOS卡顿归因与性能优化实战:从毛刺检测到灰度验证闭环

简介:本资源是阿里云技术团队出品的《手淘iOS性能优化探索》深度实践文档,面向中高级iOS开发者、性能优化工程师及移动架构师,聚焦启动慢、页面卡顿、API低效等线上高频性能顽疾。文档系统阐述了App启动器设计、并发串行任务管理、NSCoding镜…

2026/10/11 10:48:22 阅读更多 →
ApplyPilot init配置向导完全指南:一次设置好简历、求职档案与免费API密钥

ApplyPilot init配置向导完全指南:一次设置好简历、求职档案与免费API密钥

【免费下载链接】ApplyPilot AI agent that applies to jobs for you. Any site. Any form. 项目地址: https://gitcode.com/gh_mirrors/ap/ApplyPilot 点击查看 免费下载 ApplyPilot 是一个开源的 AI 求职申请代理:它能跨多个招聘网站发现职位、用 AI …

2026/10/11 10:47:22 阅读更多 →
单图手部三维重建算法落地指南:MANO参数回归与工程化实践

单图手部三维重建算法落地指南:MANO参数回归与工程化实践

简介:单图手部三维重建是计算机视觉中颇具挑战的方向,本项目面向算法研究者、AR/VR开发者及研究生等群体,提供从二维图像恢复手部三维模型的完整可运行工程。包内共25个文件,以18个Python源码文件与3个Jupyter Notebook教程为核心…

2026/10/11 10:47:22 阅读更多 →

最新新闻

SpringBoot3+EasyExcel实现复杂Excel一键导入实战指南

SpringBoot3+EasyExcel实现复杂Excel一键导入实战指南

1. 项目背景与方案选型1.1 从POI直接操作说起做后端开发的,谁没被Excel导入导出折磨过?我早年用Apache POI直接写导入功能,代码量大不说,最痛苦的是内存。一个几万行的Excel解析下来,整个JVM堆吃紧,频繁Ful…

2026/10/11 14:18:25 阅读更多 →
WeMM-Embedding输入类型完全指南:文本、图像、视频、文档与交错多模态的5种用法

WeMM-Embedding输入类型完全指南:文本、图像、视频、文档与交错多模态的5种用法

人工智能大模型Embedding多模态模型评测模型推理服务 【免费下载链接】WeMM-Embedding WeMM-Embedding is a family of universal multimodal embedding models by the WeChat Vision Team at Tencent, supporting multimodal understanding and retrieval. 项目地址&#xff1…

2026/10/11 14:18:25 阅读更多 →
用Mermaid把文档图表变成可维护的文本源码:原理、工作流与避坑指南

用Mermaid把文档图表变成可维护的文本源码:原理、工作流与避坑指南

记不清是第几次了,为了改一张流程图里的一个判断分支,我打开绘图软件重新拖了一遍箭头。图改完还要重新导出、重新上传,然后打开聊天记录,问群里的人拿的是不是最新版本。后来我把图表换成了 Mermaid 这类文本绘图方式&#xff0c…

2026/10/11 14:18:24 阅读更多 →
中南大学数据库试题:数据库工程师能力校准器

中南大学数据库试题:数据库工程师能力校准器

简介:本资源为中南大学数据库课程历年典型试题汇编,面向计算机专业本科生、考研备考学生及数据库初学者,系统覆盖数据库原理核心考点与应试难点。试题内容紧扣教学大纲,涵盖DBMS演进逻辑、三级模式结构、ER与关系模型设计、SQL语法…

2026/10/11 14:18:24 阅读更多 →
Origin 安装全流程指南:选型、部署、激活与避坑

Origin 安装全流程指南:选型、部署、激活与避坑

简介:Origin是一套专为科研与工程领域设计的专业数据分析和绘图软件,集成数据导入、函数拟合、统计分析及二维/三维图形绘制功能,适合高校师生、科研人员及工程师用于制作论文中的高质量插图,尤其适合需要发表高水平学术论文的学者…

2026/10/11 14:18:24 阅读更多 →
.NET Core Cookie身份验证完全指南:原理、配置与实战

.NET Core Cookie身份验证完全指南:原理、配置与实战

下面是一篇围绕“.Net Core — Cookie 身份验证”展开的实操型博文,以真实从业者的口吻写,不跑题、不说教、直接给方案。 做了几年 .Net 后端,Cookie 身份验证一直是被反复问到、也反复踩坑的一块。很多人一上来就选 JWT,觉得无状…

2026/10/11 14:17:24 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

2026/10/11 0:00:27 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 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/11 10:45:37 阅读更多 →
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/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练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/10 10:38:42 阅读更多 →