SkiaSharp 维护指南:从 Skia 上游同步到 .NET 绑定的发布全流程
图形学图像处理跨平台【免费下载链接】SkiaSharpSkiaSharp is a cross-platform 2D graphics API for .NET platforms based on Googles Skia Graphics Library. It provides a comprehensive 2D API that can be used across mobile, server and desktop models to render images.项目地址https://gitcode.com/gh_mirrors/sk/SkiaSharp点击查看免费下载本篇指南系统讲解 SkiaSharp 开源项目维护者的核心职责与工程流程涵盖 issue 分类与 PR 审查、跟随 Chromium milestone 的上游 Skia 更新节奏、原生库与 .NET 绑定的升级步骤、预览优先的发布策略以及依赖合规与安全更新机制。阅读本文后你将理解 SkiaSharp 为何采用每年一到两次的慢节奏更新、如何借助仓库内自动化工作流降低维护成本并能按本文给出的步骤与仓库源码证据复现或参与这一维护流程。说明documentation/dev/maintaining.md目前仍标注为草稿draft本文以其为主体并结合仓库内的发布指南、版本方案、issue 流水线与自动化工作流等文档与源码进行补充佐证。维护者的核心职责不止于更新绑定SkiaSharp 维护工作并不仅仅是把新版本 Skia 的 C API 重新绑定一遍还包括围绕仓库日常运转的 issue 与 PR 管理。文档 maintaining.md 将这部分职责概括为basic rules expectations基本规则与期望目标在3 天内完成 issue 的 triage分类与初步处理在发布后的当天完成新 issue 的 triage目标每周审查一次 PR任何 stable稳定版发布之前都会先发布 preview预览版。这套节奏的出发点很明确SkiaSharp 的用户群体跨度极大——从独立应用开发者、组件供应商到完整的 UI 框架作者如 Uno Platform、Avalonia、Telerik、Syncfusion 等团队都是其核心用户。在引入新功能与改进的同时维护者必须尽可能避免破坏现有应用。Issue TriageAI 辅助的分类与看板更新由于问题数量并不多triage 主要是一次快速阅读并打上标签同时通过engagement score参与度评分追踪热度确保高优先级问题能及时浮出水面。如今这一环节已由 AI Agent 辅助完成仓库中的Sync - Issue Triage工作流源码入口见 .github/workflows/auto-triage.md编译产物为 .github/workflows/auto-triage.lock.yml会每日定时运行并在 issue 事件触发时运行完成以下动作选择待处理 issue通过gh issue list筛选出 未打triage/triaged标签、创建超过 1 小时、按评论数排序 的开放 issue运行 issue-triage skill按 issue-pipeline.md 定义的流水线对 issue 进行分类type/area/platform/severity、提取证据、调查代码并给出建议动作产出ai-triage/{n}.json结构化数据应用标签将分类结果映射为type/bug、area/SkiaSharp、os/Android、backend/Metal、tenet/compatibility、perf/memory-leak等标签并补打triage/triaged标记更新 Backlog 项目看板将 Severity、Suggested Action、Confidence、Repro Quality、Error Type、Triage Summary 等字段写回项目看板见 .github/workflows/auto-triage.md归档报告把triage.json/triage.md/triage.html复制进 workflow artifact并把 Markdown 报告追加到 step summary 便于在 Actions 页面直接查看。值得强调的是AI 只负责分类 打标签 更新看板不会代替维护者做关闭决定真正的复现repro与修复fix仍由后续流水线步骤完成。PR 审查以通用性与测试覆盖为准绳与 issue 一样PR 流入量通常不高多为小修复或长期有价值的 API。审查 PR 的核心标准是新 API 对整个社区是否有用且不额外增加维护负担新代码与 bugfix 必须附带测试来演示该功能确保在后续上游升级时该特性仍被覆盖。这一要求在仓库中有直接落点测试目录 tests/Tests/SkiaSharp 下有 106 个测试文件覆盖各类 API 行为关于为何必须补测试、测试怎么写的更细说明可参考 adding-apis.md 与 golden-image-tests.md。更新节奏跟随 Chromium milestone 的慢节奏策略SkiaSharp 通常每年更新一到两次Skia 与 SkiaSharp。之所以刻意放慢节奏是因为上游 Google Skia 项目移动极快且不以传统 major/minor 方式做版本管理——它本质上是一个移动靶moving target只有每月一次的 stabilization 分支。Google 随时可能增删改 API因为 Skia 虽然是公开项目却深度绑定 Chromium 与 Android 的内部开发。因此维护团队遵循两条原则避免领先于稳定的 Chromium 分支进行更新防止不稳定尽可能向上游回馈修复upstream fixes但由于更新周期较慢等待期间往往需要在本地打补丁。文档特别强调了一个术语上的关键点maintaining.mdSkia 把他们的版本叫做 milestones里程碑。Chromium 的发布通道与 milestone 对应关系如下Milestone通道ChannelLatestCanaryLatest-1DevLatest-2BetaLatest-3Stable也就是说SkiaSharp 参考的稳定版并非 Skia 最新代码而是落后三个里程碑的 Stable 通道所对应的chrome/mN分支。当前仓库的状态可以在 scripts/VERSIONS.txt 中直接验证skia release m156、libSkiaSharp milestone 156、SkiaSharp nuget 4.156.0而 scripts/azure-templates-variables.yml 中的SKIASHARP_VERSION: 4.156.0与PREVIEW_LABEL: preview.0则定义了当前数值版本与发布通道。上游同步的自动化实现慢节奏并不等于手工合并。仓库在 .github/workflows/auto-skia-sync.md 中实现了一个高度自动化的Sync - Skia Upstream工作流其检测脚本 .github/scripts/skia-sync-detect.sh 是分支解析的唯一事实来源定时轮询每 6 小时运行一次通过rotate_select轮询机制从 scripts/infra/docs/versions.json 的支持行support 块中每轮选择一个支持的行进行同步三种目标形态空目标轮询默认、main合并 google/skia 最前沿 HEAD注意这不是版本升级、或具体 milestone 数字合并chrome/mN分支手动派发可通过 workflow_dispatch 指定targetmilestone 号或main与target_branch完整交付链合并新提交 → 解决冲突 → 冷启动构建首次构建约 10–20 分钟→ 全平台测试含软件渲染的 GL/Vulkan 后端确定性验证→ 由后置步骤安全推送分支并创建两个互相关联的草稿 PR。这套自动化把Skia 上游更新从纯手工劳动变成了检测、合并、构建、测试、PR的流水线大大降低了维护者在更新节奏上的负担。更新原生 Skia 的通用步骤与复杂度分级维护文档给出的原生 Skia 更新流程如下maintaining.md审查上游API diff找出破坏性变更基于当前版本开新分支合并目标 Skia 版本解决合并冲突并使其编译通过识别并适配所有已变更或已移除的特性随后开始对应的.NETSkiaSharp更新。其中有一个必须反复强调的警告Skia 不保证 API 或 ABI 稳定破坏性变更是常态maintaining.md。这也是为什么步骤 1 的审查 API diff如此重要——它决定了后面每一步的规模。简单更新与复杂更新简单更新某个方法被改名或移动位置。此时编译错误本身就是最好的向导——哪里报错改哪里时间通常只需一天。复杂更新结构性变更例如历史上SkPaint拆分成了SkPaint与SkFont。这种拆分迫使维护团队重新设计包装 API以避免破坏现有用户代码整个过程可能耗时一到两周。从源码结构看绑定层的工作量集中在 binding/SkiaSharpC# 包装与 P/Invoke、binding/HarfBuzzSharp 以及 C API 实现所在的externals/skia/src/c/其中生成的 P/Invoke 代码位于 binding/SkiaSharp/Generated可用 utils/generate.ps1 按配置如 binding/libSkiaSharp.json重新生成。关于分层架构C → C API → C#与调用链细节可参考 architecture.md。更新 .NET SkiaSharp受控的 API 暴露策略原生 Skia 更新完成后.NET 侧的更新通常更直接——因为维护者掌控着 .NET API 表面可以更从容地消化上游变化。通用步骤如下maintaining.md完成原生 Skia 更新更新或重写 .NET 方法以匹配新的原生 API为所有改动补测试再根据 API diff 或新特性追加更多测试。文档特别强调了对新原生 API 的选择性暴露策略Google 迭代太快早期阶段的 API 可能短命或大幅演进因此 SkiaSharp 并不急于立刻暴露每一个新 API。故意落后半步反而有利——等到团队采纳某特性时它往往已经更稳定。此外即使底层原生 API 仍在变动团队有时也会先包一层稳定的、面向未来的 API 形态以减少未来 .NET 表面的反复变动。这正是前文SkPaint/SkFont拆分案例中为不破坏用户而重新设计包装 API思路的延续。版本号的编码方式major.skia.minor.patch要理解更新什么、怎么发版必须先看懂版本号语义。根据 versioning.mdSkiaSharp 的版本号是major.skia.minor.patch四段结构但含义与通用 .NET 版本号不同major底层 API 和/或行为发生激进变化的大版本升级例如 v2 改变颜色空间加载处理与文本处理方式skiaGoogle 提供的milestone/tag多数情况下行为变化不大不会破坏现有应用minor包含 bugfix 或新 API 的更新通常不是破坏性变更patch针对程序集或打包的极小变更历史上 v1.68.1.1 曾因程序集强名称只做了延迟签名而打过一次 patch。预发布标签沿用惯例-alpha早期未充分测试、-preview大体可用但仍有收尾工作、-rc等待第三方反馈不常用而stable只是流水线中的哨兵值不会出现在包版本里。官方 CI 通过 Arcade 的OfficialBuildIdyyyyMMdd.revision派生构建后缀例如4.152.0-preview.0.26418.3。当前主线状态4.156.0preview.0可直接在 scripts/azure-templates-variables.yml 中核验。发布更新预览先行社区共测SkiaSharp 的发布策略是尽早以 preview 形式发布让社区尽早测试、尽早发现回归。由于项目不绑定任何特定产品周期发布时机取决于构建是否稳定 反馈是否积极maintaining.md。文档提到的核心用户生态Uno Platform、Avalonia、Telerik、Syncfusion 等团队在快速反馈中作用显著例如 DrawnUI 的维护者会持续测试最新特性并推动性能边界。如果发生回归通常很少见且可快速修复——这得益于项目建立良好、可靠的依赖体系。发布流程全貌结合 Release Guide更细的可执行发布步骤记录在 releasing.md维护文档所述的预览优先在那里落地为完整流水线可概括为六步步骤动作结果1运行Release - Prepare创建配对的mono/skia与mono/SkiaSharp发布分支2等待skiasharp-package再等skiasharp-tests产出签名 BAR 并验证精确的 Build 流水线资源3按需排队 MAUI 官方发布流水线人工检查审计后批准将所选 BAR 的发布包发布到 NuGet.org4所有包公开后审查Release - Finish并确认创建 tag 与 GitHub Release随后启动后续自动化5运行Release - Milestones对账已发布工作并推进发布里程碑6合并后续 PR落地版本号提升、支持更新与发布说明发布涉及的所有引用分支、tag、已发布的 NuGet 版本都不可变绝不强制更新已有发布分支、绝不移动或删除发布 tag、绝不替换已发布的包版本。Prepare / Finish / Milestones 均采用先不带push跑一次只读计划再以相同输入带push正式执行的双派发模式详见 release-process-internals.md 中的DryRun/Apply/Push三模式说明。合规与依赖管理盯紧 DEPS 与 CVE维护文档指出Google 自身的合规工作总体良好但维护者仍需持续关注原生 Skia 的DEPS文件中是否引入新依赖maintaining.md。团队的做法包括依赖内部工具捕获许可或合规问题必要时使用扫描工具持续监控依赖并在安全漏洞修复后尽快升级版本。文档还给出了依赖出问题时的处理预期在极少数情况下某个依赖如libpng或zlib引入问题通常只需等待上游短时间内的修复再更新这类情况非常罕见。仓库内的合规落地细节这些原则在仓库中有多处具体实现可作为深入研究的入口依赖清单dependencies.md 是原生依赖的唯一事实来源明确列出活跃依赖libpng、zlib、libjpeg-turbo、libwebp、freetype、harfbuzz、expat、brotli、wuffs 等安全相关项以及 vulkanmemoryallocator、d3d12allocator、spirv-cross 等 GPU 相关项并记录了已禁用项如 DNG/RAW 编解码器skia_use_dng_sdkfalse、skia_use_piexfalseCVE 检测接入cgmanifest.json 启用 Microsoft Component Governance CVE 检测通过type: other 上游规范名称解决Skia 镜像自 chromium.googlesource.com 而 CVE 数据库使用上游名称的错位问题Skia 条目还带chrome_milestone与upstream_merge_commit自定义字段用于过滤 NVD 结果Skia 特有问题Skia 的 CVE 在 NVD 中挂在cpe:2.3:a:google:chrome下无独立 CPE且 cgmanifest 引用的是mono/skia.gitfork 而非上游因此需要按Chrome 大版本 → Skia milestone的映射人工比对详见 dependencies.md子模块同步自动化.github/workflows/auto-skia-submodule-sync.yml 每日将externals/skia子模块推进到mono/skia的skiasharp分支并同步更新 cgmanifest 中mono/skiagit 注册的commitHash任一变化即自动开 PR——这也顺带修复清单漂移。已知误报示例合规扫描并非见 CVE 就升级。文档记录了典型误报zlib 自带的MiniZipzlib/contrib/minizip/并未被 Skia 编译链接externals/skia/third_party/zlib/BUILD.gn只列核心 zlib 源文件因此涉及unzip.c、unzip.h、unzOpen/zipOpen的 CVE 均为误报但影响deflate/inflate/adler32/crc32的核心 zlib CVE仍然适用。同理FreeType 自带一份独立 zlibfreetype/src/gzip/核查 zlib CVE 时需区分两份拷贝。总结一条慢而稳的维护主线纵观全文SkiaSharp 的维护体系可以概括为一条主线以 Chromium 的 Stable milestone 为锚点maintaining.md通过 auto-skia-sync 自动同步上游、以编译错误与测试驱动绑定层适配adding-apis.md、以预览版先行的方式收集生态反馈最后借助 releasing.md 的六步流水线完成发布并以 cgmanifest.json dependencies.md 守住合规底线。对想要参与贡献的开发者而言最直接的入手点有三处按 issue-pipeline.md 的三步流水线协助处理 issue按 adding-apis.md 与 api-design.md 提交带测试的 API 补丁以及参照 building.md 在本地完成构建验证。这些文档与本文引用的工作流、配置共同构成了完整的维护知识体系。赞分享图形学图像处理跨平台【免费下载链接】SkiaSharpSkiaSharp is a cross-platform 2D graphics API for .NET platforms based on Googles Skia Graphics Library. It provides a comprehensive 2D API that can be used across mobile, server and desktop models to render images.项目地址https://gitcode.com/gh_mirrors/sk/SkiaSharp点击查看免费下载相关推荐SkiaSharp 新增 API 全流程指南从 Skia C 到 C 绑定的六步实战SkiaSharp 新增 API 全流程指南从 Skia C 到 C 绑定的六步实战 导读 本文以仓库 adding apis.md https://li图形学图像处理跨平台SkiaSharp 的 Skia 上游合并 PR 审查全流程从 orchestrator 到可审计报告SkiaSharp 的 Skia 上游合并 PR 审查全流程从 orchestrator 到可审计报告 导读 本篇文章讲解 SkiaSharp 项目中 rev图形学图像处理跨平台Pure Live 维护分支贡献指南从 Bug 分诊、上游同步到发布验证的完整协作流程Pure Live 维护分支贡献指南从 Bug 分诊、上游同步到发布验证的完整协作流程 本篇技术指南围绕 Pure Live 维护分支的参与贡献规范展开系统音视频直播移动开发创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

