5分钟搭建Python本地服务器,高效测试Unity Addressable远程加载
1. 项目概述为什么我们需要一个本地Hosting服务器如果你正在使用Unity的Addressable Asset System那么“远程加载”这个概念对你来说一定不陌生。它意味着你可以把资源包AssetBundle放在一个网络服务器上游戏客户端在运行时按需下载从而实现热更新、分包加载、减小初始包体等核心需求。听起来很美好对吧但问题来了在开发阶段我们真的需要每次都把资源上传到公网服务器然后让客户端去拉取吗这显然不现实。上传慢、网络不稳定、测试环境复杂任何一个环节都能让你宝贵的开发时间白白浪费。这就是“本地服务器模拟远程加载”要解决的问题。它的核心思想是在你的开发机比如你的Windows或Mac电脑上快速搭建一个轻量级的HTTP文件服务器让它扮演“远程服务器”的角色。然后你将Addressable构建出来的资源包放到这个本地服务器的目录下再修改Addressable的加载路径指向http://localhost:端口号/...。这样一来你的游戏客户端在编辑器内或打包后运行时其加载行为就和访问真正的远程服务器一模一样了但所有的网络请求都发生在你的本地回环地址上速度极快且完全可控。我见过很多团队在开发前期忽略这一步要么直接使用本地路径Local加载测试不充分要么费时费力去配置测试服务器。前者会导致上线前切换为远程模式时出现各种路径和加载逻辑的兼容性问题后者则严重拖慢迭代速度。今天要分享的这个“5分钟保姆级教程”就是让你用最小的成本在开发初期就建立起与生产环境一致的资源加载流程。这不仅仅是“模拟”更是一种“对齐”能提前暴露和解决大量潜在的网络加载、路径解析、缓存策略等问题。2. 核心工具选型为什么是Python的http.server搭建本地HTTP服务器有很多选择Node.js的http-server、live-server或者用C#写个简单的控制台程序。但在这里我强烈推荐使用Python内置的http.server模块。理由非常充分零依赖开箱即用Python是跨平台语言在macOS和大多数Linux发行版上通常预装Windows上安装也极其简单。只要你安装了Python建议3.6以上这个模块就一定存在无需任何额外的npm install或nuget包管理操作。命令极简功能专注它的唯一功能就是提供静态文件服务这正是我们模拟资源服务器所需要的全部。没有花里胡哨的编译、热重载我们也不需要启动命令简单到令人发指。完全可控通过命令行参数我们可以轻松指定服务端口、绑定地址和根目录完美契合我们的需求。相比之下其他方案或多或少有些“杀鸡用牛刀”。Node.js的方案需要额外的环境自己写一个虽然不难但没必要重复造轮子且可能引入不必要的调试成本。http.server在简单、直接、可靠这个维度上做到了极致是开发阶段模拟测试的绝佳伴侣。注意http.server是单线程的性能不足以支撑高并发生产环境。但请记住我们只是在本地开发测试通常只有你一个人在访问这个性能完全绰绰有余。千万不要把它用于线上。2.1 环境准备检查在开始之前确保你的电脑上已经安装了Python。打开你的终端Windows上是CMD或PowerShellmacOS/Linux上是Terminal输入以下命令python --version # 或 python3 --version如果返回了类似Python 3.8.5的版本信息说明环境已经就绪。如果没有请前往Python官网下载安装最新版本安装时记得勾选“Add Python to PATH”选项。3. 实战五步曲从构建到加载的完整闭环理论说再多不如动手做一遍。下面这五个步骤将带你完整走通整个流程。3.1 第一步构建Addressable资源包关键配置首先我们需要让Addressable系统构建出用于远程加载的资源包。这一步的配置至关重要。打开Addressables Groups窗口在Unity编辑器中选择Window-Asset Management-Addressables-Groups。打开构建配置面板在Addressables Groups窗口中点击工具栏的Tools-Build-New Build-Default Build Script。更常用的方式是直接打开AddressableAssetSettings在Groups窗口的Tools-Settings这里进行的是永久性配置。配置远程构建路径在AddressableAssetSettingsInspector面板中找到Build and Load Paths部分。将Build Path和Load Path都修改为Remote。点击Remote Build Path和Remote Load Path后面的输入框进行具体设置。这是核心Remote Build Path这是资源包构建后存放的本地目录。例如设置为[UnityProjectPath]/ServerData/StandaloneWindows64。[UnityProjectPath]是你的项目根目录StandaloneWindows64是目标平台这样构建时会自动按平台分离资源管理清晰。Remote Load Path这是游戏客户端运行时尝试加载资源的URL地址。这里我们先填一个占位符例如http://localhost:8080/{BuildTarget}。{BuildTarget}是一个变量构建时会自动替换为当前平台如StandaloneWindows64。构建资源包配置好后回到Groups窗口点击Build-New Build-Default Build Script。Unity会开始构建AssetBundle并将其输出到你刚才设置的Remote Build Path目录下。实操心得我强烈建议将Remote Build Path设置为项目目录之外的一个独立文件夹比如D:\AddressableServerData。这样做的好处是当你清理或重建项目时不会误删这些构建好的资源包。资源包通常很大重新构建耗时独立存放更安全。构建完成后去你设置的Remote Build Path目录下查看应该能看到addressables_content_state.bin、catalog.json以及一系列.bundle文件和一个StandaloneWindows64或你的目标平台名文件夹里面包含了所有资源包。3.2 第二步启动Python本地HTTP服务器现在我们需要让上一步构建出来的资源目录能通过网络被访问到。打开终端并导航cd命令到你的资源包所在的父目录。例如如果你的资源包在D:\AddressableServerData\StandaloneWindows64那么你应该导航到D:\AddressableServerData。为什么是父目录因为我们的Remote Load Path里包含了{BuildTarget}变量。服务器需要能在根目录下找到以平台名命名的子文件夹。启动HTTP服务器执行以下命令。# 在Windows上如果你同时安装了Python2和3可能需要用python3 python -m http.server 8080 # 或者指定绑定所有IP方便同一局域网内其他设备如手机测试 python -m http.server 8080 --bind 0.0.0.0-m http.server: 表示运行http.server模块。8080: 指定端口号你可以换成任何未被占用的端口如8000、9000。--bind 0.0.0.0: 让服务器监听所有网络接口而不仅仅是本地回环(127.0.0.1)。这样如果你在Unity编辑器里运行的是Android或iOS模拟器或者想用真机测试只要手机和电脑在同一Wi-Fi下就能通过电脑的IP地址访问了。验证服务器打开浏览器访问http://localhost:8080。你应该能看到一个文件列表页面其中包含StandaloneWindows64这个文件夹。点击进入该文件夹应该能看到.bundle等文件。这说明你的静态文件服务器已经正常运行。3.3 第三步修正Addressable加载路径并构建Player服务器跑起来了但游戏客户端还不知道去哪里加载。我们需要更新Addressable的配置并构建出可执行游戏。更新Remote Load Path临时由于我们已经在运行本地服务器且资源放在http://localhost:8080/StandaloneWindows64/下我们需要确保Addressable系统知道这个地址。一种方法是直接修改AddressableAssetSettings里的Remote Load Path为http://localhost:8080/{BuildTarget}如果之前不是的话。更推荐的方法使用AddressablesAPI在运行时动态设置。这更灵活不会污染项目配置。你可以在游戏初始化脚本如GameManager的Awake方法中这样写using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.ResourceManagement.AsyncOperations; public class AddressableRemoteConfig : MonoBehaviour { void Awake() { // 构建时使用的Remote Load Path通常我们会在构建后得到一个catalog文件 // 但这里我们演示如何覆盖内置路径适用于开发阶段 // 实际上更常见的做法是构建Player时Remote Load Path已经指向了本地服务器地址。 // 所以确保你的构建设置是正确的即可。 } }最直接的做法在构建Player之前确保AddressableAssetSettings中的Remote Load Path就是http://localhost:8080/{BuildTarget}。然后不需要重新构建Addressable资源包除非你改了资源只需要构建游戏Player本身。构建游戏Player在Unity的File-Build Settings中选择正确的平台点击Build。构建出的游戏其Addressable系统就会尝试从http://localhost:8080/StandaloneWindows64/加载资源。踩坑记录这里有一个巨大的“坑”。当你修改了Remote Load Path后必须重新构建Addressable资源包即执行3.1的步骤。因为资源包内的catalog文件记录了资源的加载路径。只改设置不重编catalog里的路径还是旧的游戏依然会去错误的地方找资源。所以流程是改路径 - 构建Addressable - 启动服务器- 构建Player。3.4 第四步运行测试与验证激动人心的时刻到了。确保Python HTTP服务器仍在运行终端窗口不要关闭。运行构建好的游戏。如果是Windows的exe直接双击打开。观察游戏日志。通常游戏启动时Addressable会初始化并尝试加载catalog。你可以在游戏启动时打开控制台如果构建时包含了Development Build选项或者将日志输出到文件。你应该能看到类似Loading catalog from http://localhost:8080/StandaloneWindows64/catalog.json...的成功信息。触发一个远程资源的加载。在游戏中走到需要加载你标记为远程的Addressable资源的场景或逻辑处。例如你有一个远程的预制体实例化它的代码可能是Addressables.InstantiateAsync(MyRemotePrefabKey).Completed handle { if (handle.Status AsyncOperationStatus.Succeeded) { Debug.Log(远程预制体加载并实例化成功); } };如果成功你会在游戏日志中看到资源下载和加载的提示并且游戏对象会正常出现。同时你回头看一眼运行服务器的终端窗口会发现有类似GET /StandaloneWindows64/xxx.bundle HTTP/1.1 200 -的访问日志这证明游戏确实从你的本地服务器拉取了资源包。3.5 第五步进阶技巧与自动化脚本做到上面四步基本功能已经实现。但对于追求效率的开发者来说我们可以做得更优雅。技巧一一键启动脚本每次开发都要开终端、输命令太麻烦。我们可以写一个简单的脚本。在资源包父目录如D:\AddressableServerData下创建一个名为start_server.bat(Windows) 或start_server.sh(macOS/Linux) 的文件。Windows (.bat):echo off echo 正在启动本地Addressable资源服务器... python -m http.server 8080 --bind 0.0.0.0 pausemacOS/Linux (.sh):#!/bin/bash echo 正在启动本地Addressable资源服务器... python3 -m http.server 8080 --bind 0.0.0.0以后只需要双击这个脚本文件服务器就启动了。技巧二将服务器目录作为构建输出目标在Unity中你可以将Addressable的Remote Build Path直接设置为你的服务器脚本所在的目录下的对应平台文件夹。这样每次构建Addressable新资源包会自动覆盖旧文件服务器无需任何操作就能提供最新资源。技巧三处理缓存问题Addressable和浏览器都有缓存机制。有时你更新了资源包但游戏可能加载了旧版本。Addressable缓存在开发期间可以在AddressableAssetSettings中勾选Disable Catalog Update on Startup并在代码中手动处理或者更暴力地在测试前清除播放器缓存通过Caching.ClearCache()。浏览器缓存如果通过WebGL测试在启动Python服务器时可以加一个简单的参数来设置不缓存但这需要自定义SimpleHTTPRequestHandler稍微复杂点。对于本地测试最直接的方法是使用浏览器的无痕模式或强制刷新。4. 常见问题排查与解决方案实录即使按照教程一步步来也可能会遇到问题。下面是我在实践中总结的几个典型问题及解决方法。问题现象可能原因排查步骤与解决方案游戏启动时报错Failed to download catalog或Unable to load resource catalog1. Python服务器未启动。2. 服务器端口被占用。3. Remote Load Path配置错误服务器上对应路径不存在catalog.json。4. 防火墙阻止了连接。1.检查服务器访问http://localhost:8080/StandaloneWindows64/catalog.json看浏览器是否能下载该文件。如果不行说明服务器或路径有问题。2.检查端口在终端用netstat -ano | findstr :8080(Win) 或lsof -i:8080(macOS/Linux) 查看端口是否被其他程序占用换一个端口试试。3.检查路径确认构建输出的目录结构是否和URL路径完全匹配。{BuildTarget}变量是否被正确替换。4.关闭防火墙临时关闭防火墙进行测试确认是否是防火墙问题。服务器日志显示GET请求返回200但游戏里资源加载失败或为粉色/紫色1. 资源包.bundle本身构建有问题或损坏。2. 资源依赖关系丢失。3. 游戏构建的Target平台与资源包平台不匹配。1.验证资源包尝试在Unity编辑器中使用Addressables的Check for Content Update Restrictions和Build-Update a Previous Build来检查资源完整性。2.检查依赖在Addressables Groups窗口确保远程资源及其所有依赖都被正确标记和分组。3.平台匹配确保你构建的Player是StandaloneWindows64而服务器上的资源包也是StandaloneWindows64目录下的。跨平台资源不通用。移动设备真机无法加载资源1. 服务器启动命令未绑定0.0.0.0。2. 手机和电脑不在同一局域网。3. Remote Load Path中还是localhost。1.重启服务器使用python -m http.server 8080 --bind 0.0.0.0启动。2.获取电脑IP在电脑上通过ipconfig(Win) 或ifconfig(macOS/Linux) 查看本地IP地址如192.168.1.100。3.修改加载地址将游戏构建时的Remote Load Path改为http://192.168.1.100:8080/{BuildTarget}。或者更优雅的方式是写一段代码在运行时根据平台判断使用localhost还是局域网IP。修改资源后重新构建并覆盖服务器文件但游戏加载的仍是旧资源客户端缓存了旧的catalog或AssetBundle。1.清除Addressable缓存在游戏初始化代码中调用Addressables.ClearDependencyCacheAsync和清理UnityEngine.Caching。2.使用版本号在Addressable构建时启用Unique Bundle IDs或自定义构建脚本在资源名或catalog URL中加入哈希值或版本号强制客户端获取新的。对于本地开发最快捷的方法是重启游戏并重启Python服务器有时服务器句柄可能持有旧文件。Python报错No module named http.server使用的是Python 2.x 版本。http.server模块是Python 3才有的。确认你的Python版本使用python3命令启动。在Windows上如果只安装了Python 3可能python命令就是3.x版本。5. 本地模拟的边界与生产环境准备通过以上步骤我们已经成功搭建了一个高效的本地开发测试环境。但必须清醒认识到这只是模拟。它与真正的生产环境存在差异我们需要了解这些差异并为上线做好准备。主要差异点服务器性能与并发http.server是单线程的只能处理一个请求。生产环境需要使用高性能、高并发的Web服务器如Nginx、Apache或专业的CDN、云存储服务如AWS S3、阿里云OSS来托管资源包。网络环境本地网络是理想的零丢包、高带宽环境。生产环境会面临网络波动、延迟、丢包、弱网等问题。需要在代码中做好超时、重试、断点续传Addressable部分支持等逻辑。安全与权限本地服务器无任何安全措施。生产环境需要对资源进行防盗链、访问鉴权、HTTPS加密等处理。版本管理与发布本地测试时我们直接覆盖文件。生产环境需要严谨的版本管理和发布流程通常采用非覆盖式更新如将新资源包上传到新目录通过更新catalog指向新位置以支持版本回滚和A/B测试。上线前检查清单[ ]加载路径将Remote Load Path从http://localhost:8080/...更改为正式的生产环境URL如https://your-cdn.com/asset-bundle/{BuildTarget}/。[ ]构建脚本准备自动化构建脚本确保构建Addressable资源包后能自动上传到生产服务器或CDN。[ ]缓存策略与服务器端工程师确认为.bundle和.json文件设置正确的HTTP缓存头如Cache-Control平衡更新效率和流量成本。[ ]容错与降级在游戏代码中增加对网络加载失败的处理例如提示用户检查网络、提供重试按钮或在极端情况下使用内置的备用资源。[ ]数据分析集成数据分析SDK监控资源加载的成功率、耗时、失败原因以便快速定位线上问题。这套本地模拟方案的价值就在于让你在开发阶段以极低的成本提前验证了除网络环境和服务器性能外的几乎所有远程加载逻辑。当你把加载路径切换为生产环境地址后大部分代码和配置都无需改动从而平滑、自信地过渡到线上阶段。花5分钟搭建这个环境节省的将是后期无数个小时的联调与排错时间。

