游戏引擎基础架构深度解析:从分层设计到主循环与对象模型
游戏引擎架构这个词看着像个老生常谈的学院派概念但真到你自己往引擎里加功能、改底层、甚至动手写个自研引擎的时候才会发现“架构”两个字背后全是实打实的取舍和血泪。我在这个行业摸爬滚打了十来年从客户端逻辑一路追到引擎底层最大的感受就是网上的引擎源码分析大多是在讲“某个功能怎么实现”很少讲“引擎为什么长成这样”。这篇就算是这个深度解析系列的开篇我会从引擎基础架构入手把那些决定后续所有功能走向的骨架设计讲清楚包括引擎的分层方式、启动流程、主循环、游戏对象模型、资源加载和跨平台抽象。这个系列适合三类人想从业务代码转引擎开发的人、正在设计自研引擎或想改造Unity/UE底层的人、以及不满足于“会调API”想搞懂原理的客户端开发。准备好我们直接进入正题。1. 引擎横向分层所有架构问题的根源1.1 为什么我坚持先聊分层而不是先聊渲染很多初学引擎的人一上来就盯着渲染管线、光照模型这些东西觉得这才是引擎的核心。这个观点不算错但有一个隐藏的坑渲染、物理、动画这些系统本质上都是引擎里的“业务模块”它们长期稳定的前提是下面有一层足够稳的地基。这层地基就是引擎的分层结构。我习惯把一套成熟的引擎从下往上分成四层。最底部是平台抽象层负责屏蔽操作系统和硬件差异包括窗口创建、输入设备、底层图形API、文件系统、内存分配这些“换平台就得换实现”的东西。往上是核心层包含数学库、容器、内存管理、日志、事件系统、线程池这些与游戏类型无关的基础设施。再往上是资源层负责资产的加载、缓存、序列化和生命周期管理本质上是在回答“游戏世界里的一大堆美术与音频资源怎么被有序地读进内存”。最上面是游戏层也就是场景管理、实体组件系统、逻辑脚本、玩法框架这一层与具体项目绑定最紧。这样分层有什么直接好处首先是依赖方向清晰上层只能依赖下层下层绝不能反过来抬头看上层的业务。只要把这个约束焊死你就拥有了第一个特别值钱的能力——可以单独替换某一层而不动其他代码。我见过一个项目因为渲染层和游戏逻辑层混在一起写想换一个阴影方案结果需要改四十多个业务类最后直接放弃了升级。分层的第二个好处是编译和测试成本可控底层的数学库和容器工具可以独立做单元测试几千个用例跑一遍只要几十秒这在大型项目里是救命级的效率优势。1.2 模块之间的依赖关系到底怎么管分层只是大方向真正麻烦的是同层或邻近层模块之间的依赖关系。举个例子物理系统在检测碰撞之后要通知脚本层执行回调动画系统在播放完一个动画事件后要通知战斗系统做伤害判定。如果这些模块之间直接引用彼此的头文件和API用不了几个月依赖图就会乱成一锅粥。业内最常见的解法是接口倒置。拿碰撞通知来说物理模块不直接知道“怪物”或“玩家”是什么它只定义一个物理事件监听接口游戏对象实现这个接口并注册进来。这样物理模块就只依赖一个抽象接口而不是依赖具体业务。我管这叫“把依赖方向反过来”。这样做的收益很实在物理模块可以独立编译、独立测试甚至可以在没有初始化任何游戏逻辑的情况下单独跑一个碰撞检测的性能压测。除此之外引擎里通常还会有一个中心化的服务定位器。所有核心模块比如渲染、音频、输入、任务系统都注册到一张全局服务表里。你想用音频服务就通过服务定位器按名字或类型取出来。这个模式听起来简单但它是整个引擎解耦的关键螺栓。要注意的是服务定位器用多了也会变成万能的垃圾场所以我给自己定的规矩是只有全局唯一的、生命周期和引擎一致的服务才允许进这张表临时对象和业务对象绝不能往里塞。2. 引擎启动流程与主循环引擎的心跳机制2.1 从main函数到引擎初始化中间发生了什么每当我面试引擎岗位的候选人特别喜欢问一个问题引擎是从哪一行代码开始运行的很多人会说是入口函数但这其实只是第一步。一个成熟引擎的启动流程通常会走完三个大阶段整个流程的逻辑是“先用最少的资源找到配置再创建核心服务最后才加载游戏内容”。第一阶段是引导启动一般在入口函数里完成。这一阶段要做的事情只有三件初始化日志系统、解析启动参数、读取引擎配置文件。为什么日志系统要排在最前面因为后面所有的初始化步骤都可能失败没有日志你就只能面对一个黑屏窗口或一个崩溃弹窗什么都查不到。启动参数的解析同样是这个道理你要能通过命令行指定无窗口模式、日志级别、渲染后端否则在CI环境和开发者本地引擎行为就很难统一。第二阶段是核心系统初始化。这一阶段的标准动作是创建内存分配器、启动线程池、初始化渲染后端的SDK、创建主窗口、初始化音频设备和输入系统。这里有一个容易踩坑的点初始化顺序不能随便调比如渲染后端必须要有一个可用的窗口句柄才能创建交换链而窗口系统又依赖平台抽象层的初始化已经完成。所以成熟引擎普遍维护一个有序的初始化列表每个系统都声明自己的依赖项初始化调度器按拓扑顺序依次执行。第三阶段是进入主循环前的准备包括加载引擎自带的核心资源比如默认shader、默认材质、UI字体、创建场景管理器、解析项目设置。从这个阶段开始引擎已经具备一切运行条件只差最后一脚油门。我见过一些引擎把第一帧要用的资源都放到进入主循环之后去同步加载结果就是启动时间被白白拉长用户看到的是一个卡了好久的黑屏。正确的做法是尽量前移启动阶段能准备好的缓存和池子绝不拖到运行阶段再做。2.2 主循环的核心节奏更新时间、渲染帧和固定步长引擎启动完成后就进入一个循环这个循环就是引擎的心跳。它的职责可以用一个很朴素的问题概括下一帧游戏世界应该更新到什么状态然后怎么把它画到屏幕上。主循环的标准节奏分三拍处理输入事件、按固定步长更新游戏世界、渲染一帧输出画面。这里的核心矛盾有两个。第一个矛盾是“可变时间步长”和“固定时间步长”的选择。单纯用上一帧到这一帧的真实时间差去做游戏逻辑更新会导致物理、动画在不同帧率下表现不一致帧数高的机器跳得远帧数低的机器动作慢吞吞。所以绝大多数引擎采用了固定步长加时间累积器的方案。简单说就是累积真实流逝的时间每攒够一个固定步长比如1/120秒或1/60秒就执行一次逻辑更新不够就留着下一帧。渲染则仍然跟着真实帧率走这就是大家熟悉的“逻辑帧”和“渲染帧”分离。第二个矛盾是帧率跟不上时怎么办。如果游戏某一帧因为资源加载、GC毛刺导致耗时特别长累积器里的时间可能一下子攒了三个步长如果全部追上来物理就会发生严重的抖动甚至穿透。这一步业内普遍的做法是限制单次最大迭代次数比如最多连续更新四步多出来的时间直接丢弃。游戏运行中的“子弹时间”效果和物理冻结很多时候就是这个保护逻辑在工作。写引擎时这一点一定要提前想好不然后面做联网同步和回放系统时你会被时间步长乱跳的问题折磨得头皮发麻。3. 游戏对象与组件模型玩法逻辑的组织骨架3.1 三种主流对象模型的对比与选择引擎里最贴近玩法开发的就是引擎用来组织游戏对象的那套模型。目前市面上主流的方案可以归成三类以Unity为代表的人物对象加组件模型以Unreal为代表的Actor加Component模型以及这几年呼声很高的实体组件系统模型ECS。GameObject/Component模型的核心思想是用组合代替继承。你要一个会移动、会发光、会播放音效的怪物不需要从“怪物基类”去继承一个怪物只需要创建一个空对象往上面挂移动组件、光源组件和音频组件。这套模型最大的优点是直观策划和客户端开发都容易理解Uber式的万能对象在这里被拆解成了一个个可复用的小积木。ECS模型则完全是另一套思路。在ECS中你不再创建“一个怪物对象”而是把怪物的位置、血量、朝向这些数据分别放进不同的紧凑数组中再把操作这些数据的纯逻辑函数独立出来。这个设计的本质是迎合CPU缓存的局部性原理成千上万个敌人的同类型数据紧紧挨在一起遍历一遍几乎不触发缓存未命中性能上限非常高。它的缺点是抽象程度高调试和序列化都要额外花心思。我的建议很直接如果是小团队做中型项目选GameObject/Component这种成熟模型最稳如果是大世界、同屏实体上千上万的项目再认真考虑ECS它就是为这种场景而生的。3.2 组件如何通信直接引用、事件还是消息对象模型定了紧接着要解决的是组件之间怎么说话。这里有三个经典方案我在项目里都实战过它们的应用场景差异非常大。第一种是直接引用就是逻辑代码拿到另一个组件指针直接调用它的公开方法。这种方式性能最好代码最直白但耦合也最重。我一般只允许在一对一、生命周期明确可控的场景里用直接引用比如一个武器组件持有它所属的玩家对象的引用这几乎没有问题。第二种是事件系统。一个组件发出“被子弹击中”的事件任何关心这个事件的系统都能收到通知。这个解耦效果很好射击组件不需要知道自己击中的是敌人、箱子还是玻璃墙它只要广播一个带命中信息的事件就行。代价是调试难度直线上升你很难从调用栈里直接看到“这个事件最后是谁处理的”。所以我做事件系统时强制要求每个事件都带派发路径记录在调试模式下打印完整的监听者链这个习惯在排查疑难问题时救了我太多次。第三种是集中式消息或者数据共享所有组件通过一个共享的数据上下文来交换信息。这在帧间通信和跨系统传参时很好用比如战斗系统和UI系统的血量同步就可以由战斗逻辑把最新血量和最大血量写进一个共享状态UI系统按自己的节奏去读。选择哪种方式没有绝对答案但我有一条很硬的经验默认用事件解耦用直接引用做性能热点优化用共享数据做跨帧跨模块的存档类数据。团队约定越早建立后期代码就越不容易腐化。4. 资源加载与生命周期管理引擎的血液系统4.1 资源管理的问题本质决定一个游戏能否流畅跑起来的核心引擎里有一句话没有资源一切逻辑都是空中楼阁。资源管理解决的问题本质上就是回答三个问题资源什么时候加载加载到内存后怎么被有效复用不再使用时怎么安全地回收。这三个问题回答不好最常见的症状就是关卡切换时卡顿、内存持续膨胀、崩溃在一个找不到是谁引用了的资源上。先来说加载时机。业界现在普遍默认异步加载。原因很简单一块几十GB的游戏资产不可能在进入场景的那一刻同步读进内存那会产生数秒的卡死。异步加载的思路是你发起一个加载请求资源系统在后台线程里完成磁盘读取、解压、反序列化等耗时步骤等数据准备好之后再通过回调或轮询的方式把结果交还给主线程。UI上那个“加载中”的进度条本质就是对异步加载进度事件的封装。资源复用靠的是缓存和引用计数。拿贴图举例同一张贴图可能被几十个模型引用如果每个模型都自己加载一份贴图显存瞬间爆炸。所以引擎会有全局的资源缓存表所有加载请求都先查缓存命中就直接加引用计数未命中才真正进入磁盘加载流程。这个机制听起来顺理成章但真正常踩的坑是引用计数维护不好导致的资源永远无法卸载以及缓存表里残留大量无效资源。我给自己定的规矩是所有资源加载请求的返回句柄必须走RAII包装离开作用域自动释放引用缓存表定期执行一次“扫描未被引用超过N分钟的资源”的检查。4.2 热更新与资源组织现代引擎绕不开的关卡现在的手游和端游基本都绕不开热更新这个话题。资源管理架构设计得怎么样直接决定了热更新容不容易做。理想情况下资源系统应该把每个资源都当成一个独立的、可寻址的单元本地文件只是一个可选的底层存储介质。这样更新逻辑就变简单了只要把新版本资源下载到本地让资源寻址时优先命中新版本即可。糟糕的架构则是把所有资源打成一个大包哪怕只改了一个数值配表也要重新下载整个包体这在现代项目里基本不可接受。在资源组织上我偏好按“分块”思路设计启动必需的最核心资源放进启动包每个关卡或玩法场景对应的资源放进独立分块全局共享的高频资源单独成块。这个设计可以做到按需下载、边玩边下关卡加载时间和下载流量都能得到控制。有一个细节值得特别提醒资源校验必须做真实性校验而不仅仅是大小校验以前我就见过因为CDN给了一个损坏的半包哈希校验没拦下来结果玩家在关卡中途触发了贴图花屏的问题。从那以后校验逻辑成了我资源管线里的一票否决项。5. 跨平台与硬件抽象一套代码跑遍各端的关键5.1 渲染、输入和文件路径三个最容易踩坑的抽象层做引擎的人大多数都绕不过跨平台这道坎。“一套代码多端运行”听起来很美好但踏上这条路之后你会发现真正需要抽象的东西远比想象的多。最典型的三个痛点就是渲染API、输入设备和文件系统。渲染API是所有平台差异里最直观的一层。PC上可能同时要支持DirectX 12和VulkanmacOS和iOS上是Metal移动端基本都是Vulkan加OpenGL ES的兼容。如果游戏代码直接拿着平台API去创建缓冲区和渲染管线那换一个平台就等于重写一套代码。市面上成熟引擎的做法是提供自己的渲染硬件接口层RHI把命令、管线、资源全部再包一层。游戏渲染代码只面对RHI的接口RHI内部再根据编译目标平台跳转到对应的后端。我在自研引擎里也照葫芦画瓢拆了一层RHI虽然少了很多直接调Vulkan的“快感”但换来的是真真切切的多端和调试便利。输入设备也一样抽象层的目标不是简单把“鼠标”和“触摸”拢到一起而是提供一套“意图级”的输入描述方式。比如“开火”这个行为PC上是鼠标左键手机上可能是一个虚拟按钮主机上是手柄扳机键。正确的抽象是定义出“开火”这个输入行为再把不同设备的具体映射交给配置层。文件系统则常常被忽略尤其在做工具链和资源包时Windows和Linux的路径分隔符、大小写敏感规则都不同一个统一封装文件访问的资源服务器能让你少掉无数根头发。5.2 平台层隔离的实战心得平台抽象层有没有设计好一个很直观的评判标准是你的业务代码里还有多少处#ifdef平台宏如果游戏逻辑代码里到处是这种条件编译说明平台层没有够到它该够的位置。我的原则是平台差异要尽量下沉业务层永远只面对一个统一的抽象接口。但这里有个反向陷阱抽象层太泛会吞掉一些平台特有的能力。比如某些移动平台的高性能异步纹理上传接口如果你为了统一API把这些特性藏掉了就等于主动放弃了平台的一部分性能。我的处理办法是RHI层提供一套“能力查询”接口上层可以先查询当前平台支持哪些扩展再用统一的接口路径去调用。这样既有抽象的收益又不会锁死硬件潜力。跨平台这件事做好的标志是你在Windows上开发完打包到Android上跑除了分辨率和输入方式不同之外不需要改动任何一行游戏逻辑代码。6. 架构落地中的常见问题与排查思路6.1 典型事故一引擎启动即崩溃做引擎调试最不想碰到的就是启动即崩溃因为它意味着连日志系统都可能还没完全就绪。我在一个跨平台项目里遇到过Windows上启动一切正常换到某套移动设备上启动就崩。排查了半天最后定位到问题是某个模块在初始化时按固定大小预分配了一块显存在移动端这块显存大小超过了可用预算。这类问题的通用排查思路是固定的。第一把启动流程的每个系统初始化拆成带日志标记的步骤崩到哪一步一目了然第二开一个干净的日志通道确保在启动初期就能把致命错误刷出来第三给每个组件初始化包一层性能计时和结果断言异常时能精确到是哪个模块的哪一项初始化失败。这个办法很笨但确实每次都管用。6.2 典型事故二关卡切换内存暴涨还有一个高频事故是关卡加载后内存曲线像一个上台阶一样切一次高一层永不回落。第一次遇到时我第一反应是资源泄漏翻了一晚上引用计数结果发现问题不完全在资源而在于场景管理器的对象销毁流程里有几个业务组件在销毁事件中注册了新的异步加载这些新加载的资源引用被保存在全局的静态容器里导致整个资源包始终无法卸载。这类问题最好用的是内存快照对比法。在切换关卡前打一次内存快照切换完成后再打一次把两张快照比一遍所有新增的大块分配项都会暴露出来再顺着分配栈就能锁定谁持有了这些资源。排查资源问题时不要只盯着加载那一侧释放那一侧的引用持有者才是真正的主角这是我在多次内存排查之后得出的核心经验。6.3 避免架构腐化的几条实操建议架构设计得再好如果维护跟不上半年就会腐化回泥潭。我把这些年最值得固化的几条建议列出来供你参考。第一架构评审必须看依赖方向每周至少扫一眼最近合并的代码有没有把底层往上层的依赖带进来的情况。第二新模块引入之前先回答“它到底放在哪一层”如果一个组件说不清自己属于哪一层它多半会成为后期最大的重构点。第三给性能和内存关键路径做自动化基准测试没有基准数据兜底架构优化基本等于闭着眼睛开车。写在最后的一点体会这个系列的“引擎基础架构”到这儿算开了一个头。我能写出来的每一层、每一个模块背后都是无数个项目熬出来的经验。架构这件事没有标准答案但有一些通用的底线比如依赖方向不能乱、固定步长和渲染帧要分离、资源生命周期要闭环、平台差异要下沉。按这几条底线走你的引擎也许不完美但至少方向不会歪后续叠加任何功能都会轻松很多。如果你正打算动手写自己的引擎或者正在给现有引擎做大手术我的建议是不要急着抄大型商业引擎的任何模块先把你自己的分层边界画清楚把主循环和对象模型想透。地基稳了上面才有资格谈性能和酷炫特性。下一篇我会顺着这个骨架把场景管理与实体生命周期拎出来细拆那是引擎里和玩法开发关系最近的一块实战性很强我们下一篇见。

