doom3 代码结构
doom3代码结构 code原文地址 https://www.iddevnet.com/doom3/code.php原来 我认为这个网站已经倒闭了毕竟从Doom4quake4是2004,2005的关注的人太少了 我觉得这些文章有助于对于doom3,代码的理解比单纯的看源代码要好的多了idcevNet是介绍doom3和quake4的Mod关卡制作的网站我以前翻阅时候网站还在....其他 不知道.........但是我也没有太多的时间来翻译 这个我看 有道翻译 插件 的质量还 可以有的英文网页使用 有道 翻译 插件 查看……译文如下该守则是所有 真正的乐趣 开始 发生 的 地方。Doom 3 SDK拥有相当于游戏源代码的一半。我将简要介绍 SDK 中 的 主要部分并触摸 主引擎 中 的一些 子系统。编译您将需要做的第一件事是确保您可以构建和运行代码。我们使用Visual Studio.Net开发它它可能或可能不工作在6.0。理想情况下您只需双击解决方案文件并点击构建即可。它将在输出文件夹中创建一个gamex86.dll。您将要使用批处理文件后期制作步骤或仅通过更改链接器输出目录将其移动到您的mod文件夹。测试您的代码是否正在使用的一种快速方法是通过打开Entity.cpp滚动idEntity :: Spawn并在“ifdef”行之后的开头插入此代码gameLocal.Printf“Hellos\ n”classname;这应该导致“Hello classname”随时在新的实体中出现在控制台中。idlibidLib只是一个存储随机通用经常使用的代码的库。它包含字符串代码解析器几个哈希表数学库计时器容器等等。它也是存储所有 SSE 代码的地方所以 检查idLib / Math / Simd _ *。*如果你喜欢这样的事情。游戏系统游戏代码有很多部分与Doom 3没有任何关系而是基于游戏代码构建的基础。GameSys游戏代码的核心是GameSys。这包含了基本的idClass类以及事件系统和保存游戏系统。游戏系统是非常抽象的并没有真正 了解 任何建立在 其上的实际游戏。它知道如何做是创建对象消防事件并走走对象进行保存和 恢复。当在 entitydef中 指定“spawnclass”时它会 调用 idClass :: CreateInstance来创建 该 spawn 类 的 实例。类通过 使用 Class.h中定义的CLASS_DECLARATION宏来 注册到idClassAIAI文件夹实际上 并不包含 怪物的AI在脚本中定义。相反C AI代码是将脚本与游戏的其余部分联系起来的“胶”。它包含通过AAS区域意识系统的路由和路径以及事件处理。核心对象是idAI它来源于idActor- idAFEntity_Gibbable- idAFEntity_Base-idAnimatedEntity- idEntity- idClass。在Doom 3中路由是“如何从地图的一个区域到另一个区域”而路径是“如何在该椅子周围导航”。差异是微妙但重要的。AI是与正在生产的实际游戏最紧密的 游戏系统。一个例子是 idAI_Vagary它包含 Vagary 在播放器上 拾取 和 抛出对象的 特殊代码。AI_events.cpp包含处理AI脚本中的事件的所有代码。大多数函数只是调用AI.cpp的存根其中代码的大部分是。一个例子是 Event_KickObstacles它刚刚 修复 了 参数 并 调用了 KickObstacles。物理学Doom 3游戏代码附带了整个Doom 3物理系统。核心引擎 本身绝对 没有物理代码。即使LCP 解决方案都在 idLib中。物理代码绝对是巨大的但幸运的是您不需要在“”中了解其中的大部分内容,更重要的是如何使用它。idPhysics 对象 是用于 操纵 实体 的 位置 和 方向 的 工具。物理对象是用于碰撞检测的idClipModels的容器。物理系统 根据 物理学规律 或 其他规则 处理通过 世界移动 这些 碰撞模型。每个idEntity都有一个指向idPhysics对象的指针该对象可以使用idForces移动尽管还有其他方法可以移动它。每一帧idEntity从物理系统的原点和轴信息更新其视觉模型。渲染系统 具有每个 实体 的视觉模型物理系统具有每个实体的剪辑模型有时称为战斗模型。可以从地图模型使用标记为剪辑的任何曲面加载碰撞模型或者可以从渲染模型生成默认情况下它使用渲染模型中的所有曲面但可以使用“纹理/普通/碰撞“应用它的材料在这种情况下它使用该简化模型或者它可以从.cm文件加载使用DOOMEdit创建。idPhysics 有多个子类它们都实现了专门的物理类型。例如门使用idPhysics_Parametric抹布娃娃使用idPhysics_AF等等。大多数 物理类型 都是自解释的并且它们 都在.h文件的顶部有一个简短的描述。如果您不希望在物体上运行物理请确保TH_PHYSICS标志已被清除例如当对象进入休息状态时。如果不能触摸对象而不是仅将内容掩码设置为0则应该取消链接剪辑模型。这将加速碰撞检测因为它甚至不会访问该剪辑模型。你应该确保没有任何可能导致物理学不断运行在物体上的东西的小动作。有几个控制台命令帮助调试物理减速。最有用的可能是g_showActiveEntities。anim动画动画系统不会决定要播放哪些动画在脚本中完成而是在动画中进行混合动画帧之间的拖动混合骨骼权重和调用帧命令。在Doom 3中有4个不同的动画通道“躯干”“腿”“头”“眼皮”以及第五个伪通道“全”。每个动画漫画可以同时播放不同的动画。这样可以避免地震2“射击时出现”问题以及Quake3 “我的模式是碎片”的问题。有一个单一的网格但每个动画影响一组不同的骨头。所有这些都在Anim_Blend中处理。它还可以处理两种完全不同的动画之间的混合例如当您在武器之间切换时。框架命令在modelDef中定义从ServiceAnims调用。每次更新动画时它会看到它是否通过了定义了frame命令的“边界”。实际上真的很容易添加自己的帧命令。您只需要将一个项目添加到frameCommandType_t枚举中然后在 AddFrameCommand 和 CallFrameCommands 中 实现 它 的 case 语句。Script脚本很多我看源码是根据Quake3的 Script 改进而来..只不过加入了c的一些语法类似于Anim脚本子系统是非常通用的根本不知道Doom。脚本系统的主要入口点是通过idProgram。系统中只有一个程序它是idGameLocal的成员。它扫描脚本目录并编译其中包含的所有脚本。它拥有所有的功能和变量信息。idProgram 是唯一使用idCompiler的类。idCompiler是Op代码生成器。它使用idLib中定义的词法分析器和解析器。要实际调用脚本函数创建一个新的idThread它应该被分配给新的不是在堆栈上创建的。idThread中有静态函数来处理当前活动线程的跟踪。每个线程都有一个idInterpreter它包含一个线程的所有堆栈信息和指令指针。游戏线程不是实际的操作系统线程。它的工作方式是脚本系统为每个线程提供运行每个帧的机会。线程运行直到它获得多帧事件或遇到暂停事件如sys.pausesys.waitFor或sys.wait还有一个对ai对象的等待命令。游戏实用程序文件Net网络原始网络代码仍然在引擎内但Doom 3暴露了以前的id引擎没有的很多网络。在Doom 3中您可以将包含您想要的所有内容的自定义位消息雕刻成任意客户端。这显然是一个非常强大的工具。大部分的代码都在Game_network.cpp中但网络代码几乎遍布所有的游戏文件。两个最重要的功能是WriteToSnapshot和ReadFromSnapshot。这两个功能处理实体的定期更新。所有的客户端实际上都是运行与服务器完全相同的游戏代码所以在理论上他们永远不会失去同步但是众所周知他们确实失去了同步。快照机制将定期捕获客户端以与服务器同步。Game / GameLocalidGame是整个游戏dll的界面类。这是核心引擎唯一看到的。引擎在加载游戏DLL时首先要调用GetGameAPI将其接口指针传递给一系列内部系统类。该函数将系统类指针复制到dll中的全局指针然后返回一个指向idGameLocal对象指向idGame的指针。idGameLocal是游戏界面的实际实现。由于gameLocal是游戏中的全局对象所以很多真正的随机函数最终都会被抛出来。在idGame中定义了非常重要的功能如InitFromNewMapRunFrame和Draw。MultiplayerGame定义了所有多人游戏的特定游戏代码例如保持得分和投票。PvsPVS潜在可见集跟踪从其他方面可以看到的区域。它是从渲染门户的地图加载计算的。它允许游戏代码确定对象或怪物是否应该处于休眠状态网络代码也可以使用它来确定哪些更新发送到哪些客户端。AFidAF是一个铰接的图形助手类。它包含一个指向动画师的指针它用于围绕对象移动。它没有做任何解决这都是在idPhysics_AF中完成的但是将解决的AF位置应用于实体模型记住物理模型是与渲染系统完全分离的系统。IKidIK是逆运动学助手类。目前只有Actor角色才能将他们的脚放在地上但很容易被用于更多的地方。它与idAF类似。PlayerIconidPlayerIcon是一个帮助类用于在多人游戏中头部绘制滞后和聊天图标。PlayerViewidPlayerView是一个帮助器实用程序从玩家角度呈现场景。这是PDA被绘制的地方以及最后一刻的影响如屏幕血溅狂战士影响力和双重视觉观察以及屏幕淡入淡出。SmokeParticles烟雾 粒子系统 用于该不断变化 以完全非 paramentric 方式位置或取向的颗粒的效果。这样的一个例子是烟雾的影响GameEdit好我说谎核心引擎也看到了 idGameEdit。这是一个实用程序类允许编辑器如AFEditor在游戏运行时操纵实体。比如在控制台中用来进行对于游戏关卡编辑器的加载灯光编辑器的使用了。游戏实体现在我已经浏览了游戏制作的主要系统我可以开始谈论实际的游戏代码。我要讨论的其余代码几乎都是从idEntity派生的。这些是门怪物玩家物品火车触发器灯光和其他众多的东西。我认为最简单的方法是逐个谈论每个文件。实体idEntity是派生所有实体的基类。它处理所有实体常见的大多数“低级”维护功能如诞生思考运行物理绑定播放声音显示隐藏等。Entity.cpp 还包含 idAnimatedEntity它只是一个具有 关联动画师可以播放动画的 实体。WorldSpawnWorldspawn是一个代表整个级别本身的实体。这里唯一的代码是从地图读取一些属性以设置 重力 和 耐力并调用 级别 脚本。相机idCamera用于客观截图当客观工具提示弹出时以及 电影摄影机。大部分代码涉及以下动画 在md5camera类中定义。摄像机 也可以绑定到移动实体因为任何实体可以绑定到任何其他实体。SecurityCamera安全摄像机用于制作平移可拆卸的安全摄像机如CPU中的。他们只是左右移动找出自己的事情。脆性断裂脆性断裂是任何物体在损坏时相当壮观的物体的术语。通常这意味着玻璃但从技术上讲您可以在BrittleFracture对象上放置所需的任何纹理。脆性断裂会将平面细分成多个碎片然后跟踪 碎片 之间 的 连接因此当两个碎片之间有足够的损坏时链接 将 断开。单个玻璃片 通过物理系统 作为 idPhysics_StaticMulti 的一部分。这使得 破碎玻璃 相当 缓慢。可以通过将碎片作为粒子进行处理从而不通过物理系统运行来加快它的加速但是看起来不会那么好。FxFX实体是特殊效果的容器对象。该文件 还包含作为 传送目的地 实体 的idTeleporter。光IdLight实体代表了可以用灯光完成的所有事情打开和关闭有声音脉动衰落进出等。声音idSound就像idLight但是声音项目项目是东西玩家可以拿起得到的东西。武器健康盔甲等都是物品。该文件定义了基本idItem大多数情况下使用以及idMoveableItem用于装甲和其他较大的对象idItemPowerup隐形berserk等idObjective表示一个目标idVideoCDItemidPDAItem和idMoveablePDAItem。它还定义了idItemRemover和idObjectiveComplete它们是从玩家iventory中删除项目的实体。项目和可移动项目之间的区别在于环境如门在触摸项目时的反应。对于常规项目对象将直接通过它但对于可移动项目项目将被移动器推动。idMoveabe可移动物体的类idMoveable 就像一个可移动的项目你不能拿起来。例子是 人 们喜欢打汉堡包箱子 苏打水罐垃圾桶垃圾桶等。有两种特殊情况 下 可移动 的 定义idBarrel和idExplodingBarrel。我希望这两个行为是显而易见的。trigger触发器触发器是触发目标实体或发生事件时调用脚本的实体。“某事”取决于它是什么样的触发器。有玩家的触发触发器怪兽的触发触发器定时器触发器伤害触发器褪色触发器仅在触发一定次数后触发的触发器触发器仅触发某些实体等。主要的是请记住每当触发器被触发时它将向其目标的任何实体发送一个Activate事件。target目标目标被用作触发的目标。有大约30种不同的目标实体类型它们做的是非常不同的事情所以我不会提及它们。幸运的是大多数目标往往相当小只有一个Event_Activate功能所以我需要一分钟才能通过Target.h扫描其他杂项是我们将实体放在其他地方并不合适的地方。它包含像idVacuumEntity和idPlayerStart这样的东西。它还包含约30个实体所以我不会去那些。AFEntityAFEntity是一个具有关联关联数字的实体。它实际上可以是许多不同类型的实体之一。玩家怪物车辆链条如起重机和通用的尸体都是AF实体。有一个idAFEntity_Base类其中包含所有AF实体共享的一些基本功能然后派生自idAFEntity_GibbableidAFEntity_VehicleidAFEntity_SteamPipe和idAFEntity_ClawFourFingers。除了产生和销毁AF实体之外AFEntity实际上并不做很多事情因为所有的真实工作都是在idAF和idPhysics_AF中完成的。idClass -Identity -idAnimatedEntity | -idWeapon | -idAFAttachment -idAFEntity_Base ----使用idAF | -idAFEntity_ClawFourFingers | -idAFEntity_Vehicle | | -idAFEntity_VehicleFourWheels | -idAFEntity_VehicleSixWheels -idAFEntity_Gibbable | -idAFEntity_WithAttachedHead | -idAFEntity_Generic | -idAnimated -idActor ----使用idIK | -idPlayer -idAIActor一个演员是需要一些AI的东西。一般来说一个actor有一个与它相关联的.script但并不总是需要一个一个没有脚本的演员只要站在那里眨眼就像在现实生活中。idActor源自idAFEntity_Gibbable。播放器idPlayer是...播放器。它处理输入处理项目处理电影动画传送和一整套其他事情大概8000行。Player.cpp也是idInventory的所在地它只是玩家库存的辅助类。射弹一个物体是一个飞过世界的物体对任何物体造成伤害。一般来说他们被武器开枪见下文但不一定是。例如“雷约”创造了射弹但他技术上没有任何武器肩上安装的火箭发射器是他的模型的一部分岩石是由脚本产生的。武器一个idWeapon是玩家在游戏中跑到身边的一个实体。它可能会也可能不会射出射弹但大部分时间都是这样。idWeapon有趣的是每个玩家有一个而不是一个武器。当玩家切换武器时只需将一个新的武器脚本加载到现有的idWeapon中。引擎 代码现在我们已经完成了一大堆的源代码我们来看一些您没有代码的系统。SystemSys是所有操作系统特定呼叫所在的地方。像锁定内存和诞生 线程 的东西在这里。所有的函数和类都在sys_public.h中定义在sys文件夹中。游戏中的所有功能都可以通过idSys单例 通过全局sys对象访问的成员。CommonidCommon处理启动和关闭所有其他系统包括游戏系统。它还执行错误警告和调试消息打印它将消息路由到日志文件控制台早期控制台专用控制台或任何其他需要它。在引擎中代码看起来像这样void mainvoid{ Sys_Init; 共初始化; 而1{ 共框架; } }Sys_Init; 共初始化; 而1{ 共框架; } }命令系统idCmdSystem处理用户键入任何一个控制台游戏中专用或编辑器的命令。游戏代码也可以直接将命令传递给命令系统进行处理。命令系统的每个帧都将解析出命令缓冲区并通过调用与命令关联的回调函数来执行任何等待命令。例如“quit”将调用Com_Quit_f回调函数然后调用common- Quit。CVar SystemidCVarSystem处理 控制台 变量。Doom 3中的控制台变量 比 以前的引擎中的控制台变量 更冷。它们被添加到CVar系统中idCVar com_showFPS“com_showFPS”“0”CVAR_BOOL | CVAR_SYSTEM“”;idCVar的构造函数将cvar添加到cvar的静态列表中然后在启动时将其添加到cvar系统中。然后您可以通过实例化对象访问cvar。您还可以通过实际cvar系统中的函数来访问cvars但是这有点慢因为它必须每次执行查找而不是将其存储在cvar对象中。文件系统idFileSystem允许访问文件。这是非常抽象的因为您请求的文件可能在真实的文件系统中或者它可能在包文件系统中。它也可能在mod目录或游戏目录中。当你要求“cheese / gouda.jpg”时它将搜索游戏目录然后是 游戏包 文件然后是基本目录然后是 基本包 文件。如果服务器以纯模式运行则 文件系统 将只检查 包文件。文件系统跟踪在服务器上进行纯检查的所有文件也可以设置为复制模式fs_copyfiles以帮助进行构建。网络系统游戏系统真的只能访问网络系统的两个部分回读读/写idGame :: ClientReadSnapshot / idGame :: ServerWriteSnapshot并 发送 和 接收 可靠消息在idNetworkSystem中的功能。idNetworkSystem中还有其他一些功能来获取 ping 和 丢包 等 统计 信息。渲染系统渲染器分为3个不同的概念部分RenderWorld与场景图非常相似。它包含场景中的所有渲染模型和纹理以一些易于剔除的方式排列。它处理对后端的剔除和调度命令。后端是一个经过优化的系统用于渲染三角汤(待定。为Doom 3支持的每个主要硬件架构NV20R300ARBARB2CG编写了一个单独的后端。渲染系统管理所有的渲染世界可以有多个渲染并且作为渲染系统的入口点。声音系统声音系统非常类似于渲染系统因为有一个声音世界或两个或三个处理所有真正难处理的东西声音系统 只是作为一个戒指领袖。声音世界 跟踪所有发射器的位置它们在什么状态以及听众的位置。渲染模型管理器idRenderModelManager处理渲染模型的加载和释放。这些型号可以是各种文件格式包括BSPLWO和ASE。模型管理器首次在请求时缓存模型数据。每个要用于级别的模型都应该在级别加载期间由模型管理器加载在BeginLevelLoad和EndLevelLoad调用之间。这将确保在实际游戏过程中最小的磁盘命中。user 用户界面管理器idUserInterfaceManager的行为与模型管理器完全相同除了GUI。decl 声明管理器idDeclManager处理加载缓存读取和写入任何种类的声明。它扫描目录并解析出decils为每种类型自动创建适当的decl对象。您可以使用decl管理器注册自己的定制声明类型以及要扫描的新文件夹。就像其他管理者一样它所加载的任何decls都应该在指定的级别加载时间内完成以防止不必要的磁盘命中。AAS文件管理器idAASFileManager加载并释放AAS区域感知系统文件。这是在游戏代码中获取idAASFile的唯一方法。碰撞模型管理器碰撞模型管理器与渲染模型管理器完全相同除了物理系统而不是渲染系统。

