TEngine 内存优化策略实战指南:类型级内存池、实例级对象池与运行时监控
游戏开发【免费下载链接】TEngineUnity 商用级别开发框架原生内置 AI 工作流支持集成 HybridCLR 高性能热更、Obfuz 代码混淆加固、YooAssets 企业级资源管理方案构建高效、安全、可扩展的工业化开发底座。项目地址https://gitcode.com/gh_mirrors/teng/TEngine点击查看免费下载TEngine 的内存优化体系围绕「类型级内存池 实例级对象池 调试器监控 大对象缓冲区工具」四条主线展开通过批量预分配、队列复用、严格检查与可视化统计在保障稳定性的同时显著降低 GC 压力与分配抖动。本文以仓库 Wiki 文档 内存优化策略 为骨架结合 MemoryPool.cs 等核心源码逐层拆解实现原理读完即可掌握高频对象、大对象与临时缓冲区的完整优化方案。一、优化思路总览在 Unity 项目中托管堆上的频繁分配与释放是 GC 卡顿的主要来源每帧创建临时对象、字符串、容器都会触发增量式 GC进而引发帧耗时尖峰。TEngine 的应对思路是复用优先、预分配兜底、统计驱动以MemoryPool提供类型维度的对象复用同一类型对象在队列中周转分配/归还均为 O(1)以ObjectPoolModule提供实例维度的生命周期管理支持容量、过期时间、优先级与自动释放以调试器内置的内存池信息窗口与运行时内存采样窗口形成「观测 → 反馈 → 优化」闭环以 YooAsset 的BufferWriter/BufferReader处理大对象序列化/反序列化减少中间拷贝与临时分配。二、代码结构内存优化相关的 12 个核心文件内存优化逻辑集中在以下路径均位于仓库内可直接打开对照阅读归属文件职责内存池MemoryPool.cs全局静态门面分配/回收/统计/严格检查开关内存池MemoryPool.MemoryCollection.cs按类型的对象队列与六类计数内存池MemoryPoolExtension.csAllocT/Dealloc封装与MemoryObject基类内存池IMemory.cs统一清理接口内存池MemoryPoolInfo.cs只读统计结构体内存池MemoryPoolSetting.cs严格检查策略组件调试器DebuggerModule.MemoryPoolInformationWindow.cs内存池统计窗口调试器DebuggerModule.RuntimeMemoryInformationWindow.cs运行时内存采样窗口对象池ObjectPoolModule.cs对象池管理器对象池ObjectPoolBase.cs对象池抽象基类缓冲区BufferWriter.cs固定容量写入器缓冲区BufferReader.cs只读字节数组读取器依赖关系非常清晰MemoryPool作为门面委托MemoryCollection管理具体类型对象IMemory是统一接口MemoryPoolInfo是纯只读统计载体调试器窗口只通过GetAllMemoryPoolInfos()读取数据对象池与内存池并行存在各自解决不同粒度的复用问题缓冲区工具独立于内存池专供大对象序列化场景。三、内存池MemoryPool与内存集合MemoryCollection3.1 按类型组织的对象队列MemoryPool是一个static partial class内部通过DictionaryType, MemoryCollection按类型维护内存集合MemoryPool.csprivate static readonly DictionaryType, MemoryCollection _memoryCollections new DictionaryType, MemoryCollection();首次访问某类型时调用GetMemoryCollection(Type)惰性创建对应集合MemoryPool.cs并在lock保护下完成字典读写保证多线程环境下安全。每个MemoryCollectionMemoryPool.MemoryCollection.cs持有一个QueueIMemory空闲队列和六个计数UnusedMemoryCount空闲未使用对象数即队列长度UsingMemoryCount正在使用对象数AcquireMemoryCount/ReleaseMemoryCount累计获取/归还次数AddMemoryCount/RemoveMemoryCount累计预分配/移除次数。3.2 分配与归还路径分配路径AcquireTMemoryPool.MemoryCollection.cs_usingMemoryCount; _acquireMemoryCount; lock (_memories) { if (_memories.Count 0) { return (T)_memories.Dequeue(); // 命中空闲队列零分配 } } _addMemoryCount; return new T(); // 队列为空才真正 new队列非空时直接出队复用队列为空才执行new同时把这次新建计入AddMemoryCount。因此运行期能否「零分配」取决于预分配量与峰值并发是否匹配。归还路径ReleaseMemoryPool.MemoryCollection.csmemory.Clear(); // 先清空状态防止脏数据泄漏 lock (_memories) { if (_enableStrictCheck _memories.Contains(memory)) { throw new Exception(The memory has been released.); // 重复释放检测 } _memories.Enqueue(memory); } _releaseMemoryCount; _usingMemoryCount--;归还时强制调用memory.Clear()清理对象内部状态避免复用后残留上一次使用数据若开启严格检查且发现该对象已在队列中重复归还立即抛出异常。3.3 批量预分配与回收MemoryPool提供AddT(count)/Add(Type, count)批量预分配以及RemoveT(count)/RemoveAllT()批量回收MemoryPool.cs。MemoryCollection.Add会在lock内循环入队count个新实例Remove会截断超出部分若count _memories.Count则按队列实际长度处理不会越界见 MemoryPool.MemoryCollection.cs。典型用法是在关卡加载时预填充、切场景时批量收缩把「每帧随机 new」变成「预知的批量操作」从源头降低 GC 压力。3.4 统计接口与严格检查GetAllMemoryPoolInfos()MemoryPool.cs在锁内快照所有集合的七元组类型 六计数以MemoryPoolInfo[]返回供调试器只读展示不会阻塞业务线程。InternalCheckMemoryTypeMemoryPool.cs在严格检查开启时校验类型非 null、必须是非抽象 class、且实现了IMemory否则抛出异常防止把不满足契约的类型塞进池中。四、Alloc/Dealloc 与 MemoryObject 生命周期4.1 生命周期钩子仅靠IMemory.Clear()不足以支撑「取出即用」MemoryPoolExtension引入了MemoryObject抽象基类MemoryPoolExtension.cspublic abstract class MemoryObject : IMemory { public virtual void Clear() { } public abstract void InitFromPool(); // 出池初始化 public abstract void RecycleToPool(); // 回池清理 }InitFromPool()对象从池中取出后调用负责重置为「全新可用」状态RecycleToPool()对象归还前调用负责释放内部引用、置空字段。这保证了对象状态的可控与可预测也降低了复用对象携带脏数据泄漏到业务层的风险。4.2 Alloc / Dealloc 快捷封装MemoryPoolExtension.cs 提供成对入口public static T AllocT() where T : MemoryObject, new() { T memory AcquireT(); memory.InitFromPool(); return memory; } public static void Dealloc(MemoryObject memory) { if (memory null) { throw new Exception(Memory is invalid.); } memory.RecycleToPool(); Release(memory); }完整调用链为AllocT()→AcquireT()取实例 →InitFromPool()初始化 → 业务使用 →Dealloc(memory)→RecycleToPool()清理 →Release(memory)入队入队时还会再走一次Clear()。仓库中已有大量落地实践例如音频模块的 AudioData.cs 继承MemoryObject并使用MemoryPool.AcquireAudioData()/MemoryPool.Release(audioData)调试器控制台的LogNodeDebuggerModule.LogNode.cs、UI 模块的GameEventMgrUIBase.cs、Fsm 模块的FsmTFsm.cs、资源模块的AssetItemObject/LoadingStateAssetItemObject.cs等均走同一模式。甚至对象池模块内部也用MemoryPool.AcquireObjectT()来复用对象池节点ObjectPoolModule.Object.cs可见内存池是整框架对象复用的基础设施。五、MemoryPoolSetting 与严格检查开关5.1 四种策略枚举MemoryPoolSetting.cs 定义了MemoryStrictCheckType枚举枚举值含义AlwaysEnable 0总是启用严格检查OnlyEnableWhenDevelopment仅在开发模式Debug.isDebugBuild启用OnlyEnableInEditor仅在编辑器中Application.isEditor启用AlwaysDisable总是禁用5.2 组件行为MemoryPoolSetting是一个[DisallowMultipleComponent]的 MonoBehaviourMemoryPoolSetting.cs默认值OnlyEnableWhenDevelopment。在Start()中依据策略计算布尔值写入MemoryPool.EnableStrictCheck随后Destroy(gameObject)自我销毁启用时输出警告日志Strict checking is enabled for the Memory Pool. It will drastically affect the performance.因为EnableStrictCheck的 setter 内即打印该警告开发阶段可据此确认开关已生效。5.3 成本与取舍严格检查引入了两类额外开销Release时对队列执行Contains线性扫描重复释放检测以及Acquire(Type)/Release/Add(Type)前的反射类型校验。这两者在高频路径上的成本不可忽略因此生产环境应保持默认关闭或设为AlwaysDisable仅开发/联调阶段开启以快速暴露重复释放、类型不匹配等缺陷。六、调试器内存监控观测即优化6.1 内存池信息窗口DebuggerModule.MemoryPoolInformationWindow.cs 实现内存池统计面板核心交互顶部展示Enable Strict Check与Memory Pool Count两个全局项Show Full Class Name切换显示完整类名还是短类名按**程序集Assembly**分组组内以类名排序每行展示六列统计Unused / Using / Acquire / Release / Add / Remove。该窗口的数据源正是MemoryPool.GetAllMemoryPoolInfos()。通过观察「Using在用」与「Acquire/Release获取/归还」的增长趋势可以判断某个类型的对象是否未被归还泄漏征兆、预分配量是否匹配实际峰值、是否存在异常高频分配。6.2 运行时内存采样窗口DebuggerModule.RuntimeMemoryInformationWindow.cs 是泛型窗口RuntimeMemoryInformationWindowT where T : UnityEngine.Object点击Take Sample后执行采样L82-L114通过Resources.FindObjectsOfTypeAllT()枚举全部实例用Profiler.GetRuntimeMemorySizeLong获取每个实例的运行时内存字节数旧引擎分支回退到GetRuntimeMemorySize按大小降序排序单窗口最多展示前SHOW_SAMPLE_COUNT 300条重复样本检测若相邻样本的 Name、Type、Size 完全一致则标黄高亮并累计到duplicateSimpleCount/duplicateSampleSize用于识别「同名同尺寸的疑似重复资源」——例如多个场景引用了同一张未共享的贴图副本。Debugger.cs 内置了覆盖Object / Texture / Mesh / Material / Shader / AnimationClip / AudioClip / Font / TextAsset / ScriptableObject的采样窗口配合RuntimeMemorySummaryWindow可对任意资源类型做细粒度体检。七、对象池ObjectPoolModule实例级生命周期管理7.1 与内存池的分工内存池解决「类型级对象复用」同一类型的临时对象周转对象池解决「实例级生命周期管理」每个池可独立配置容量、过期、释放策略。两者可叠加使用对象池内部节点ObjectT本身也来自内存池形成双层复用。7.2 关键参数与默认值ObjectPoolModule.cs 定义的默认值private const int DEFAULT_CAPACITY int.MaxValue; // 默认容量不设上限 private const float DEFAULT_EXPIRE_TIME float.MaxValue; // 默认过期时间永不过期 private const int DEFAULT_PRIORITY 0; // 默认优先级ObjectPoolBaseObjectPoolBase.cs暴露的核心配置与操作AllowMultiSpawn是否允许同一对象被多次获取Capacity池容量上限ExpireTime对象过期秒数超期未用对象会被释放AutoReleaseInterval自动释放可释放对象的间隔秒数Priority模块轮询与释放优先级Release()/Release(int)/ReleaseAllUnused()按需释放可释放对象GetAllObjectInfos()获取全部对象快照配合ObjectPoolInformationWindow展示。ObjectPoolModule的模块优先级为6ObjectPoolModule.cs每帧Update轮询所有池执行过期判断与自动释放。7.3 典型使用形态通过CreateSingleSpawnObjectPoolT(name, capacity, expireTime, priority)系列重载创建对象池ObjectPoolModule.cs再以Spawn/Despawn获取与归还实例。适合管理子弹、特效、掉落物等「数量波动大、生命周期短」的高频实体。八、缓冲区工具大对象序列化的零拷贝方案8.1 BufferWriter固定容量写入器BufferWriter.cs 以构造时指定容量的byte[]为承载按小端字节序写入基础类型WriteByte/WriteBool/WriteInt16/WriteInt32/WriteInt64及无符号版本字符串与数组WriteUTF8长度以ushort前缀记录长度超过 65535 抛FormatException、WriteInt32Array/WriteInt64Array/WriteUTF8Array导出GetBytes()用Buffer.BlockCopy只拷贝有效区间WriteToStream(FileStream)直接把有效字节写入文件流避免中间数组拷贝越界保护CheckWriterIndex标记[Conditional(DEBUG)]仅 DEBUG 构建生效越界抛IndexOutOfRangeException正式发布零开销。8.2 BufferReader只读字节数组读取器BufferReader.cs 基于传入的只读byte[]提供对称读取IsValid判断缓冲区是否有效Capacity暴露总容量ReadBytes/ReadByte/ReadBool/ 各长度整数读取BitConverter.IsLittleEndian分支保证跨端序安全ReadUTF8/SkipUTF8/ 数组读取与写入端一一对应同样具备 DEBUG 越界校验。8.3 适用场景与收益在热更包下载、配置表加载、资源清单解析等大对象序列化路径上若逐字段 new 中间对象会产生大量临时数组与 GC 压力。固定容量缓冲区方案让分配只发生在构造阶段后续写入/读取全程复用同一块内存且通过BlockCopy批量搬运减少逐字节拷贝。使用建议预估峰值容量后一次性构造不够大时整体重建而不是在热路径上反复扩容。九、性能考量为什么这套组合能压住 GC批量预分配Add/Remove把分配/销毁集中在可控时机如切场景、进关卡消除运行期随机抖动队列复用 O(1)MemoryCollection的出队/入队均为常数时间吞吐远高于「分配 回收 GC 标记」严格检查的成本可控校验与Contains扫描只在开发期开启发布版零影响访问局部性按类型组织的队列 InitFromPool/RecycleToPool生命周期钩子让同一类型对象集中创建、集中复用有利于 CPU 缓存命中大对象零中间拷贝BufferWriter/BufferReader以固定容量块承载序列化减少临时对象与拷贝次数双层复用高频对象可同时套用对象池实例粒度与内存池类型粒度进一步摊薄分配频率。十、故障排查指南症状定位手段对应源码依据同一对象重复归还开启严格检查后Release抛出The memory has been released.MemoryPool.MemoryCollection.cs类型不满足契约Acquire(Type)/Release抛出类型校验异常MemoryPool.cs某类型对象异常增长内存池信息窗口观察Using / Acquire趋势定位未归还热点DebuggerModule.MemoryPoolInformationWindow.cs疑似重复资源占用内存运行时内存采样窗口按大小排序黄色高亮同名同尺寸样本DebuggerModule.RuntimeMemoryInformationWindow.cs缓冲区越界写入/读取DEBUG 构建下抛出IndexOutOfRangeException定位到具体字段BufferWriter.cs、BufferReader.cs十一、结论与最佳实践TEngine 的内存优化策略以「类型级内存池 实例级对象池 调试监控」为内核配合缓冲区工具完成大对象高效序列化四者协同实现了批量预分配、O(1) 队列复用、严格检查与统计可视化。落地建议开发阶段保持MemoryStrictCheckType.OnlyEnableWhenDevelopment开启内存池信息窗口与运行时采样窗口尽早暴露重复释放与内存泄漏生产环境严格检查改为AlwaysDisable持续观察统计指标而非关闭监控高频对象优先使用Alloc/Dealloc双层复用确保InitFromPool/RecycleToPool/Clear三阶段状态可控大对象与临时缓冲区用BufferWriter/BufferReader承载序列化预估容量后一次性构造避免在热路径上反复创建临时数组。赞分享游戏开发【免费下载链接】TEngineUnity 商用级别开发框架原生内置 AI 工作流支持集成 HybridCLR 高性能热更、Obfuz 代码混淆加固、YooAssets 企业级资源管理方案构建高效、安全、可扩展的工业化开发底座。项目地址https://gitcode.com/gh_mirrors/teng/TEngine点击查看免费下载相关推荐Archipelago内存优化对象池与缓存策略Archipelago内存优化对象池与缓存策略 概述 Archipelago作为一款多游戏随机化框架在处理大量游戏数据、网络通信和实时状态同步时面临着严峻的游戏开发后端ngxtop内存优化技术内存池与对象重用策略ngxtop内存优化技术内存池与对象重用策略 1. 引言内存瓶颈与优化必要性 在高并发场景下Nginx服务器的实时监控工具ngxtop面临着严峻的内存管理运维可观测性CLIJTAppleCalendar内存优化案例图片缓存与对象池实现JTAppleCalendar内存优化案例图片缓存与对象池实现 在iOS日历应用开发中频繁的日期单元格创建与销毁常导致内存峰值过高和卡顿问题。JTApple移动开发UI组件上一篇Docker Machine NFS与其他共享方案对比为什么NFS是开发环境的黄金选择下一篇Super Mario 64 相机平滑移动终极指南插值算法实现详解创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