35个GitHub热门Claude Code技能实测:把settings改到TaoToken后AI编程效率翻倍

35个GitHub热门Claude Code技能实测:把settings改到TaoToken后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/12 22:07:22 阅读更多 →
YOLOv5 6.1全中文注释包:从源码解析到自定义训练与部署

YOLOv5 6.1全中文注释包:从源码解析到自定义训练与部署

简介:这份资源是YOLOV5 6.1版本的全中文注释代码压缩包,面向目标检测方向的研究生、参加创新创业大赛的学生以及刚接触物体识别项目的开发者,主要解决官方源码注释稀少、初学者难以读懂网络结构与训练流程的问题。压缩包共约2000个文件&#…

2026/10/12 22:07:22 阅读更多 →
飞鸟数据集全流程实战:从VOC标签转换到YOLOv8训练与调优

飞鸟数据集全流程实战:从VOC标签转换到YOLOv8训练与调优

简介:飞鸟数据集是一套面向目标检测任务的鸟类图像资源,适合计算机视觉初学者、算法研究者以及无人机监控、野生动物保护等应用方向的开发者,也适用于课程设计与科研实验。数据涵盖近景个体、飞翔姿态与群鸟场景,覆盖树上、城市等…

2026/10/12 22:07:22 阅读更多 →

