Unity游戏寻路性能优化:从A*到JPS算法实战与性能对比
1. 项目概述一次从A*到JPS的寻路性能革命如果你正在用Unity开发一款带有复杂地图的游戏无论是开放世界、RTS还是Roguelike寻路系统绝对是性能优化的重灾区。我最近就踩进了这个坑里一个中等规模的策略游戏项目当屏幕上同时有上百个单位需要寻路时帧率直接从60掉到了20以下CPU占用率飙升。最初的方案是业界“标配”的A*算法它稳定、可靠但在大规模、高频次的寻路请求面前其计算开销成了性能瓶颈。经过一轮深度优化我将核心寻路算法从经典的A*替换为JPSJump Point Search跳点搜索最终在相同测试场景下寻路计算的整体耗时减少了约70%反映到游戏整体性能上帧率提升了超过300%。这不仅仅是换了个算法那么简单而是一次对寻路系统从数据结构、缓存策略到异步调度的全面重构。这篇文章我就来拆解这次优化的完整思路、实操步骤以及那些只有踩过坑才知道的细节。无论你是正在被寻路性能困扰的开发者还是希望提前规避问题的学习者相信这些实战经验都能给你带来直接的帮助。2. 寻路算法选型为什么是JPS而不是别的在动手之前搞清楚“为什么”比知道“怎么做”更重要。游戏寻路领域算法众多除了A和JPS还有Dijkstra、BFS、IDA以及针对特定场景的算法如HPA*分层路径规划。盲目更换算法可能事倍功半。2.1 A*算法的瓶颈分析A算法之所以成为游戏寻路的事实标准是因为它在“最优路径”和“搜索效率”之间取得了很好的平衡。它通过启发式函数通常是曼哈顿距离或欧几里得距离来引导搜索方向避免像Dijkstra那样盲目扩展所有节点。但在网格Grid地图中A的瓶颈非常明显节点扩展数量庞大在均匀、无障碍的网格上A*会逐个评估每个相邻的网格点。对于一个100x100的地图从一角到另一角最坏情况下它需要探索成千上万个节点。开放列表维护开销大A*需要频繁地从开放列表Open List中取出估值最低的节点。这个列表通常用优先队列如二叉堆实现每次插入和删除都是O(log N)的复杂度。当节点数量巨大时这个开销不容忽视。对称路径冗余搜索在网格中从A到B往往存在多条等价的对称路径例如先向右再向下与先向下再向右。A*会平等地探索这些路径直到其中一条率先到达终点这造成了大量的冗余计算。在我的项目中通过性能分析器Unity Profiler可以清晰看到Pathfinding.CalculatePath这个函数占据了超过30%的CPU时间其内部就是A*的主循环和开放列表的维护操作。2.2 JPS算法的核心优势JPS即跳点搜索它不是一个完全独立的算法而是A*在均匀网格地图上的一个“优化插件”。它的核心思想是“跳过”那些不必要的、对称的中间节点直接“跳”到下一个关键决策点——跳点Jump Point。JPS的工作原理可以类比为“走大路抄近道” 想象你在一个规则的城市街区找人。A*的做法是站在每个十字路口都考虑东、南、西、北四个方向的下一个路口一步步挪过去。而JPS的做法是当你站在一个路口发现向东是一条笔直无阻的大路你会直接沿着这条路跑到尽头直到遇到死胡同、拐弯点或目的地而不会在中间的每个小路口都停下来思考。技术上的实现JPS主要做了两件事修剪邻居Pruning Neighbors在扩展一个节点时JPS会根据当前移动方向和对父节点的回溯智能地判断哪些邻居是“自然”的、必须被考虑的哪些是可以通过“跳跃”规则推导出来的冗余邻居。这极大地减少了每次节点扩展时需要评估的邻居数量从最多8个减少到通常1-3个。跳跃Jumping确定了强制邻居后算法会沿着该方向进行直线或对角线的扫描直到遇到一个“跳点”。跳点包括目标点、障碍物的拐角点、或者存在“强制邻居”的点。这个跳跃过程一次性跨越了大量无需决策的中间点。带来的性能红利是直接的搜索节点数大幅减少在开阔区域JPS探索的节点数可能只有A*的1/10甚至更少。开放列表操作锐减因为需要加入开放列表的跳点数量很少所以优先队列的插入/删除操作也急剧减少。路径质量等同JPS找到的路径和A*找到的路径在长度上是完全一致的都是最短路径。注意JPS的强大优势依赖于一个前提——地图必须是基于网格的并且障碍物信息是明确的。对于导航网格NavMesh或者路点Waypoint图JPS并不适用。我的项目恰好使用的是标准的二维网格来管理游戏逻辑上的可行走区域这为JPS的引入创造了完美条件。2.3 其他算法考量与最终决策我也评估过其他方案HPA分层路径规划*它通过将大地图抽象成由“簇”构成的粗粒度图先进行高层规划再进行局部细化。这对于超大规模静态地图如MMO是终极解决方案。但我的项目地图是动态的可破坏地形、临时障碍物HPA*的预计算和动态更新成本较高显得有些“杀鸡用牛刀”。DOTS/Jobs SystemUnity的面向数据技术栈可以将寻路计算并行化。这是一个非常好的辅助手段可以与JPS结合用多线程来同时计算多个单位的寻路请求。我最终也采用了这个方案但这属于“计算框架”优化而非“算法”优化。最终决策链动态网格地图 - 高频次寻路 - 追求单次寻路极致速度 -JPS是当前最优解。确定了方向接下来就是具体的实现与集成。3. Unity中实现JPS从理论到可运行代码将论文中的算法转化为游戏里稳定运行的代码需要处理大量的工程细节。我参考了经典的JPS算法描述并在Unity C#环境中进行了实现和适配。3.1 基础数据结构设计首先需要设计高效的数据结构来支撑算法。// 1. 跳点Jump Point结构体 public struct JumpPoint { public Vector2Int position; // 网格坐标 public JumpPoint parent; // 父跳点用于回溯路径 public float gCost; // 从起点到该点的实际代价 public float hCost; // 到终点的启发式代价 public float FCost gCost hCost; // 总代价 // 比较器用于优先队列 public int CompareTo(JumpPoint other) FCost.CompareTo(other.FCost); } // 2. 地图网格数据接口 public interface IGridMap { int Width { get; } int Height { get; } bool IsWalkable(Vector2Int coord); // 判断格子是否可行走 float GetMovementCost(Vector2Int from, Vector2Int to); // 获取移动代价可用于支持不同地形 } // 3. 方向定义 private static readonly Vector2Int[] StraightDirections { ... }; private static readonly Vector2Int[] DiagonalDirections { ... };设计要点使用Vector2Int代替Node类来存储坐标减少GC垃圾回收压力。IGridMap接口将算法与具体的地图数据解耦便于测试和替换例如可以从简单的二维布尔数组切换到更复杂的 chunk 管理的地图。移动代价函数GetMovementCost为后续支持不同地形如沼泽、道路留出了扩展空间。3.2 JPS核心算法实现算法的核心是两个递归函数JumpStraight直线跳跃和JumpDiagonal对角线跳跃以及一个主循环FindPath。关键函数直线跳跃private JumpPoint? JumpStraight(Vector2Int current, Vector2Int direction, Vector2Int goal) { Vector2Int next current direction; // 1. 边界和障碍物检查 if (!IsWithinBounds(next) || !map.IsWalkable(next)) return null; // 2. 到达终点检查 if (next goal) return new JumpPoint { position next }; // 3. 强制邻居检查这是JPS的精华 // 检查在next点沿着direction方向移动时侧向是否出现必须转向的“强制邻居” if (HasForcedNeighbor(next, direction)) { return new JumpPoint { position next }; // 发现跳点 } // 4. 递归继续向前跳跃 return JumpStraight(next, direction, goal); }HasForcedNeighbor的实现逻辑 假设我们正在向右1,0移动。我们会检查当前点的上方0,1和下方0,-1两个侧向格子。如果右侧是障碍物而右上方是可走的那么右上方的点就是一个“强制邻居”。因为从当前点要到右上方必须先在当前点向右转这符合跳点的定义。这个检查使得算法能在障碍物拐角处及时“刹车”识别出关键决策点。主寻路函数FindPath的流程初始化开放列表优先队列和关闭集合HashSet用于记录已处理的跳点。将起点作为初始跳点加入开放列表。循环从开放列表取出FCost最小的跳点 a. 如果是终点路径查找成功回溯生成路径。 b. 否则将其加入关闭集合。 c. 识别该跳点的所有“自然邻居”根据修剪规则。 d. 对每个自然邻居调用Jump函数进行跳跃探索。 e. 如果跳跃发现了一个新的跳点计算其gCost、hCost并加入开放列表如果该点不在关闭集合中或者找到了更优的gCost。如果开放列表为空仍未找到终点则路径不存在。3.3 Unity集成与性能考量在Unity中我们需要将算法与游戏循环结合起来。1. 单帧时间片管理 复杂的寻路不能在一帧内完成否则会造成卡顿。我实现了迭代式的寻路计算每次Update只执行一定数量的算法循环迭代例如处理开放列表中的100个节点直到路径计算完成。这需要将寻路状态机化。2. 路径请求队列与异步 为每个需要寻路的单位如AI角色创建一个PathRequest包含起点、终点、回调函数。一个单独的Pathfinder管理器每帧从队列中取出若干个请求进行处理计算完成后在主线程调用回调通知单位移动。这避免了在AI的Update中直接调用阻塞式的寻路函数。3. 缓存与复用路径缓存对于静态地图上频繁请求的相同起点终点对比如单位常驻点之间的路径可以将结果缓存起来。使用Dictionary(Vector2Int, Vector2Int), ListVector2Int作为缓存池。网格数据预计算如果地图的可行走区域在运行时不变可以在加载时预计算一个二维的布尔数组walkableGrid这样IsWalkable查询就是O(1)的数组访问比通过物理碰撞检测快几个数量级。4. 使用Unity Job System进行并行化 这是性能提升的另一个关键。JPS算法本身是独立的多个寻路请求之间没有数据竞争。我们可以将多个PathRequest打包成NativeArray然后创建一个IJobParallelFor作业来并行处理它们。[BurstCompile] // 使用Burst编译器获得极致性能 public struct JPSPathfindingJob : IJobParallelFor { public NativeArrayPathRequest requests; public GridData gridData; // Blittable类型的地图数据 public NativeArrayPathResult results; public void Execute(int index) { PathRequest request requests[index]; // 在这里执行单线程的JPS算法逻辑 ListVector2Int path JPSCalculate(request.start, request.end, gridData); results[index] new PathResult { path path, requestId request.id }; } }在管理器脚本中每帧将累积的请求提交给Job System调度执行。实测下来在拥有8个逻辑核心的机器上同时处理几十个寻路请求使用Jobs比纯主线程快了近4倍。将JPS算法优化与Jobs System并行化优化结合产生了巨大的乘数效应。4. 性能对比测试与数据分析优化不能凭感觉必须有数据支撑。我设计了一套标准的测试场景用于对比优化前后的性能。4.1 测试环境与方法硬件Intel i7-12700H, 32GB RAM。软件Unity 2022.3 LTS, Profiler深度分析。测试场景一张256x256的网格地图随机生成30%的不可行走区域模拟复杂地形。测试用例压力测试同时为200个随机位置的单位寻路到随机目标点。长路径测试计算地图对角线方向最长距离的路径。典型操作测试模拟玩家框选50个单位指挥他们移动到同一个目标区域。测量指标单次寻路平均耗时ms峰值CPU耗时Profiler中Pathfinding相关函数的ms整体游戏帧时间msGC Alloc寻路一帧产生的垃圾内存4.2 测试结果对比我制作了以下对比表格数据一目了然测试项原始A*算法 (单线程)JPS算法 (单线程)JPS Jobs System (并行)性能提升压力测试 (200单位)总耗时: ~480ms总耗时: ~145ms总耗时: ~42ms 1000%峰值CPU: 42ms峰值CPU: 15ms峰值CPU: 8ms帧时间: 卡顿明显帧时间: 轻微卡顿帧时间: 流畅(16ms)长路径测试 (单次)平均: 12.5ms平均: 3.8ms平均: 4.1ms*~300%探索节点: ~8500探索节点: ~1200探索节点: ~1200典型操作测试帧时间峰值: 38ms帧时间峰值: 18ms帧时间峰值: 11ms 300%GC Alloc /帧~45 KB~8 KB~1.5 KB减少96%注长路径测试单次计算并行化优势不明显甚至因Job调度有微小开销。但实际游戏中多为大量并发短路径请求并行优势巨大。结果分析算法效率JPS在探索节点数上对A*形成了碾压性优势减少85%以上这是其性能提升的根本。并行化收益Jobs System将计算负载分摊到多个核心在处理大量并发请求时总耗时不再是线性叠加而是被核心数“除”了一下这是帧率提升300%的关键。内存与GC由于使用了struct而非class以及Native容器GC分配大幅减少避免了频繁垃圾回收引起的帧率波动游戏体验更加平滑。5. 实战中的坑与优化技巧纸上得来终觉浅绝知此事要躬行。在实现和集成JPS的过程中我遇到了不少预料之外的问题也总结出一些至关重要的技巧。5.1 常见问题与解决方案问题1路径在障碍物边缘“抖动”或穿模现象单位移动时路径贴障碍物太近视觉上感觉要撞上有时甚至因为碰撞体精度问题真的卡住。根因JPS找到的是网格中心的路径。如果障碍物占满格子路径点就在障碍格子的边上。解决方案路径后处理寻路完成后对路径进行“平滑”或“膨胀”。一种简单有效的方法是“拐点字符串拉直”String Pulling从起点开始尝试连接后续的非相邻路径点如果连线不穿过障碍物就跳过中间点。这能使路径更贴近可走区域的中心。碰撞体处理在移动逻辑中使用比视觉模型稍小的“行走碰撞体”或者在移动时进行轻微的径向偏移检测。问题2动态障碍物如其他移动单位导致频繁重新寻路现象单位A寻路前往目标途中单位B移动过来挡住了去路A检测到阻塞立即重新开始一次完整的寻路造成性能浪费和移动抽搐。解决方案实现局部避障与路径重规划分离。局部避障使用简单的向量场Vector Field、RVO互惠速度障碍或者甚至只是一个朝着当前路径点移动并带有小范围碰撞回避的物理力来处理临时的、小范围的阻塞。重规划触发器只有当初始路径被静态障碍物如新建立的建筑长时间阻塞或者单位偏离路径超过一定阈值时才触发昂贵的全局JPS重寻路。可以设置一个重寻路的冷却时间。问题3启发式函数Heuristic的选择影响巨大现象在允许对角线移动的8方向网格中使用欧几里得距离作为启发式函数会导致JPS在开阔地带探索略多的节点。解决方案对于网格寻路切比雪夫距离Chebyshev Distance或对角线距离Octile Distance是更合适的启发式函数。它们能更准确地估计在8方向移动下的实际代价引导算法更高效地朝向目标。// 对角线距离 (假设直线代价为1对角线代价为√2≈1.4) float dx Mathf.Abs(a.x - b.x); float dy Mathf.Abs(a.y - b.y); float h 1.0f * (dx dy) (1.414f - 2 * 1.0f) * Mathf.Min(dx, dy);问题4移动单位尺寸大于单个网格现象游戏中的战车、巨兽等单位占据2x2或更大格子简单的单点寻路会导致它们穿过狭窄的走廊。解决方案使用膨胀障碍物Obstacle Inflation技术。在寻路前根据单位的半径将原始障碍物网格向外“膨胀”相应的格数生成一个对该单位有效的“可行走区域”网格。然后单位在这个膨胀后的网格上作为单点进行寻路。虽然预处理有开销但寻路算法本身无需修改。5.2 高级优化技巧分层寻路Two-Tier Pathfinding对于超大地图可以结合JPS和路点图。先在高层的路点图上用A*或Dijkstra规划一条粗略路径从区域A到区域B然后在每个区域内部使用JPS进行精细的、网格级别的寻路。这非常适合开放世界游戏。方向优先跳跃在Jump函数中优先进行直线方向的跳跃再尝试对角线方向。因为直线跳跃更快检查逻辑简单且在实际路径中占比更高。这个微小的顺序调整能带来约5%的性能提升。使用内存池频繁创建和销毁ListVector2Int来表示路径会产生GC。可以预先创建一个ListVector2Int的对象池寻路完成后将路径数据复制到池中取出的对象用完后归还实现零分配。Profiler是你的最佳伙伴永远不要猜测性能瓶颈在哪里。持续使用Unity Profiler的CPU和内存模块锁定JPSCalculate、Jump、HasForcedNeighbor这些热点函数观察它们的调用次数和耗时优化才有针对性。这次从A到JPS的迁移不仅仅是一次算法的升级更是一次对游戏性能优化思维的训练。它告诉我面对性能问题最有效的往往不是更快的硬件而是更优的算法和更精巧的设计。当你看到Profiler中那根刺眼的高峰被彻底削平时那种成就感是无可替代的。如果你的游戏也受困于寻路性能不妨从分析A的瓶颈开始一步步引入JPS和并行计算相信你也能获得显著的性能提升。