策略迭代的MATLAB实现:从MDP建模到收敛判定与调参实战

策略迭代的MATLAB实现:从MDP建模到收敛判定与调参实战

简介:一份面向机器学习与强化学习初学者的MDP策略迭代MATLAB实践资源,以马尔科夫决策过程为背景,重点演示策略评估与策略改进两个核心步骤的实现过程。压缩包共93个文件,以m源码、html文档和dat数据为主,另有txt说明、…

2026/10/14 2:18:23 阅读更多 →
Natron 插件指南:G‘MIC Selective Desaturation 选择性去饱和节点详解

Natron 插件指南:G‘MIC Selective Desaturation 选择性去饱和节点详解

音视频视频处理图形学桌面应用 【免费下载链接】Natron Open-source video compositing software. Node-graph based. Similar in functionalities to Adobe After Effects and Nuke by The Foundry. 项目地址: https://gitcode.com/gh_mirrors/na/Natron 点击查看 …

2026/10/14 2:18:23 阅读更多 →
单片机毕设项目:基于STM32的智能洗衣机水位烘干消毒控制装置设计 基于单片机的洗衣机水位洗涤烘干消毒系统设计(032802)

单片机毕设项目:基于STM32的智能洗衣机水位烘干消毒控制装置设计 基于单片机的洗衣机水位洗涤烘干消毒系统设计(032802)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/10/14 2:18:23 阅读更多 →