最新新闻

iOS TableView 异步加载图片:从原理到实践,告别列表卡顿

iOS TableView 异步加载图片:从原理到实践,告别列表卡顿

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

2026/10/13 1:03:48 阅读更多 →
对称边界如何让模态分析生成‘春节快乐’字形

对称边界如何让模态分析生成‘春节快乐’字形

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

2026/10/13 1:03:48 阅读更多 →
纯软件STM32入门:无需开发板,仿真环境跑通核心外设

纯软件STM32入门:无需开发板,仿真环境跑通核心外设

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

2026/10/13 1:03:48 阅读更多 →
UDS车载诊断实战指南:服务格式、时序与否定响应码解析

UDS车载诊断实战指南:服务格式、时序与否定响应码解析

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

2026/10/13 1:03:48 阅读更多 →
HTML表单交互与DOM操作实战:从零构建可调试的网络编程训练

HTML表单交互与DOM操作实战:从零构建可调试的网络编程训练

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

2026/10/13 1:03:48 阅读更多 →
LightGBM因子筛选与BiLSTM时序建模:量化投资策略实战

LightGBM因子筛选与BiLSTM时序建模:量化投资策略实战

简介:这份资源面向计算机相关专业学生、高校教师及量化投资初学者,提供一套将LightGBM与BiLSTM结合进行因子组合选取并构建量化投资策略的完整实践项目,可直接用于毕业设计、课程设计、实训实验或公司项目二次开发。压缩包共1408个文件&#…

2026/10/13 1:02:48 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →