游戏引擎全解析:从历史原理到选型实践与Mod生态
聊游戏引擎之前先看一组对比1958年物理学家William Higinbotham用一台示波器做出了《双人网球》一个人、几小时、几百行代码而今天一款3A游戏动辄几百人开发三五年代码量以千万行计。中间差了些什么除了图形、物理、AI这些技术在往前跑还有一个容易被忽略的东西——游戏引擎。1. 引擎这个词最开始是个比喻1.1 引擎不是一个软件而是一整套公共设施很多人对游戏引擎的理解是从Unity、Unreal这些商业产品开始的下载一个安装包双击打开拖几个模型进去就能跑起来。于是下意识把引擎等同于一个做游戏的软件。这个理解不算错但很片面。我更愿意把引擎理解成一整套公共设施。一套公寓楼每家每户装修风格完全不同但水管、电路、燃气、电梯、消防通道是共用的。开发游戏也一样你做的解谜游戏和隔壁团队做的赛车游戏玩法千差万别但大家都要渲染画面、读取输入、播放音频、加载资源、管理内存。把这些每个游戏都要用的底层能力抽出来统一实现、统一维护就是引擎。拆开看一个现代游戏引擎至少包含这些模块模块负责什么通俗类比渲染系统把场景变成屏幕上的像素舞台布景和灯光师物理系统碰撞、刚体、关节、力剧组的威亚和替身调度音频系统音效、BGM、混音、3D定位现场收音和混音师输入系统键盘、手柄、触摸、体感引导观众互动的场务游戏循环驱动每帧更新、固定步长打节拍的总指挥资源管理加载、缓存、流送、卸载库房管理员场景/实体系统管理场景里所有对象及其关系排班表和岗位地图编辑器可视化搭建关卡、配置逻辑导演的监视器和剧本每个模块单独拿出来都是能写一本书的领域。引擎做的事情就是把它们整合好让做游戏的人不用每次从零焊水管。1.2 那为什么不能每次从头写算一笔时间账有人会问既然引擎只是公共代码那我自己每次从头写不就行了行但你要承受成本。我见过不止一个小团队项目立项时雄心勃勃要自研引擎结果三个月后发现光是把在屏幕上画一个旋转的立方体稳定跑在60帧就已经耗掉两个人。等到要做场景流送、阴影、物理网格烘焙时基本就放弃了。说句实在话引擎解决的根本不是能不能做出来的问题而是能不能在有限预算内做完的问题。游戏行业是内容密集型行业成本大头在美术资产、关卡设计、程序逻辑。如果每次项目都把底层渲染、物理、资源系统重写一遍那就等于每次搬家都重新挖地基没人耗得起。所以引擎的本质是一笔时间账把一次性投入摊薄到多个项目里让团队把精力集中到这个游戏特别的地方上。明白这一点后面所有关于引擎选型、引擎架构、引擎生态的讨论才有了共同的坐标系。2. 从《德军总部3D》到虚幻引擎是怎么一步步变成今天这样的2.1 单文件游戏的年代代码就是整个游戏最早的游戏没有引擎这个概念。雅达利2600时代游戏Rom里就是一段直接操作硬件寄存器的程序画面、逻辑、输入全部揉在一起。程序员写一个游戏这个游戏就等于这份代码本身。你想再做一个玩法类似的游戏从头再来吧。就连80年代早期的PC游戏也差不多。我当时翻老代码资料时有个特别深的感受那些代码里到处都是写给当前这台机器的痕迹——直接访问显存地址、针对特定声卡写中断处理、帧率绑定CPU主频。代码换一台机器就废一半更别说换一个游戏了。后来有人开始把大家都会用到的那部分抽出来形成最早的库和框架。比如1987年Gary Kitchen做的GameMaker工具已经提供角色、动画、音效、操控这类API开发者只要调用接口不用关心底层怎么画点。但那时候还没有人把这套东西叫引擎。2.2 数据驱动和授权模式id Software把引擎变成了产品公认的转折点在90年代初的id Software。1992年的《德军总部3D》、1993年的《毁灭战士》不仅游戏本身出名更重要的是它们的代码架构拉开了和同代产品的差距。《毁灭战士》采用了一种当时相当超前的设计游戏内容地图、贴图、怪物配置全部放在外部数据文件WAD里引擎代码则负责通用渲染和逻辑处理。地图编辑器甚至允许玩家自己搭关卡、替换贴图——这就是最早的Mod。你能改数据就换了一个游戏而引擎本身没动。这种数据驱动的架构是游戏和引擎正式分家的标志。更关键的是商业模式上的动作。id Software把自己的引擎代码授权给其他公司使用任天堂、动视、Raven Software等一堆厂商基于id Tech系列做了自己的射击游戏。以前大家都觉得我的代码是我的核心竞争力凭什么给别人id的实际操作证明了另一件事引擎本身可以成为产品授权费甚至比卖游戏还赚钱。1998年Epic Games推出《虚幻》把这条路线推上了新高度。Unreal引擎不只是一个渲染器它还包括了一个完整的编辑器、脚本语言UnrealScript、网络同步、关卡流送——这些至今仍是引擎的标配。从这时候起引擎不再是一堆库的别称而是一整套面向项目的生产工具链。2.3 商业引擎崛起从无人问津到巨头林立时间线再往后拉2005年Unity 1.0发布它干了件关键的事把引擎从给少数大厂用的昂贵工具变成给所有人用的便宜工具。Unity早期主打Mac平台的独立开发者后来靠着跨平台导出iOS、Android和低学习门槛横扫移动游戏时代。到今天全球一半以上手游都用Unity做的这话真不夸张。同一时间Unreal也没有闲着从虚幻3到虚幻4、虚幻5Epic几乎成了画面天花板的代名词而且4代开始宣布游戏收入超过100万美元才分成大幅降低了小团队试用门槛。现在看引擎格局大致是Unreal大场景、高画质、主机和PC为主C和Blueprint双轨Unity跨平台、小团队友好、手游和独立游戏主力C#为主GodotMIT开源、轻量、2D强社区驱动的新势力自研引擎一些大厂和3A工作室保留的独门武器。如果你把引擎的历史串起来看会发现一条主线引擎一直在做分离和抽象——把游戏内容和底层技术分开把硬件差异抹平把跨平台变成点击一个按钮的事。每一代新引擎的诞生本质上都是在这两条轴上往更远处推了一把。3. 引擎在一帧里到底干了多少活以16毫秒为例3.1 游戏循环引擎的心脏起搏器聊引擎原理绕不开一个最核心、最基础的概念游戏循环。无论什么引擎骨子里都是同一个模式while (running) { 处理输入(); 更新游戏逻辑(); 模拟物理(); 执行AI和动画(); 渲染场景(); 播放音频(); }这个循环每跑完一圈就是一帧。60fps意味着1秒转60圈一圈约16.67毫秒。玩家觉得卡多数情况下不是电脑死机而是引擎没办法在这一圈规定时间内干完所有活帧时间涨到了30ms、50ms甚至更糟。有个反直觉的地方以功能复杂度来看引擎在一帧里干的事情非常多但真正让玩家感觉顺畅的反而是最平淡的那件事——稳定。稳定到你的输入到屏幕反馈之间的延迟保持在一个固定水平大脑就会自动把这一连串画面缝合成流畅的动作。这也是为什么引擎开发者对帧时间抖动Frame Time Spike比对平均帧率更敏感。3.2 一帧时间怎么花预算表有一次我帮朋友调一个Unity项目的性能用Profiler抓了帧数据发现很多新手根本没概念真以为卡是因为模型面数太多其实瓶颈往往在更隐蔽的地方。给你看一张典型的60fps帧预算表环节大概耗时说明输入收集和分发0.5ms手柄、键盘、触摸事件汇总游戏逻辑脚本、AI、动画更新2~4ms所有MonoBehaviour/蓝图节点的Update物理模拟1.5~3ms碰撞检测、刚体动力学往往有固定步长场景管理和剔除1~2ms决定哪些物体可见、需要提交渲染线程提交CPU侧2~4ms组织Draw Call、上传变换矩阵GPU执行真正的画4~8ms顶点处理、光栅化、着色音频、UI、其他0.5~2ms混音、Canvas布局等注意表里前几项加起来可能只有10ms而画这件事本身CPU提交GPU执行往往占一半以上。所以很多游戏在低分辨率下帧率暴增就是因为GPU压力骤减。3.3 渲染不是画图而是一条工厂流水线很多人以为渲染就是把模型画到屏幕上实际上渲染是一条流水线场景里的物体先经过CPU侧剔除只保留摄像机看得到的部分然后顶点数据交给GPU经过顶点着色器变换到屏幕空间、光栅化成一个个像素碎片、片元着色器决定每个像素的颜色最后经过深度测试、混合才写入后台缓冲。我特别喜欢用一个类比一个剧组拍戏的时候导演不会把整个影视城所有群众演员都怼到镜头前。他会先看剧本确定这一场要拍谁剔除然后决定谁站在哪个位置排序摄像机调好景深和机位相机参数灯光师打好光光照计算最后导演喊actionDraw Call画面才被拍下来。引擎的渲染系统干的就是这个剧组的活。理解渲染流水线才算真正打开了引擎的黑盒。因为后面你会遇到的所有渲染问题——遮挡剔除失效、合批失败、阴影异常、带宽爆掉——全都能追溯回这条流程的某一个环节。4. 三条路线之争商业引擎、开源引擎和自研引擎怎么选4.1 三种引擎的定位与取舍这是我自己被同行问烂的问题到底该学Unreal还是Unity团队项目该用什么要不要干脆自研我一般的回答是先不要问哪个最好先问你处在哪个位置。维度UnrealUnityGodot授权方式游戏收入超阈值后分成按席位订阅/个人免费MIT开源主流语言C、BlueprintC#GDScript/C#/C强项高画质、大世界、主机跨平台、上手快、生态大轻量、2D、教学友好团队规模取向中大型团队小到中型小团队、独立个人源码可见性部分开放部分模块可见完全开放看这张表你会发现选引擎其实是在做Trade-off。要顶级画面和大世界表现Unreal是眼前最优解要快速做手游和跨平台小产品Unity生态系统最成熟想完全掌控、想学习原理、不想被商业引擎绑定Godot的MIT协议是一个极干净的起点。4.2 Godot的乱码问题其实是一个很好的学习样本顺着Godot往下说很多人第一次用Godot做中文游戏时会撞到一个经典问题——乱码。当年我第一次在Godot里往Label组件里塞中文字符串界面直接显示一串方块。排查了一圈发现根本不是编码的问题而是字体回退Font Fallback没有配置。Godot默认项目字体里没有中文字形那怎么办去下载一份开源中文字体比如思源黑体在项目设置里把默认主题的Font替换成该字体的资源文件同时确认场景里的TextServer用的是支持中文的选项。一旦字体资源正常加载中文字符就显示得明明白白。这个问题之所以值得单独提出来是因为它背后是一个很典型的引擎原理文本渲染不是把字符码点直接画出来而是要经过字体文件→字形索引→纹理缓存→Draw Call全流程。一种语言显示乱码往往是这个链条的某一段没有对应数据——要么没字体要么没字形要么渲染Shaping步骤没做对。你不是不懂引擎只是没走完这条链。4.3 给不同类型团队的选型建议我的个人经验是solodev或者三五个人的小团队想做移动端/2D/轻中度产品Unity或Godot里选。Unity资料多、商店资产丰富Godot干净、开源、不欠商业债。中大型团队做高品质PC/主机游戏Unreal是目前综合成本最低的选项因为高级渲染、动画系统、大世界工具链都是现成的。有技术沉淀、产品对渲染或运行时有极致定制需求自研引擎值得认真考虑。但前提是你们有足够长的跑道、稳定的核心团队并且想清楚了自研的壁垒到底在哪里。顺便说一句自研引擎不是有时间就能做的事。它更像长期投资前两年可能都在还技术债后面才能真正谈差异化。没有想清楚为什么要自研就贸然开坑大概率会拖垮项目。5. Mod生态背面是引擎开放性的全部秘密5.1 从DOOM的WAD到开放世界的MOD开放是一脉相承的引擎设计得好不好有个很直观的外部风向标这个引擎的作品容不容易被Mod。《毁灭战士》的WAD文件之所以成为Mod文化源头就是因为id Software把游戏内容和引擎逻辑切得足够干净。玩家改地图、换贴图、加怪物不需要动引擎代码。到后来的《上古卷轴5》、各种基于Source引擎的游戏Mod社区已经养成了庞大的生态甚至反过来延长了游戏的生命周期——一个老游戏发售五年后还能有大版本Mod把画质推到次世代水平这在商业上简直是一本万利。站在引擎设计者的角度看Mod-friendly的引擎一般有几个共性内容资源完全数据化、脚本和引擎核心分离、公开的插件/接口文档齐全。反过来代码硬耦合、资源格式加密私有、运行时不可扩展的引擎几乎注定和Mod社区无缘。5.2 为什么BepInEx能注入那么多引擎技术栈决定了Mod方式我自己在社区里看到特别多人问一个问题BepInEx能注入哪些游戏引擎做的游戏BepInEx最初是面向Unity游戏的Mod框架原理是拦截并重写程序集的加载流程游戏启动时它会用一套自带的荷载逻辑提前接管程序集加载在运行时注入额外的DLL和Hook方法调用。很多Unity游戏的Mod例如加UI、改数值、增加功能都是靠它实现的。那为什么这个问题的常见答案总是Unity游戏居多因为Unity构建的Windows游戏通常包含Mono运行时和 .NET 程序集Assembly-CSharp.dll这类程序集的元数据和IL代码结构清晰解析、修改和注入都有灵活的操作空间。而Unreal这类以原生C为主的引擎编译产物是机器码想Mod只能走官方支持的蓝图脚本或者制作方主动提供的SDK想黑盒注入就麻烦得多。这个话题的启示在于引擎的技术栈会直接决定这个游戏生态的Mod方式。选择引擎不只是选择开发体验也是选择未来社区参与的形态。作为引擎使用者理解这一点能帮你判断哪些游戏适合做Mod支持哪些游戏几乎不可能。需要提醒一句Mod本身是社区健康生态的重要部分但动手之前务必遵守游戏的使用协议和社区规范尊重开发者版权和玩家公平性不要拿Mod去做影响他人体验的事情。5.3 引擎设计者在做决定时应该给Mod留一扇门如果你将来有机会参与引擎设计或项目框架搭建我的建议是即便现在不做Mod也要把可扩展性当成一等公民来设计。具体来说就是做到三件事用配置文件/数据文件描述游戏内容尽量别把内容要素焊死在代码里逻辑层和表现层尽量解耦脚本系统要开放哪怕是植入一个简单的Lua解释器公开稳定的API边界而不是让Mod制作者靠内存搜索来逆向。这三件事的成本远没有想象中高但它们决定了你的作品三年后是玩的人越来越多还是越改越僵死。从DOOM到今天快三十年过去了这条经验一点没过时。6. 学引擎之前先想清楚这三件事6.1 三个层次用引擎、读引擎、写引擎很多初学者上来就下载Unity或Unreal拖几个立方体进场景跑通一个Hello World然后问我引擎我是不是算是入门了我说句直接点的你把油门踩到底不代表你会修发动机。学引擎有三层境界每层的目标完全不同用引擎把引擎当工具掌握编辑器操作、常见组件、资源流程。目标是能不能做出一个完整的可玩Demo。读引擎理解关键系统的原理例如游戏循环、渲染管线、资源生命周期。目标是为了能诊断问题、做深度优化。写引擎亲自动手实现一个最小的引擎从零搭建渲染、输入、循环。目标是用构建来倒逼理解。三层缺一不可但大多数人卡在第一步把记编辑器按钮当成了懂引擎。编辑器只是引擎的皮骨子里的架构思想才是值得学的。6.2 我自己的最小引擎练习如果你问我怎么快速度过后两层我的建议是做一个最小引擎先不碰图形API用SDL或SFML开一个窗口自己写一个游戏循环实现键盘输入轮询、固定时间步长、玩家对象更新、简单碰撞。当你能解释为什么帧率对逻辑更新速率的影响需要被隔离时你已经超过了大多数只会拖组件的使用者。然后一步步加加载一张图片做纹理贴图渲染一个三角形到屏幕上写一个简单的场景图支持物体父子变换再加一个资源管理器让重复加载不至于爆内存。每走一步你都会对引擎为什么要这么设计有新的理解。这个练习不需要很复杂。用Godot源码做参照也好照着Game Programming Patterns这类书里的思路也好关键是自己动手走一遍从空窗口到一个能玩的小游戏的完整过程。你会发现之前看商业引擎文档时朦胧的概念会突然变得清晰。6.3 接下来这个系列打算怎么写这篇算是整个系列的地基我们把游戏引擎是什么怎么来的一帧里做什么有哪些流派生态怎么长出来讲清楚了。后面我会按照引擎的模块逐个突破——渲染管线、资源系统、物理、动画状态机、网络同步、编辑器工具链每一篇都尽量从原理讲到可复现的实践而不是空谈概念。按我自己的经验学引擎最好的姿势不是从头到尾读完一本手册而是带着一个具体问题沿着链条往深处挖。你做着做着发现我每时每刻都在用物理系统却没想过它怎么保证确定性然后自己去查去改去造轮子这时候学到的才是真正属于你的东西。所以我给你一个非常实际的建议把这篇博客当成起点自己去拆一个引擎——哪怕只是拆开看30分钟的Profiler曲线哪怕只是把引擎源码里GameLoop那个函数翻出来读一遍。你和懂引擎之间的距离不差任何一座高墙差的只是一次自己动手的尝试。