最新新闻

一张图微调YOLOv11:自然栖息地鸟类检测的流程与扩充

一张图微调YOLOv11:自然栖息地鸟类检测的流程与扩充

简介:面向 YOLOv11 模型验证需求,这份精简版鸟类目标检测数据集包含一张真实野外鸟类图像及配套标准标注,可用于快速原型验证、轻量级部署测试与小样本检测基线建立。压缩包共五个文件,包含三张 JPG 图像、一个数据配置文件与一个…

2026/10/14 3:39:38 阅读更多 →
ASP.NET + SQLServer葡萄酒商城源码:从数据库还原到下单事务全攻略

ASP.NET + SQLServer葡萄酒商城源码:从数据库还原到下单事务全攻略

简介:一套基于ASP.NET与SQL Server的葡萄酒网上商城销售系统,面向ASP.NET WebForm学习者、毕业设计学生以及需要搭建在线商城教学演示的开发者。系统围绕普通会员、商户会员和管理员三类角色展开,覆盖商品管理、购物车、订单处理、发货、商户…

2026/10/14 3:39:38 阅读更多 →
LangChain项目代码拆解:Chain、Agent、Memory与Retrieval四大核心组件实战指南

LangChain项目代码拆解:Chain、Agent、Memory与Retrieval四大核心组件实战指南