相关新闻

Whisper-Streaming终极指南:如何快速构建实时语音转写系统

Whisper-Streaming终极指南:如何快速构建实时语音转写系统

Whisper-Streaming终极指南:如何快速构建实时语音转写系统 【免费下载链接】whisper_streaming Whisper realtime streaming for long speech-to-text transcription and translation 项目地址: https://gitcode.com/gh_mirrors/wh/whisper_streaming 还在为…

2026/10/7 17:37:22 阅读更多 →
Wand-Enhancer终极指南:5分钟免费解锁Wand游戏修改器所有高级功能

Wand-Enhancer终极指南:5分钟免费解锁Wand游戏修改器所有高级功能

Wand-Enhancer终极指南:5分钟免费解锁Wand游戏修改器所有高级功能 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/GitHub_Trending/we/Wand-Enhancer 还在为Wand&#xff…

2026/10/13 11:56:10 阅读更多 →
一站式测试平台TestHub:核心架构、关键模块与落地实践全解析

一站式测试平台TestHub:核心架构、关键模块与落地实践全解析

1. 项目概述:TestHub测试平台的核心定位 最近在和一些测试团队负责人交流时,发现大家普遍面临一个困境:测试工具繁多,用例管理、缺陷跟踪、自动化执行、性能压测、安全扫描各成孤岛,数据不通,流程割裂。一个…

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