相关新闻

ROCm云实例上15分钟部署Gemma4:vLLM完整实战记录

ROCm云实例上15分钟部署Gemma4:vLLM完整实战记录

上礼拜我趁着 Datawhale 社区和 AMD 的联动活动,拿到了一台 ROCm 云实例的试用额度。本来只是想顺手把 Gemma4 跑起来截个图交差,结果一上手就停不下来了——从裸机状态的驱动安装、容器环境搭建,到 vLLM 服务正式对外提供接口,我…

2026/10/2 15:40:41 阅读更多 →
Unity手游Deep Link完整实现:iOS配置、C#层参数投递与冷热启动处理

Unity手游Deep Link完整实现:iOS配置、C#层参数投递与冷热启动处理

Deep Link 这个需求,做 Unity 手游的同学应该都不陌生。尤其这两年买量渠道越来越看重回流和唤醒,iOS 端从 Safari 点开链接直接拉起游戏、再把渠道参数透传给游戏内 C# 层,已经成了标配能力。但这一套东西,真要一次做对&#xff…

2026/10/2 15:40:40 阅读更多 →
Agent开发实战:Harness工程如何决定模型表现与Workflow编排落地

Agent开发实战:Harness工程如何决定模型表现与Workflow编排落地

1. 被忽略的胜负手:为什么同一个模型换个壳子表现天差地别很多人第一次接触 Agent 开发时,注意力几乎全在模型选型上——到底是 DeepSeek 还是 Claude,参数调到多少,温度设成几。但真正上手做过几个能跑起来的项目之后&#xff0c…

