UObject 详解:UE4 万物之源的核心机制与实战避坑指南
聊到 Unreal Engine 4 的核心概念UObject 几乎是绕不开的第一站。不少刚入坑的朋友会把 UObject 简单理解成“一个所有类都要继承的基类”这个理解不算错但只看到了一层皮毛。真正用起来之后你会发现UE4 整套对象系统的入口级设计几乎都挂在 UObject 这棵树上反射、垃圾回收、序列化、编辑器集成、蓝图支持甚至网络复制的前提条件全都在这里。它的地位用“万物之源”形容真的不夸张。这篇文章我想抛开教科书式的定义从一个实际开发者的角度把 UObject 的设计动机、核心机制、常用姿势和常见坑一次性讲清楚。无论你是刚接触 UE4 的初学者还是写过一段时间蓝图想往 C 底层扎的进阶者都应该能从中拿到点东西。1. 为什么UE非要搞一个“万物之源”——UObject诞生的动机理解 UObject 之前先要理解一个很现实的问题C 本身不具备游戏引擎需要的“对象管理能力”。1.1 C这份“普通话”在游戏引擎里很难直接上岗C 是一门非常自由的语言你可以用new创建对象用delete销毁对象也可以把一个对象指针传来传去。但在一个中大型游戏项目里纯 C 的对象管理会迅速变成一场灾难。举个例子你做了一个武器类里面存了一把武器的名字、伤害、等级。如果这个对象是纯 C 类编辑器根本不知道它的存在蓝图不知道它有哪些字段存档系统不知道怎么把它保存到磁盘网络层也没法自动判断哪个字段需要同步给其他客户端。这些事情不是不能手工做而是每做一个功能都要手写一堆配套代码而且每加一个新类这些代码都要重写一遍。几十个类还好几百个类、上千个类的时候就完全撑不住了。C 缺少的东西总结下来就是三个运行时反射能力不够类有哪些字段、哪些方法在编译后的二进制里没有现成可查的信息。内存管理完全是“野生的”谁来负责释放、什么时候释放全靠程序员自觉。对象没有统一的“身份”两个对象之间怎么组织、怎么查找、怎么序列化没有公共约定。引擎要稳定运转就得在这些问题上给出确定性答案。这就是 UObject 出现的根本原因。1.2 UObject给对象办了一张“引擎户籍”如果说普通 C 类是一个“自由职业者”那 UObject 就是一个“正式注册过的市民”。UE4 给每一个 UObject 实例都安排了固定的身份信息它有一个全局范围内相对稳定的名字FName。它有一个外层次结构Outer通常指向“创建它的那个对象”。它有一个唯一的路径形如/Game/Content/XXX.MyObject可以在运行时被查找和解析。它也挂在一个由引擎统一管理的图结构上GC 垃圾回收器可以根据引用关系判断它还能不能被访问到。这套设计让引擎拥有了一个可以统一治理的基础“户籍系统”。任何对象只要注册成 UObject引擎就能用同一种机制去管理它、读取它、保存它甚至把它暴露给编辑器。顺带说一句可能有人会疑惑为什么不直接把所有类都搞成 UObject答案也很简单不是所有东西都需要“户籍”。比如一个单纯用来传数据的临时结构体、一个只在内存里短暂存活的状态信息如果也做成 UObject反而要承担 GC 追踪、反射标记、序列化检查等一系列开销得不偿失。所有包装成本最终都要有人买单。2. UObject到底提供了什么——五大核心能力拆解UObject 之所以能成为万物之源是因为它天然承担了五个核心职责。这五个能力单独拿出来任何一个普通 C 类都能模拟但五个组合在一起并有标准机制支撑只有 UObject 做到了。2.1 反射让代码能在运行时“看见自己”反射是 UObject 所有高级功能的地基。没有反射后面讲的 GC、序列化、编辑器集成全都无从谈起。你写的UCLASS()、UPROPERTY()、UFUNCTION()这些宏看起来只是给类加了几行标注但实际上它们会被 UnrealHeaderToolUHT在编译前扫描并生成对应的反射代码。运行时的引擎才能回答这些原本 C 回答不了的问题这个类叫什么名字它继承了谁它有哪些属性每个属性的类型是什么我能不能通过字符串的形式拿到一个对象的某个属性值我能不能通过函数名在运行时动态调用这个对象的方法举个平时可能不太注意的例子。你在蓝图中给某个变量赋值编辑器其实不知道这个变量在 C 里是怎么存的。它之所以能正常读取和写入就是因为引擎通过反射拿到了FProperty的地址然后调用对应的属性访问接口。我在实际工作中用反射做过一个通用配置工具把策划填的表直接批量映射到 UObject 的属性上整个过程不需要为每个类单独写解析逻辑靠的就是FindFProperty和属性实例的枚举。// 例如查一个 UObject 上的属性 FProperty* ScoreProp FindFPropertyFProperty(UMyDataObject::StaticClass(), GET_MEMBER_NAME_CHECKED(UMyDataObject, Score)); if (ScoreProp) { int32* ValuePtr ScoreProp-ContainerPtrToValuePtrint32(MyDataObject); *ValuePtr 100; }反射系统的存在让 UE4 具备了“用统一的代码处理任意对象”的能力。这是纯 C 单靠模板和虚函数很难完全替代的。2.2 垃圾回收引擎替你管理对象的生死UObject 的长生逻辑很简单不从根集合Root Set出发可达的对象最终会被 GC 回收。这里的核心概念有两个一个是根集合一个是引用边。根集合可以理解成一个“地基”列表比如当前 World、当前引擎实例、被AddToRoot()标记过的对象都是根集合的一部分。GC 每次运行时会从根集合开始遍历所有引用把能走到的对象全部标记为“存活”剩下没标记的就被判定为不可达直接回收。这个过程里只有被UPROPERTY()标记的引用才会计入引用边。这是个极其重要的细节。如果你在一个 UObject 里写了一个裸 C 指针指向另一个 UObject并且没有加UPROPERTY()那 GC 完全无视这条引用。哪天 GC 跑起来被指的那个对象可能就被回收了而你手里的指针并不知道继续访问就是典型的悬空指针崩溃。所以我在团队里反复强调一条纪律UObject 指向 UObject 的成员变量要么加UPROPERTY()要么用TStrongObjectPtr这类强引用包装器绝对不要只写一个裸指针就了事。需要主动保命的时候可以用AddToRoot()把一个 UObject 加到根集合里这样它不会被 GC 扫掉。但记住用完要RemoveFromRoot()否则它就会成为一个永不被回收的对象等于内存泄漏。2.3 序列化让对象在磁盘和内存之间搬家游戏里到处都需要“保存”和“读取”存档系统要把玩家状态写到硬盘关卡文件要把所有 Actor 的状态保存下来资源编辑器也要把资产数据持久化。UObject 天然支持这个过程调用Serialize(FArchive Ar)或者让引擎走资产系统的保存流程即可。序列化为什么依赖反射因为当引擎保存一个对象的时候它不需要针对每个类写单独的保存代码。它只要拿到对象的 UClass遍历所有UPROPERTY()然后把属性的值逐个写入FArchive就行。加载的时候反向操作。这也是为什么UPROPERTY()中的一个常见版本叫SaveGame它本质上就是告诉序列化系统这个字段需要出现在存档里。反过来也能推出一个常见的踩坑场景如果某个数据没有加UPROPERTY()它就不会被序列化到磁盘下次重新加载资源时值就丢了。这在编辑器资产上尤其阴险因为你在编辑器里看一眼数据还在内存中一切正常可是重新打开工程发现之前设的东西全回到了默认值。2.4 编辑器集成细节面板不是魔法用过 UE4 编辑器的人应该都对细节面板Detail Panel有印象选中一个 Actor 或者资产右侧就会列出所有可编辑属性还能实时修改。这套能力背后的核心机制也是反射。只要你的类继承自 UObject或更具体的 AActor、UActorComponent 等并且属性上用UPROPERTY(EditAnywhere)做了标记编辑器就能自动识别这些属性并把它们暴露给策划和美术。不需要你再手动写任何界面代码。这对一个工具链成熟的引擎来说价值怎么强调都不过分。更进一步如果你定义了一个UDataAsset子类那么它可以直接作为一种资产出现在内容浏览器里项目里所有人共享同一份配置。我经常在项目里用这招做全局配置先把需要用到的数据规划成一个个 UObject 子类再做成 DataAsset最后由主逻辑在初始化时加载。整个流程天然自带序列化和编辑器可视化比塞一堆共性的 JSON 或文本配置要直观得多。2.5 网络复制多人游戏的前置条件严格说不是所有 UObject 都能直接参与网络复制但它是这条路线的起点。UE 的网络同步核心是把某个对象上的属性定期从服务器同步到客户端。要想被复制这个对象首先得能有一个稳定的身份并且能被引擎整体管理和打标记UObject 正好符合这些条件。在实际项目中涉及联网最终继承的往往是 AActor 这类更上层的对象因为 Actor 自带世界位置、生命周期和复制接口。但所有这条路线的底层身份、路径、反射查询仍然由 UObject 提供。甚至可以说如果你想设计一套轻量的网络协议或者自研同步框架UObject 提供的统一标识和反射信息就是最方便的基础设施。3. 实操从零正确创建一个UObject子类光讲理论没用关键还得会用、用对。这一节我把创建和使用 UObject 子类的完整姿势拆开每一步给到可直接抄的代码和理由。3.1 第一步写一个带反射宏的骨架最简单的 UObject 子类长这样#pragma once #include CoreMinimal.h #include UObject/NoExportTypes.h #include MyDataObject.generated.h UCLASS(BlueprintType) class MYGAME_API UMyDataObject : public UObject { GENERATED_BODY() public: UPROPERTY(EditAnywhere, BlueprintReadWrite, Category Data) int32 Score; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category Data) FString DisplayName; UFUNCTION(BlueprintCallable, Category Data) void ResetData(); };这里有几个必须养成的习惯GENERATED_BODY()不能少它是 UHT 生成的元数据代码的入口没有它编译都过不了。UCLASS()/UPROPERTY()/UFUNCTION()是反射的标记不是随便写写装饰用的。头文件末尾要包含YourClass.generated.h而且必须放在最后这是 UHT 的固定要求。.generated.h是从哪里来的它是编译时由 UnrealHeaderTool 生成的不需要自己维护但你在源码中必须显式 include。你可能会问这些宏在真实编译中只是展开成普通代码真正起作用的是 UHT 生成的.gen.cpp。它里面记录了类的反射信息比如属性列表、函数列表、静态 UClass 指针等。引擎启动时这些信息会被注册到全局反射系统里。3.2 第二步创建实例的三种姿势UObject 子类不能直接new这句话是新手最需要记住的。正确创建方式是用NewObject。UMyDataObject* Data NewObjectUMyDataObject(this, UMyDataObject::StaticClass(), TEXT(MyData)); Data-Score 100;第一个参数是 Outer外层次结构通常传this。第二个参数是 UClass可以用类的StaticClass()获取。第三个参数是对象名可以省略但要传就尽量保证在 Outer 下唯一。为什么不能直接new因为 UObject 的创建过程不仅要分配内存还要注册到全局对象表、关联 UClass、设置 Outer、初始化标志位等。这些工作只有引擎的标准工厂函数能完整做掉。除了运行时创建还有一个很常用的对象叫 CDO全称 Class Default Object也就是“类默认对象”。每个 UClass 都有一个 CDO它用来保存这个类所有属性的默认值。在编辑器里你修改一个类的默认属性改的基本就是 CDO 上的值。// 获取类的默认对象 UMyDataObject* DefaultData UMyDataObject::StaticClass()-GetDefaultObjectUMyDataObject(); // 或者直接用类的静态方法 UMyDataObject* DefaultData2 UMyDataObject::GetDefaultObjectUMyDataObject();获取 CDO 后你可以读取它的默认值但尽量不要动手修改它。实例的默认值应该通过继承和属性配置去调整而不是在代码中偷偷改 CDO。第三类姿势是给 UObject 套一个“安全的 C 持有器”TStrongObjectPtr。它适合在非 UObject 类比如纯 C 管理器里保存一个 UObject 引用这样能保证对象在你持有期间不会被 GC 回收。TStrongObjectPtrUMyDataObject SafeData TStrongObjectPtrUMyDataObject(NewObjectUMyDataObject());用完就把TStrongObjectPtr置空或让它析构UObject 就又回到 GC 的管理范围内了。3.3 第三步类型判断、路径查询与序列化常用API实际操作中这几个 UObject 的原生接口出现频率极高我整理成一张速查表方便查阅接口作用常用场景GetFName()获取对象的短名字FName日志输出、快速比较GetPathName()获取对象完整路径运行时查找、资产路径记录GetOuter()获取对象的“外层次宿主”找回创建者、对象归属分析IsAT()判断对象是否属于某类型或派生类型安全检查CastT()类型安全向下转换失败返回 nullptr转换接口对象GetClass()获取对象的 UClass反射遍历、运行时类型识别IsValid()判断对象是否有效且未被回收指针安全检测StaticClass()获取类的 UClass配合 NewObject、反射比如你拿到一个UObject*想确认它到底是不是某个自定义类型直接写if (Obj Obj-IsAUMyDataObject()) { UMyDataObject* MyObj CastUMyDataObject(Obj); }另外序列化虽然多数情况由引擎隐式触发但也可以手动调用。比如你有一个 UObject 想丢进内存归档FBufferArchive Buffer; MyDataObject-Serialize(Buffer);它的内部实现就是遍历反射属性并写入归档。这也是 UObject 最典型的“反射 序列化”联动。4. 开发避坑实录这些坑我基本都踩过这一节我更想以“老玩家回忆录”的方式来写。下面的几个问题只在文档里看可能觉得离自己很远但实际项目里几乎天天有人翻车尤其是刚脱离蓝图想转 C 的同学。4.1 构造函数里new子对象编辑器笑而不语很多新手在写 UObject 子类时会下意识在构造函数里做这些事UMyDataObject::UMyDataObject() { // 错误示范 SubObject new UOtherObject(); }这样做最常见的结果是编译没问题编辑器一启动就崩或者对象创建后属性错乱、生命周期诡异。核心原因在于UObject 的构造函数发生在 CDO 创建阶段引擎还没准备好完整的对象注册环境普通new出来的 UObject 没有走NewObject的完整流程会被引擎视为非法对象。正确做法是如果子对象真的很必要应该用CreateDefaultSubobject来创建或者把需要在运行时初始化的逻辑放到PostInitProperties/BeginPlay中再用NewObject动态创建。UMyDataObject::UMyDataObject() { // 如果确实要有一个默认子对象 SubObject CreateDefaultSubobjectUOtherObject(TEXT(SubObject)); // 注意不是所有UObject子对象都适合这种方式动态场景优先PostInitProperties }我的经验是能不在构造函数里做的事尽量不要做。构造函数里越干净对象创建越稳。4.2 忘写UPROPERTY数据“人间蒸发”这一节放一个优先级最高的坑成员变量没加UPROPERTY()然后你发现蓝图上看不到这个变量、存档里读不回这个变量、甚至 GC 一跑指向其他 UObject 的指针失效。前面讲过反射系统只看标记过的属性。没标记的变量对引擎是完全透明的。它不会出现在编辑器细节面板不会参与序列化也不会被 GC 纳入引用关系。我之前遇到过一个很典型的现场工具类里存了一个UDataTable*因为写的时候忘了加UPROPERTY()结果运行时有时能用、经常莫名其妙变成无效对象。查了半天最后给变量加个UPROPERTY()就痊愈了。所以写类的第一反应应该是凡是你希望“引擎能看见”的变量一律加UPROPERTY()不希望引擎看见的也要想清楚这个变量是否会被 GC 或序列化影响。4.3 手动delete UObject千万别这么干没接触过 UE 内存模型的 C 程序员会习惯性地在析构或者清理阶段写delete SomeUObject;。在 UObject 体系里这几乎等于自杀。UObject 的内存由引擎的 GC 统一管理。你手动删了它但全局对象表里还留着这个对象的条目几条引用关系链也没有更新后续任何系统碰到这条残留记录都可能崩溃。正确做法是让 GC 做回收断开所有强引用把对象从根集合移除接下来交给 GC 扫描。如果对象还活着但你想主动淘汰可以先调用MarkAsGarbage()或者把对象从根集合移除不要直接 delete。UE5 之后垃圾回收机制做了一些改进但核心原则没有变创造交给 NewObject销毁交给 GC你自己尽量别碰内存释放。4.4 用UObject存海量高频数据一场性能灾难最后这个坑属于“架构级”的。UObject 之所以不适合所有场景是因为一个 UObject 实例本身有较大的内存开销。它包含对象基类信息、名称、Outer、标志位、反射相关的缓存信息等。单个看不出问题但如果你在游戏里创建十万个 UObject 小对象来存一粒粒的弹道数据、技能结算临时数据内存会被迅速吃穿GC 压力也会爆炸。正确的做法是需要反射、资产、蓝图交互、序列化、网络复制的数据才用 UObject纯粹的、轻量的、生命周期可控的数据用 USTRUCT 或普通 C 结构体。比如一个武器的攻击数据包用USTRUCT放在TArray里就很好完全没有必要做成 UObject。UE4 里大量基础数学结构FVector、FTransform都是 USTRUCT不是 UObject不是没有原因的。值类型和引用类型的使用边界需要一开始就明确。类型内存模型是否会被GC追踪是否支持反射编辑器集成典型场景UObject引用类型引擎统一管理是完整支持支持资产、组件、对象实体AActor继承自UObject有世界存在感是完整支持支持关卡中可生成的对象USTRUCT值类型通常按值传递否有限支持支持序列化/蓝图数据容器、传输结构纯C类完全自主管理否不支持不支持算法、系统内部计算5. 关于UObject我最后留下的几条使用原则写了这么大一圈沉淀下来其实没多少玄乎的东西都是实践逼出来的经验。第一一个对象需要被引擎“认识”的时候才把它设计成 UObject。这个认识包括需要存成资产、需要在蓝图里被访问、需要被编辑器编辑、需要参与网络复制或存档。没有这些需求别硬套。第二UObject 的类型边界要在一开始就划清楚。CC 里容易写出“万能 UObject”什么数据都往里塞最后 GC 压力大、序列化慢、逻辑混乱。轻数据走 USTRUCT重实体走 UObject能省下大量调优时间。第三永远别手欠去 delete 一个 UObject也永远别信任一个没有UPROPERTY()托管的裸指针。这两条规则基本涵盖了 UE 内存管理里 80% 的坑。我见过太多项目崩溃信息的根因绕来绕去最后都回到“对象生命周期管理混乱”这一件事上。把 UObject 当成万物之源去理解关键不在于记住它的 API而在于理解它为什么把名字、内存、反射、序列化都绑在一起。理解了这层原因以后遇到那些所谓“神秘问题”你基本都能一眼看穿它出现在哪条链路上。

相关新闻

Intersection Observer 实战:高效检测元素可见性的前端性能优化方案

Intersection Observer 实战:高效检测元素可见性的前端性能优化方案

先说一个我自己的结论:Intersection Observer 是过去几年里,前端性能优化性价比最高的 API 之一。它解决的核心问题非常朴素——怎么知道一个元素“真的出现在用户视野里了”。在懒加载图片、无限滚动、曝光埋点、滚动进入动画这些场景里,我们…

2026/10/4 3:03:22 阅读更多 →
2051张蟑螂图像:YOLO真实场景落地的数据基石

2051张蟑螂图像:YOLO真实场景落地的数据基石

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

2026/10/4 3:03:22 阅读更多 →
中北镇看感冒去哪个门诊

中北镇看感冒去哪个门诊

(朋友提问)“我最近有点感冒,咳嗽还低烧,中北镇这边看门诊该去哪儿呀?要挂什么科,流程麻烦吗?”(我的回答)感冒算是常见病,处理起来不算复杂。如果是成人&…

2026/10/4 3:03:22 阅读更多 →

最新新闻

9368张船只VOC数据集实战:格式转换、训练配置与切片推理

9368张船只VOC数据集实战:格式转换、训练配置与切片推理

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

2026/10/4 3:31:45 阅读更多 →
SpringBoot社区智慧养老系统实战:从数据建模到部署避坑

SpringBoot社区智慧养老系统实战:从数据建模到部署避坑

做社区智慧养老系统这个项目,起因是一个社区服务站想把手里的纸质档案和微信接龙式排班改成线上流程。接到需求时我第一反应是:这不就是一套管理后台?真正进场梳理之后才发现,老人档案、健康监测、服务预约、工单派发、家属通知&a…

2026/10/4 3:31:45 阅读更多 →
Warp 目录标签颜色设置:移除索引仓库自动添加,改为按需选择的「下拉框 + 文件夹选择器」双态控件

Warp 目录标签颜色设置:移除索引仓库自动添加,改为按需选择的「下拉框 + 文件夹选择器」双态控件

桌面应用开发者工具人工智能AI 应用AI Agent代码智能体 【免费下载链接】warp Warp is an agentic development environment, born out of the terminal. 项目地址: https://gitcode.com/GitHub_Trending/wa/warp 点击查看 免费下载 本指南基于 Warp 开源仓库中的 …

2026/10/4 3:31:45 阅读更多 →
Fine语言time.GetLocalListTime()函数详解:一次取回本地时间列表

Fine语言time.GetLocalListTime()函数详解:一次取回本地时间列表

1. 为什么拿到“时间”还不够,还要“时间列表”做报表开发多年,我越来越觉得Fine语言里最容易被低估的一类函数,就是时间处理。很多人一进来就急着处理业务表、写条件过滤,结果一到“取当前时间”“格式化日期”“算月初月末”这些…

2026/10/4 3:31:45 阅读更多 →
OpenRig:基于Node.js+tmux的本地AI工具链桥接方案

OpenRig:基于Node.js+tmux的本地AI工具链桥接方案

1. OpenRig 是什么:一个被严重误读的开源项目名称 OpenRig 这个词在当前中文技术社区里,正经历一场典型的“语义漂移”——它既不是某个广为人知的成熟开源框架,也不是官方发布的标准化工具套件,而是一个在特定技术圈层中自发形成…

2026/10/4 3:31:45 阅读更多 →
OrCAD PSpice蒙特卡洛与最坏情况分析:电路可靠性仿真实战

OrCAD PSpice蒙特卡洛与最坏情况分析:电路可靠性仿真实战

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

2026/10/4 3:30:44 阅读更多 →

日新闻

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/4 1:00:58 阅读更多 →
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/4 1:00:58 阅读更多 →
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/4 1:00:58 阅读更多 →

周新闻

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/4 1:00:58 阅读更多 →
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/4 1:00:58 阅读更多 →
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/4 1:00: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/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/3 9:42:35 阅读更多 →
黑夜航拍船只数据集训练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/3 9:42:36 阅读更多 →