相关新闻

DenseNet鸟类细粒度识别实战:121/161/169/201迁移学习指南

DenseNet鸟类细粒度识别实战:121/161/169/201迁移学习指南

简介:以 DenseNet 121/161/169/201 四种网络为主干的多类别鸟品种分类实战项目,面向图像识别入门和迁移学习研究者,适合做模型对比与消融实验。项目包含约 8000 张覆盖 200 种鸟类的图像数据集和标签,通过预训练参数与层冻结参数可…

2026/10/7 5:33:10 阅读更多 →
90DaysOfDevOps 第 86 天:跨平台数据备份实战——用开源工具 Kopia 落实 3-2-1 备份方法论

90DaysOfDevOps 第 86 天:跨平台数据备份实战——用开源工具 Kopia 落实 3-2-1 备份方法论

文档/教程 【免费下载链接】90DaysOfDevOps This repository started out as a learning in public project for myself and has now become a structured learning map for many in the community. We have 3 years under our belt covering all things DevOps, including Pri…

2026/10/7 5:33:10 阅读更多 →
ponytail:跨栈契约驱动的 CLI 工具与项目状态机

ponytail:跨栈契约驱动的 CLI 工具与项目状态机

1. “ponytail”不是发型,而是一个正在 quietly rise 的 CLI 工具生态你搜“ponytail”,第一反应可能是马尾辫——但最近三个月,在 GitHub Trending、Discord 开发者频道和内部技术分享会上,“ponytail”出现的语境,90…