相关新闻

若依框架渗透测试实战:从SRC漏洞挖掘到权限提升完整复盘

若依框架渗透测试实战:从SRC漏洞挖掘到权限提升完整复盘

1. 项目概述:一次源于实战的SRC漏洞复盘 前段时间,我在一个企业SRC(安全应急响应中心)的众测项目中,遇到了一个基于若依(RuoYi)框架开发的后台管理系统。这其实是一个非常典型的场景&#xff0c…

2026/10/5 12:42:43 阅读更多 →
避坑指南:2026 枸杞原浆十大品牌发布,警惕添加剂与虚假宣传问题

避坑指南:2026 枸杞原浆十大品牌发布,警惕添加剂与虚假宣传问题

随着国民健康消费意识持续升级,枸杞原浆凭借 “开盖即饮、营养易吸收” 的特性,成为药食同源品类中增长最快的细分赛道之一。与此同时,市场扩容也带来了品质参差、成分掺假、宣传夸大等行业乱象:部分产品以干果复水冒充鲜果原浆&a…

2026/10/9 6:13:34 阅读更多 →
AI 桌面自动化 OpenClaw 安装教学 规范路径设置与 Gateway 调试(含安装包)

AI 桌面自动化 OpenClaw 安装教学 规范路径设置与 Gateway 调试(含安装包)