简介:这是一份LangChain入门与实践的项目代码包,面向正在学习大模型应用开发的Python开发者,旨在帮助读者快速理解LangChain的模块化设计与核心用法。包内共3个文件,包含一个HTML格式的入门讲解页、一个项目运行配置文件以及一个版…

2026/10/14 3:39:38 阅读更多 →
C++学习日记 Day21:C++11(下)lambda表达式和function包装器

C++学习日记 Day21:C++11(下)lambda表达式和function包装器

## 今天学了什么今天学习C11的lambda表达式和function包装器。## 可调用对象概念:在C中有一类对象可像函数一样调用;分类:①函数指针using prt void(*)(int, string); prt f1 fun; f1(1, "函数指针");②仿函数 --有 operator&am…

2026/10/14 3:39:38 阅读更多 →
一人公司AI工作流:6步实现内容生产去体力化

一人公司AI工作流:6步实现内容生产去体力化

1. 一人公司的内容困局与破局思路一个人做内容,最怕的不是没灵感,而是灵感来了却卡在“执行”上。写一篇长文要三小时,做一张配图要半小时,剪一条短视频要一整个下午,排版发布又要来回切换四五个平台。一天下来&#x…

2026/10/14 3:39:38 阅读更多 →
8765平台前后摄DVDD电压不一致排查与修复指南

8765平台前后摄DVDD电压不一致排查与修复指南

/* 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 3:38:38 阅读更多 →

日新闻

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

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

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