2026/10/7 5:32:10 阅读更多 →

最新新闻

基于Java+JavaScript+HTML的水质检测系统设计与实现

基于Java+JavaScript+HTML的水质检测系统设计与实现

简介:基于Java、JavaScript与HTML实现的水质检测系统,是一套面向高校毕业设计、课程设计及项目开发的完整源码与数据库包,覆盖后端逻辑、前端页面与数据存储。资源共297个文件,主要包括37个Java类用于业务逻辑处理、16个JSP页面实…

2026/10/7 5:58:27 阅读更多 →
基于SpringBoot+Vue+MySQL的光影视频平台全栈实战与避坑指南

基于SpringBoot+Vue+MySQL的光影视频平台全栈实战与避坑指南

简介:这份资源是面向计算机专业学生与Java Web开发初学者的完整视频平台项目资料包,可直接用于毕业设计、课程设计或期末大作业。项目采用SpringBoot后端、Vue前端与MySQL数据库的经典技术栈,开发环境覆盖IDEA、VSCode、Maven与Navicat&#…

2026/10/7 5:58:27 阅读更多 →
Django+MySQL从零搭建图书管理系统:ORM模型与事务实战

Django+MySQL从零搭建图书管理系统:ORM模型与事务实战

简介:这是一份基于Python、Django与MySQL构建的图书管理系统完整源码,并附带数据库文件,适用于Python Web初学者、高校课程设计以及小型图书室的信息化管理。系统围绕图书、用户、借阅三条主线展开,包含图书信息增删改查、读者注册…