🦞 OpenClaw 本地智能自动化工具|可视化一键部署,免去环境搭建烦恼 适配系统:Windows10/11 64 位、macOS12 及以上 稳定版本:v2.7.9 功能亮点✨:全程图形可视化操作,不依赖命令行,G…

2026/10/11 7:58:11 阅读更多 →

最新新闻

昆明理工大学MBA复试真题详解:题型拆解与高效备考策略

昆明理工大学MBA复试真题详解:题型拆解与高效备考策略

26考研的时间点其实很微妙。初试刚结束那阵子,大多数人都在放松,觉得笔试考完就算过了大半关。但真正走过完整流程的人都知道,复试才是淘汰率最集中的环节,尤其对于昆明理工大学MBA这类报考热度一直不低的项目来说,复试…

2026/10/13 11:41:16 阅读更多 →
MATLAB热交换器求解器:构建传热-流体-物性全耦合计算闭环

MATLAB热交换器求解器:构建传热-流体-物性全耦合计算闭环

简介:本资源是一个基于MATLAB开发的换热器性能仿真计算工具包,面向能源动力、化工过程及热能工程领域的本科生、研究生与初级工程师,用于快速实现ε-NTU法建模与工况分析。工具包共4个文件,含3个核心MATLAB函数(effect…

2026/10/13 11:41:16 阅读更多 →
Spark+Scala实战:TMDB电影数据清洗与聚合分析全流程

Spark+Scala实战:TMDB电影数据清洗与聚合分析全流程

前阵子一直在补 Spark 的实操,想找个有一定规模、字段又足够丰富的公开数据集练手,翻了很多方向,最后锁定了 TMDB 电影数据。这个数据源在影视分析里很常见,里面有电影评分、票房、制作预算、类型、演员、关键词等一堆信息&#x…

2026/10/13 11:41:16 阅读更多 →
Agent技能设计指南:从单体提示词到高可靠技能库的落地实践

Agent技能设计指南:从单体提示词到高可靠技能库的落地实践

先别急着给Agent写代码,如果你正打算磕“agent-skills”,我强烈建议你先停下来,把几个关键思路理清。这个概念的圈内热度已经持续了不短的时间,很多人把它理解为“给Agent塞几十个工具函数就完事”,但真正做落地的时候…

2026/10/13 11:41:16 阅读更多 →
C++单元测试框架gtest实战:从断言机制到CI集成的完整指南

C++单元测试框架gtest实战:从断言机制到CI集成的完整指南

1. 初识gtest:为什么C开发者都绕不开这个测试框架写了十多年C,我见过太多项目在测试这件事上翻车。早期大家靠assert加打印日志,后来有人写个main函数手动调一遍所有接口,再后来CI流水线跑起来,才发现没有像样的单元测…

2026/10/13 11:41:16 阅读更多 →
【机器人控制】三台非全体移动机器人分散式领跟控制、基于李雅普诺夫的轨迹跟踪以及三角与柱形动态切换编队控制Matlab实现

【机器人控制】三台非全体移动机器人分散式领跟控制、基于李雅普诺夫的轨迹跟踪以及三角与柱形动态切换编队控制Matlab实现

✅作者简介:热爱科研的Matlab仿真开发者,擅长数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和数学建模资料 &…

2026/10/13 11:40:13 阅读更多 →

日新闻

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

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

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

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/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

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

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

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

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

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

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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 阅读更多 →