Unity DOTS ECS架构实战:万鱼同屏性能优化与数据导向设计
1. 项目概述为什么ECS是万鱼同屏的“终极答案”做游戏开发尤其是涉及大量动态实体的项目最头疼的莫过于性能瓶颈。几年前我接手一个海洋生态模拟项目客户要求在移动端实现“万鱼同屏”的壮观效果。最初的方案是传统的GameObject MonoBehaviour结果在模拟3000条鱼时帧率就掉到了20帧以下CPU占用率飙升手机发烫。这几乎是所有Unity开发者都踩过的坑当场景中需要同时处理成千上万个逻辑相似但状态独立的实体时传统的面向对象架构OOP就成了性能的“绞肉机”。为什么因为传统模式下每个鱼都是一个独立的GameObject挂载着多个脚本MonoBehaviour。Unity引擎需要为每个脚本调用Update、FixedUpdate等生命周期函数这带来了巨大的函数调用开销。更重要的是数据位置、速度、旋转和逻辑移动、转向紧密耦合数据在内存中分散存储非连续CPU访问时缓存命中率极低大量时间浪费在从内存中抓取数据上。这就像你要从图书馆的几百个不同书架上找1000本书效率可想而知。而Unity DOTSData-Oriented Technology Stack中的ECSEntity Component System架构正是为了解决这个问题而生的。它不是简单的“另一种编程模式”而是一套从底层思维上重构游戏逻辑的解决方案。ECS的核心思想是数据与行为分离以及数据布局面向CPU缓存优化。在万鱼同屏的场景里这意味着所有鱼的位置数据被连续存储在内存的一块区域一个IComponentData数组。所有鱼的移动逻辑由一个独立的系统SystemBase一次性处理这个数组。CPU可以高效地利用缓存行Cache Line像流水线一样批量处理数据避免了成千上万的虚函数调用和缓存未命中。最终我们通过DOTS ECS重构后在同样的中端移动设备上稳定实现了超过10000条鱼流畅游动的效果帧率保持在60帧CPU占用下降了70%以上。这个项目让我深刻体会到对于大规模实体模拟ECS不是“可选项”而是“必选项”。下面我就把这套实战中总结出来的性能优化技巧从设计到实现毫无保留地分享给你。2. 核心架构设计从“面向对象”到“面向数据”的思维转变在动手写代码之前最重要的不是学习API而是完成思维模式的转换。用ECS做项目就像从开手动挡轿车换到开F1赛车操作方式完全不同但一旦掌握效率天差地别。2.1 ECS三大核心概念的精确定义与关系很多教程把Entity、Component、System讲得过于抽象。我用万鱼模拟这个具体案例给你具象化地解释一下Entity实体它不是一个对象而是一个轻量级的ID。你可以把它想象成数据库里的一条记录的主键。在万鱼系统里每条鱼对应一个Entity。这个Entity本身不包含任何数据或逻辑它只是一个索引用来关联下面的Component。注意传统GameObject是一个“胖”对象包含Transform、Renderer等。Entity是“瘦”ID成本极低创建和销毁开销可以忽略不计。Component组件它是纯数据的结构体Struct必须实现IComponentData接口。组件只定义状态不包含任何方法。FishMovementData包含float3 Position位置float3 Velocity速度float RotationY朝向。FishRenderData包含Entity LinkedEntity关联的渲染代理Entityfloat Scale大小。FishSchoolData包含int SchoolID鱼群IDfloat3 AverageSchoolDirection鱼群平均方向。 所有这些组件的实例都会按照类型被分别存储在连续的内存块中称为ComponentDataArray。这是性能提升的关键。System系统它是纯逻辑的类继承自SystemBase。系统的工作就是在每帧遍历所有拥有特定组件组合的Entity并对它们的数据进行批量操作。FishMovementSystem遍历所有拥有FishMovementData的Entity根据速度更新其位置。FishSchoolingSystem遍历所有拥有FishMovementData和FishSchoolData的Entity计算鱼群间的分离、对齐、聚合行为即经典的Boids算法并更新速度。FishRenderingSystem负责将FishMovementData中的位置、旋转数据同步到用于实际渲染的FishRenderData所关联的渲染代理上。它们三者的关系是System通过查询Query找到匹配的Entity和Component组合然后以最符合CPU缓存访问模式的方式高效地处理这些Component中的数据。一个Entity可以拥有多个Component一个System可以处理多个Component类型。2.2 万鱼同屏场景下的组件与系统设计蓝图基于以上概念我们可以为“万鱼模拟”设计出如下核心蓝图核心组件设计FishTag一个IComponentData空组件仅作为标签用于快速标记所有“鱼”实体。这在ECS中是一种常见模式用于高效筛选。FishMovementData核心移动数据。FishSchoolData鱼群行为数据。FishAvoidanceData包含一个NativeHashMap的键用于空间分区查询实现高效的碰撞避免后面会详细讲。FishRenderProxy一个ISharedComponentData包含一个对预制体PrefabEntity的引用。ISharedComponentData可以让拥有相同值的实体在内存中进一步分组提升渲染批次效率。核心系统设计执行顺序至关重要FishSchoolingSystem首先运行基于Boids算法计算每条鱼的期望速度。它需要读取所有鱼的位置、速度并写入新的速度。这里涉及大量邻居查询是性能关键点。FishObstacleAvoidanceSystem处理鱼与静态障碍物如岩石的避让。可以并行执行。FishMovementSystem最后运行根据最终确定的速度积分计算新的位置。[UpdateAfter(typeof(FishSchoolingSystem))]属性确保了执行顺序。FishRenderingSyncSystem将计算好的位置和旋转通过EntityCommandBuffer或直接写入LinkedEntity的LocalTransform组件驱动渲染。这个设计将数据Component和逻辑System清晰分离并且每个System内部都可以利用Burst编译器编译成高度优化的本地代码以及利用Unity Job System进行多线程并行计算。3. 性能优化核心Burst、Jobs与高效数据结构理解了架构我们进入实战中最硬核的部分如何让这上万条鱼的计算跑得飞快。DOTS的性能三板斧是Burst编译器、C# Job System和面向数据的设计。三者结合才能发挥最大威力。3.1 利用Burst编译器榨干CPU性能Burst是一个LLVM后端的编译器能将你的C#代码符合其安全子集编译成高度优化的SIMD单指令多数据机器码。在万鱼计算中效果立竿见影。关键操作为你的System添加[BurstCompile]特性。更重要的是将System中每帧执行的核心逻辑封装到一个实现了IJobEntity接口的Job结构中。[BurstCompile] public partial struct FishMovementJob : IJobEntity { public float DeltaTime; // 这个Execute方法会被Burst编译并对每个Entity并行执行 public void Execute(ref FishMovementData movement, in FishTag tag) { // 位置积分新位置 原位置 速度 * 时间 movement.Position movement.Velocity * DeltaTime; // 简单边界框检查防止鱼游出世界 const float worldHalfSize 50f; if (math.abs(movement.Position.x) worldHalfSize) movement.Velocity.x * -0.9f; // 反弹并损失部分能量 // ... 其他轴类似 } } // 在System中调度这个Job [BurstCompile] public partial class FishMovementSystem : SystemBase { protected override void OnUpdate() { float deltaTime Time.DeltaTime; var moveJob new FishMovementJob { DeltaTime deltaTime }; // Schedule() 将Job放入队列由Job Worker线程执行 // 这里依赖关系为Dependency表示本System依赖之前的System完成 moveJob.ScheduleParallel(this.Dependency).Complete(); } }实操心得Burst对代码有严格限制比如不能使用托管对象类、不能有虚函数调用、慎用静态变量。编写Job时尽量使用Unity.Mathematics中的float3,quaternion等类型它们能更好地被Burst优化并生成SIMD指令。遇到编译错误仔细阅读Burst给出的错误信息通常是发现了非托管代码或无法确定性的操作。3.2 使用C# Job System实现多线程并行上万条鱼的计算如果放在主线程一帧内根本算不完。IJobEntity的ScheduleParallel方法会自动将Entity块Chunks分配到多个工作线程上并行处理。你几乎不需要手动管理线程。性能关键点确保你的Job是“无竞争”的。即一个Job只写入自己Entity的组件数据或者通过NativeContainer如NativeHashMap以线程安全的方式读写共享数据。在万鱼模拟中最大的挑战是鱼群行为计算每条鱼都需要知道周围一定范围内其他鱼的位置和速度。这是一个典型的“所有实体需要读取所有实体数据”的问题朴素的双重循环复杂度是O(N²)不可接受。解决方案空间分区Spatial Partitioning。我们引入一个FishAvoidanceData组件里面包含一个int类型的键。然后在FishSchoolingSystem中创建一个NativeMultiHashMapint, FishSpatialInfo。键是空间网格的索引值是一个结构体包含Entity的索引和位置。第一个并行JobBuildHashMapJob遍历所有鱼根据其位置计算所在的空间网格索引例如将世界坐标除以网格大小后取整然后将鱼的信息插入到HashMap中。第二个并行JobCalculateSchoolingJob再次遍历所有鱼。对于每条鱼根据其位置计算所在网格及相邻8个2D或26个3D网格的索引然后从上一步构建的HashMap中快速取出这些网格内的所有邻居鱼信息进行Boids计算分离、对齐、聚合。 这样我们将邻居搜索的复杂度从O(N²)降低到了接近O(N)。这是实现万鱼同屏的核心技术。// 空间信息结构体 public struct FishSpatialInfo { public Entity Entity; public float3 Position; public float3 Velocity; } // 构建空间哈希图的Job [BurstCompile] public partial struct BuildSpatialHashMapJob : IJobEntity { public NativeMultiHashMapint, FishSpatialInfo.ParallelWriter SpatialMap; public float CellRadius; // 网格大小 public void Execute([EntityIndexInQuery] int entityIndex, in FishMovementData movement, in FishTag tag) { int3 cellIndex (int3)math.floor(movement.Position / CellRadius); // 将三维网格索引编码为一维整数键需注意哈希碰撞这里简化 int hashKey Hash(cellIndex); SpatialMap.Add(hashKey, new FishSpatialInfo { EntityIndex entityIndex, Position movement.Position, Velocity movement.Velocity }); } }3.3 内存布局与块Chunk的高效利用这是ECS最精妙也最容易被忽略的一点。ECS不会为每个Entity单独分配内存。相反它将拥有完全相同组件类型组合的Entity分组存储在称为块Archetype Chunk的连续内存块中。一个块大小通常是16KB。优化技巧1保持Archetype的纯净。尽量避免频繁添加或删除组件这会导致Entity在Archetype间移动引发内存拷贝。在万鱼模拟中所有鱼的“核心组件集”FishTagFishMovementDataFishSchoolData应该保持一致。对于“鱼是否被选中”这种临时状态可以考虑用另一个Enableable Component可启用组件或一个单独的NativeHashMapEntity, bool来标记而不是动态添加删除一个SelectedTag组件。优化技巧2利用ISharedComponentData进行合批。对于渲染我们可以使用ISharedComponentData。例如创建一个FishRenderSharedData组件里面包含一个Material的引用。所有使用相同材质的鱼会被ECS自动分组到同一个或相邻的块中。这样渲染系统可以一次性提交整个块的渲染数据极大减少Draw Call。public struct FishRenderSharedData : ISharedComponentData { public Material Material; public Mesh Mesh; }在创建鱼实体时为它们分配相同的FishRenderSharedData实例。拥有完全相同ISharedComponentData值的实体会被分组存储这是ECS实现动态合批的利器。4. 渲染与呈现连接ECS与渲染管线计算出来的上万条鱼数据最终需要呈现在屏幕上。传统GameObject渲染器无法直接渲染ECS的IComponentData。我们需要一个“桥梁”这就是渲染代理Render Proxy或使用Unity最新的Graphics.RenderMeshAPI配合实体渲染Entities Graphics包。4.1 基于渲染代理GameObject的经典方案这是兼容性较好、理解起来较直观的方案。我们为每条鱼的数据实体Data Entity关联一个用于渲染的GameObject实体Render Entity。创建渲染预制体创建一个非常简单的GameObject只包含MeshFilter、MeshRenderer和一个特殊的LinkedEntityGroup组件用于在实例化时关联子Entity。在System中同步数据[BurstCompile] public partial class FishRenderingSyncSystem : SystemBase { protected override void OnUpdate() { // 查询所有需要同步的鱼 Entities.WithAllFishTag().ForEach((Entity dataEntity, in FishMovementData movement, in FishRenderProxy proxy) { // 通过EntityManager获取关联的渲染实体的LocalTransform组件 var renderEntity proxy.RenderEntity; if (EntityManager.HasComponentLocalTransform(renderEntity)) { var transform EntityManager.GetComponentDataLocalTransform(renderEntity); transform.Position movement.Position; transform.Rotation quaternion.RotateY(movement.RotationY); EntityManager.SetComponentData(renderEntity, transform); } }).WithoutBurst().Run(); // 注意涉及EntityManager的操作不能Burst用.Run()在主线程执行 } }踩坑实录这里使用了.WithoutBurst().Run()因为EntityManager的API不是线程安全的也无法被Burst编译。这是ECS与渲染交互的一个性能热点。为了减轻主线程压力应确保这个System只做最必要的同步工作且鱼的数量极大时可以考虑按帧分批更新。4.2 基于Entities Graphics的现代高效方案如果你使用较新的Unity版本2022 LTS以后强烈推荐使用com.unity.entities.graphics包。它提供了MaterialOverride和RenderMesh等组件允许你直接在ECS中定义渲染属性并由Unity的SRP可编程渲染管线直接渲染完全绕过GameObject性能更高。安装Entities Graphics包并通过EntityManager直接创建带有LocalTransform、RenderMesh或MaterialMeshInfo等组件的渲染实体。在移动System中直接修改渲染实体的LocalTransform。因为渲染实体现在也是纯ECS实体你可以在Burst Job中直接修改其LocalTransform组件无需回到主线程。[BurstCompile] public partial struct FishMovementAndRenderJob : IJobEntity { public float DeltaTime; // 现在可以同时写入数据实体的位置和渲染实体的变换 public void Execute(ref FishMovementData movement, ref LocalTransform renderTransform, in FishTag tag) { // 更新逻辑位置 movement.Position movement.Velocity * DeltaTime; // 直接更新渲染变换 renderTransform.Position movement.Position; renderTransform.Rotation quaternion.RotateY(CalculateRotationFromVelocity(movement.Velocity)); } }这种方式实现了逻辑与渲染的完全并行和数据统一是性能最优的方案。但需要注意包版本兼容性和渲染管线的配置。4.3 使用GPU Instancing进行终极渲染优化无论采用上述哪种方案最终绘制上万条鱼时都必须使用GPU Instancing。幸运的是Unity的SRP和Entities Graphics包对此有很好的支持。在Material上开启GPU Instancing。确保所有实例使用相同的Mesh和Material。这正是我们之前使用ISharedComponentData来分组鱼的原因。Entities Graphics包会自动为使用相同RenderMeshMesh和Material组合的实体进行实例化渲染。你需要做的就是通过一个ComponentSystem或ISystem将每帧更新的所有鱼的LocalTransform数据收集到一个NativeArrayMatrix4x4中然后通过Graphics.RenderMeshInstanced或由渲染管线自动处理。在Entities Graphics方案下这一步通常是自动完成的。5. 实战调试与性能剖析项目跑起来了但帧率不稳或者CPU某个环节耗时异常怎么办DOTS有一套独特的调试和剖析工具。5.1 使用Entity Debugger与Systems窗口Entity Debugger在Unity编辑器的Window Analysis Entity Debugger中打开。这是你洞察ECS世界的“显微镜”。你可以查看所有Archetype、每个Chunk中的实体和组件数据。在万鱼模拟中你可以用它确认鱼的Archetype是否正确是否因为误操作产生了许多不同的Archetype每个Chunk是否被充分利用理想情况是Chunk容量如128个实体/块被填满是否有实体意外拥有了不该有的组件Systems窗口在Window Analysis Systems打开。这里以时间轴或列表形式展示了所有System的执行顺序和每帧耗时。这是定位性能热点的首要工具。你会清晰地看到FishSchoolingSystem和FishMovementSystem各自占用了多少时间。5.2 深入性能剖析Profiler与Deep Profiling当Systems窗口显示某个Job耗时很长时你需要深入代码内部。Unity Profiler切换到Deep Profiling模式。在Profiler的CPU Usage区域你可以看到每个Job函数的具体耗时。展开后甚至能看到Burst编译后的汇编指令虽然很难读但你可以看到热点是在内存访问还是计算上。手动插桩在Job的关键循环前后使用Unity.Profiling.ProfilerMarker进行手动标记。private static readonly ProfilerMarker k_MarkerSchooling new ProfilerMarker(FishSchooling); protected override void OnUpdate() { using (k_MarkerSchooling.Auto()) { // ... 调度和执行Schooling Job的代码 } }这样在Profiler中会显示出自定义的标记段让你更精确地定位到是邻居查询慢还是Boids计算本身慢。5.3 常见性能问题与排查清单下表总结了万鱼同屏项目中常见的性能陷阱及解决方案问题现象可能原因排查工具解决方案主线程卡顿在System的OnUpdate中直接使用了EntityManager的大量操作如创建、销毁、添加组件或使用了.Run()而非.Schedule。Systems窗口看主线程耗时Profiler看具体函数。将EntityManager操作通过EntityCommandBuffer记录在EntityCommandBufferSystem中集中执行。将能并行的逻辑封装成Job用.Schedule。某个Job耗时异常高1. Job内的算法复杂度高如O(N²)的邻居搜索。2. 内存访问模式差随机访问导致缓存未命中。3. Job内部有if分支导致SIMD利用率低。Profiler Deep Profiling分析Job代码。1. 引入空间分区如网格、四叉树/八叉树。2. 确保组件数据在内存中连续访问避免在Job中通过EntityManager随机获取数据。3. 尝试重构算法减少分支使用math.select等函数。内存分配GC Alloc过高每帧在System中创建了新的托管对象如new List()或在Job中错误使用了托管引用。Profiler的GC Alloc列。使用NativeContainerNativeList,NativeArray代替托管集合。在System的OnCreate中预分配OnUpdate中复用。确保Job只使用值类型和NativeContainer。渲染Draw Call过高每条鱼使用了不同的材质或Mesh无法合批。Frame Debugger。使用ISharedComponentData确保相同渲染资源的实体分组。检查材质是否启用了GPU Instancing。考虑使用Entities Graphics包。实体创建/销毁时卡顿一次性创建/销毁上万实体或频繁改变Archetype。Profiler。使用对象池Entity Prefab EntityCommandBuffer.Instantiate复用实体。避免每帧添加/删除组件用Enableable Component或标签状态机代替。5.4 移动端专项优化要点在手机等资源受限平台优化需要更细致降低精度在FishMovementData中使用half或float而非double。Unity.Mathematics提供了half类型。简化行为模型在低端机上可以减少Boids算法中考虑的邻居数量或增大空间分区网格大小减少查询开销。LOD细节层次为鱼实现简单的LOD。距离摄像机远的鱼可以使用更简单的移动逻辑如直线运动甚至减少更新频率如每2帧更新一次。这需要在System中根据鱼的位置进行分组处理。控制数量根据设备性能动态调整鱼的总数。可以在游戏设置中提供“鱼群密度”选项。电池与发热避免在后台或菜单界面运行模拟System。使用[UpdateInGroup(typeof(SimulationSystemGroup))]并确保在不需要时禁用整个SystemGroup。从传统OOP转向DOTS ECS最大的挑战不是语法而是思维模式。它要求我们从“对象能做什么”转变为“数据如何被高效处理”。一旦跨越了这个门槛你会发现处理海量实体不再是令人畏惧的难题。万鱼同屏项目只是一个起点这套以数据为中心、充分利用现代CPU多核与缓存特性的架构能够应用到粒子系统、大规模单位战斗、城市交通模拟等无数需要极高性能的场景中。