2026/10/2 15:40:40 阅读更多 →

最新新闻

美学设计型电源轨道系统技术选型与供应商评估维度

美学设计型电源轨道系统技术选型与供应商评估维度

在家装全屋整装、商装办公空间、展厅、酒店等项目中,用电设施的视觉融入度已成为空间设计的重要考量。传统固定插座存在位置突兀、样式与装修风格协调性不足等问题,电源轨道系统凭借取电点位可调、外观形态简约的技术特性,逐步成为柔性配电与…

2026/10/2 16:53:24 阅读更多 →
从零自制电调与VESC:AM32固件配置、FOC调试与硬件选型实战

从零自制电调与VESC:AM32固件配置、FOC调试与硬件选型实战

1. 从一堆炸掉的MOS管说起:为什么我要自己折腾电调和VESC第一次接触电调是在三年前,当时手里攒了一堆航模无刷电机,想给一台自组的穿越机做动力系统。买过几款成品电调,飞了几次就烧了,拆开一看,MOS管炸得面…

2026/10/2 16:53:24 阅读更多 →
HIL测试中的总线与通信协议:从CAN到车载以太网实战指南

HIL测试中的总线与通信协议:从CAN到车载以太网实战指南

从事汽车电子相关开发这么多年,一个项目从模型在环(MIL)到软件在环(SIL),再到硬件在环(HIL)和实车路测,越到后面,越会发现一个事实:HIL测试里你真…