相关新闻

Java DDD(领域驱动设计)

Java DDD(领域驱动设计)

一句话核心: DDD(领域驱动设计)不是一套框架,而是一种代码组织哲学。它要求你用代码直接翻译业务语言,而不是把业务逻辑散落在增删改查(CRUD)里。 对于Java开发者,最经典的DDD范式就…

2026/10/26 6:53:41 阅读更多 →
【OpenHarmony/HarmonyOS】从 Debug 到 Release:Hvigor 构建、签名、混淆与敏感配置治理

【OpenHarmony/HarmonyOS】从 Debug 到 Release:Hvigor 构建、签名、混淆与敏感配置治理

【OpenHarmony/HarmonyOS】从 Debug 到 Release:Hvigor 构建、签名、混淆与敏感配置治理应用能在模拟器运行,不代表已经具备发布条件。本文以 HarmonyOS Stage 工程为例,梳理产品配置、HAP 构建、签名、混淆和密钥治理,并特别说明…

2026/10/25 10:33:12 阅读更多 →
【OpenHarmony/HarmonyOS】游戏项目测试体系:用 Hypium 覆盖迷宫、碰撞、存储与页面流程

【OpenHarmony/HarmonyOS】游戏项目测试体系:用 Hypium 覆盖迷宫、碰撞、存储与页面流程

【OpenHarmony/HarmonyOS】游戏项目测试体系:用 Hypium 覆盖迷宫、碰撞、存储与页面流程Canvas 游戏常被误认为“只能靠手玩测试”。实际上,迷宫、向量、碰撞、结算和存储都非常适合自动化。本文基于项目现状设计一套从纯函数单测到真机流程测试的分层方…

2026/10/25 11:06:41 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/26 12:00:21 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/27 4:06:49 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/26 4:52:12 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/26 12:00:21 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/26 5:00:37 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/27 4:06:50 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 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/26 12:00:19 阅读更多 →
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/25 13:21:54 阅读更多 →
黑夜航拍船只数据集训练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/26 8:34:37 阅读更多 →