相关新闻

Jetson Nano部署海康MVS:ARM架构依赖兼容与工业相机集成实战

Jetson Nano部署海康MVS:ARM架构依赖兼容与工业相机集成实战

1. 项目概述与核心需求解析最近在折腾一个基于Jetson Nano的边缘视觉项目,需要接入海康威视的工业相机。本以为在ARM架构的Ubuntu系统上装个官方软件是分分钟的事,结果一脚踩进了依赖和兼容性的深坑里。海康的MVS(Machine Vision Software&am…

2026/8/11 7:52:17 阅读更多 →
SpringBoot注解实战:从核心原理到高频场景避坑指南

SpringBoot注解实战:从核心原理到高频场景避坑指南

1. 项目概述:从“菜鸟”到“老鸟”的注解通关秘籍刚接触SpringBoot那会儿,看着满屏的RestController、Autowired、Service,感觉就像在看天书。每个注解都认识,但组合在一起就不知道它们到底在后台干了什么,更别提灵活运…

2026/8/9 0:10:04 阅读更多 →
制造业AI Agent从单部门试点到全厂覆盖的路径:2026工业智能体规模化落地指南

制造业AI Agent从单部门试点到全厂覆盖的路径:2026工业智能体规模化落地指南

进入2026年,制造业智能化转型已从早期的“数字化记录”全面迈向“智能体协同”的新阶段。行业普遍认为,2026年是AI Agent规模化落地的元年。过去十年,制造业通过ERP、MES、WMS等系统解决了业务流程电子化的问题,但并未触及决策智能…

2026/8/10 15:18:13 阅读更多 →

最新新闻

终极指南:三分钟快速上手abogen有声书制作工具

终极指南:三分钟快速上手abogen有声书制作工具

终极指南:三分钟快速上手abogen有声书制作工具 【免费下载链接】abogen Generate audiobooks from EPUBs, PDFs and text with synchronized captions. 项目地址: https://gitcode.com/GitHub_Trending/ab/abogen abogen是一款功能强大的开源有声书生成工具&…

2026/8/11 17:20:51 阅读更多 →
豆顶顶 GEO 怎么做县域流量?昆山、张家港实战要点梳理

豆顶顶 GEO 怎么做县域流量?昆山、张家港实战要点梳理

先问个问题:你在豆包、DeepSeek里搜过“昆山精密加工哪家好”或者“张家港机械制造厂家推荐”吗? 昆山一个做精密注塑的老周试了一下,回来脸色不太好看。他在本地干了十几年,设备、品控、客户口碑都在线,结果AI推荐了五…

2026/8/11 17:20:51 阅读更多 →
A-09 语音处理模块:让每一次通话都清晰如面

A-09 语音处理模块:让每一次通话都清晰如面

在智能家居、门禁对讲、车载通话等场景中,回声和环境噪音一直是影响通话体验的两大顽疾。你有没有遇到过这样的尴尬——对着可视门铃说话,对方听到的却是刺耳的回声和呼呼的风噪?声讯电子推出的 A-09 语音处理模块,正是为解决这些…

2026/8/11 17:20:50 阅读更多 →
矿场里最贵的不是设备,是一句没听清的话

矿场里最贵的不是设备,是一句没听清的话

2023 年某省煤矿事故调查报告里有一行不起眼的记录:"当班安全员通过对讲机呼叫撤离,因噪声干扰,井下人员未听清指令。"矿场不缺设备。凿岩台车几百万一台,通风系统几千万一套,智能化巡检机器人刚被写进预算。…

2026/8/11 17:20:50 阅读更多 →
4个智慧修复场景:IOPaint如何让AI图像编辑像呼吸一样自然

4个智慧修复场景:IOPaint如何让AI图像编辑像呼吸一样自然

4个智慧修复场景:IOPaint如何让AI图像编辑像呼吸一样自然 【免费下载链接】IOPaint Image inpainting tool powered by SOTA AI Model. Remove any unwanted object, defect, people from your pictures or erase and replace(powered by stable diffusion) any thi…

2026/8/11 17:20:50 阅读更多 →
档案与文献机构做 AI 检索,卡在哪一步

档案与文献机构做 AI 检索,卡在哪一步

图书馆、档案馆、地方志机构,这几年都在试 AI 检索和智能问答。但这类机构的落地通常比预想慢,而且慢的原因很集中:不是模型不够强,而是数据太敏感、来源太杂、要求太细。下面用一个市级档案馆的数字化项目为例,看它一…

2026/8/11 17:19:50 阅读更多 →

日新闻

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南 【免费下载链接】video2x A machine learning-based video super resolution and frame interpolation framework. Est. Hack the Valley II, 2018. 项目地址: https://gitcode.com/GitHub_Trending/vi/v…

2026/8/11 0:00:02 阅读更多 →
前后端分离项目中控制台与接口工具数据差异排查指南

前后端分离项目中控制台与接口工具数据差异排查指南

1. 问题现象解析:控制台与Apifox的数据差异 最近在调试一个前后端分离项目时,遇到了一个典型问题:后端服务在本地开发环境控制台能正常输出查询数据,但通过Apifox测试时却返回空结果。这种"控制台有数据,接口工具…

2026/8/11 0:00:03 阅读更多 →
AI编程实战:从Claude Code踩坑到游戏开发入门

AI编程实战:从Claude Code踩坑到游戏开发入门

1. 从“AI能帮我做游戏”到“AI让我重新学编程”最近身边不少朋友,尤其是一些非技术背景、但对游戏开发有浓厚兴趣的朋友,都在问我同一个问题:“听说现在用Claude Code这种AI编程工具,小白也能做游戏了,是真的吗&#…

2026/8/11 0:00:03 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/11 1:08:05 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/11 1:08:05 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/11 1:08:05 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/11 17:09:45 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/11 1:08:06 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/11 17:09:45 阅读更多 →