2026/10/2 16:53:24 阅读更多 →
EMI超标频点反推电路缺陷的三步定位法

EMI超标频点反推电路缺陷的三步定位法

1. 项目概述:为什么“从超标频点反推源头”是EMC工程师的硬核基本功做硬件的同行,尤其是电源、通信、工控类板卡的Layout工程师,大概率都经历过这种深夜崩溃时刻:样机送进电波暗室,测试报告一出来,30MHz附近…

2026/10/2 16:53:24 阅读更多 →
EMC预测试实战:从超标频点反推Layout整改

EMC预测试实战:从超标频点反推Layout整改

做硬件十年,我越来越觉得“EMC 预测试”最有价值的地方,不是那份测试报告,而是报告上每一个超标频点:它们像坐标一样指向辐射源头,帮你把问题定位回 Layout 的某个具体区域。这篇文章不聊教科书上的场论公式&#xff0…

2026/10/2 16:53:24 阅读更多 →
汽车测试数据采集全链路解析:从传感器到HIL/PIL的工程实践

汽车测试数据采集全链路解析:从传感器到HIL/PIL的工程实践

汽车测试这个领域,外行看着就是"把车开上试验台跑一圈",但真正做过整车或零部件验证的人都知道,从传感器信号采集到数据入库,中间隔着一堆协议转换、时钟同步、量纲对齐的脏活累活。Axiometrix Solutions 这套一站式方案…