2026/10/7 5:58:27 阅读更多 →
测试数据太干净测不出Bug?Eon免费造会埋雷的模拟公司

测试数据太干净测不出Bug?Eon免费造会埋雷的模拟公司

背景测了三轮都通过的客户导入,上线第二天被业务一张表退回来:有个客户名出现了两次,几个名字大小写不一致,还有一行"测试-别删"的占位数据。你的测试数据里一条都没有——不是漏测,是数据太干净了。它是什么…

2026/10/7 5:58:27 阅读更多 →
Python+OpenCV轻量级人脸考勤系统实战指南

Python+OpenCV轻量级人脸考勤系统实战指南

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

2026/10/7 5:58:27 阅读更多 →
AI资讯速递实战:从Claude Sonnet 5.5到每日选题与写作流程

AI资讯速递实战:从Claude Sonnet 5.5到每日选题与写作流程

今早我把当天的AI信息池又做了一遍筛选,最后定下来的标题是:衍辉AI速递 9.29|Anthropic发布Claude Sonnet 5.5等11条AI资讯。做这种每日速递已经不算短时间了,我的核心感受并不是“今天新闻好多”,而是“真正值得被写进…

2026/10/7 5:57:27 阅读更多 →

日新闻

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

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

2026/10/7 1:01:58 阅读更多 →
用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

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

2026/10/7 1:02:00 阅读更多 →
芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

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

2026/10/7 1:02:00 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/6 7:15:40 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/6 5:29:09 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/6 6:26:51 阅读更多 →

月新闻

我发现了一个新思路:用 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/6 8:21:32 阅读更多 →
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/6 4:21:51 阅读更多 →
黑夜航拍船只数据集训练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/6 1:18:13 阅读更多 →