最新新闻

Windows平台Rust开发环境配置与优化指南

Windows平台Rust开发环境配置与优化指南

1. Rust语言与Windows环境适配背景Rust作为一门系统级编程语言,其编译器工具链对操作系统底层有着深度依赖。在Windows平台进行Rust开发需要特别注意环境配置的差异性——与Linux/macOS不同,Windows存在MSVC和GNU两种ABI(应用程序二进制接口&…

2026/10/14 2:25:24 阅读更多 →
长波红外超构透镜偏振复用FDTD仿真全流程解析

长波红外超构透镜偏振复用FDTD仿真全流程解析

1. 项目背景与核心价值长波红外超构透镜偏振复用聚焦技术是近年来光学领域的前沿研究方向。作为一名光学工程师,我在实际项目中发现传统红外光学系统存在体积大、重量沉、功能单一等问题。而基于超构表面的偏振复用透镜,能在单层平面上实现多通道光学功能…

2026/10/14 2:25:24 阅读更多 →
2026 查重率和 AIGC 率都飘红?一站式降AI率软件实测推荐

2026 查重率和 AIGC 率都飘红?一站式降AI率软件实测推荐

一、前言:2026 高校论文审核新难题随着高校学术审核体系不断升级,知网、维普等主流检测平台全面上线AIGC 智能检测功能,当代毕业生的论文写作与修改迎来双重考验。以往论文仅需攻克重复率超标问题,如今还要规避AI写作痕迹检测风险…

2026/10/14 2:25:24 阅读更多 →
摄影工作室AI提效手册:婚纱写真儿童摄影的修图、营销与交付(v1.0)

摄影工作室AI提效手册:婚纱写真儿童摄影的修图、营销与交付(v1.0)

摄影工作室AI提效手册:婚纱、写真、儿童摄影的修图营销与交付版本 v1.0  2026年10月写在前面:这本手册解决什么这本手册写给三类人:开婚纱影楼的老板与修图主管、拍个人写真和家庭照的独立摄影师、做儿童摄影工作室的店长与后期。你大概率已…

2026/10/14 2:25:24 阅读更多 →
流水线设计实战:从冒险机制到乱序执行的性能优化

流水线设计实战:从冒险机制到乱序执行的性能优化

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

2026/10/14 2:25:24 阅读更多 →
【数据可视化-155】第十五届全运会乒乓球男单半决赛:樊振东VS王楚钦技术分析报告

【数据可视化-155】第十五届全运会乒乓球男单半决赛:樊振东VS王楚钦技术分析报告

🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN人工智能领域的优质创作者,提供AI相关的技术咨询、项目开发和个…

2026/10/14 2:24:24 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

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

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

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

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

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

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

2026/10/13 16:22:04 阅读更多 →
影刀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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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 阅读更多 →