2026/10/2 16:52:24 阅读更多 →

日新闻

从零搭建AI工程化:模型之外的完整闭环

从零搭建AI工程化:模型之外的完整闭环

先搞清楚一件事:从零开始做 AI 工程化,难的从来不是调模型、写提示词,而是把一套原型 Demo 变成长得像是“正经系统”的东西。你手里可能已经有了能跑通的代码,也可能刚读完一些概念,但真到了要把它变成可维护、可观测…

2026/10/2 0:00:20 阅读更多 →
大模型训练显存估计与混合精度训练实战指南

大模型训练显存估计与混合精度训练实战指南

1. 大模型训练显存估计与混合精度训练详解显存不够用,几乎是每个做大模型训练的人都会撞上的第一堵墙。你可能也经历过:模型代码写完了,数据管道跑通了,满心欢喜地按下训练启动脚本,结果几秒钟后终端弹出一行红字——C…

2026/10/2 0:00:20 阅读更多 →
小样本学习数据集选型指南:27个真正可用的高质量数据集

小样本学习数据集选型指南:27个真正可用的高质量数据集

1. 小样本学习的“弹药库”:为什么你总在找数据集,却总找不到真正能用的? 小样本、数据集——这两个词最近半年在我处理的200多个AI项目咨询里,出现频率排进前三。不是模型调不好,不是代码写不对,而是卡在…

2026/10/2 0:00:20 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/10/1 19:40:48 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/10/1 19:41:40 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/10/1 20:05:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/2 10:36:31 阅读更多 →
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/2 5:26:06 阅读更多 →
黑夜航拍船只数据集训练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/2 6:09:11 阅读更多 →