GameDocGenSkill:基于代码即文档理念的游戏设计自动化生成方案

news2026/5/16 0:10:28
1. 项目概述与核心价值最近在游戏开发社区里一个名为“GameDocGenSkill”的项目引起了我的注意。这个项目由开发者 maqingwen2 发起其核心目标直指一个困扰了无数游戏开发团队的老大难问题如何高效、规范地生成和管理游戏设计文档。如果你在游戏行业待过几年一定会对“文档地狱”这个词深有体会。策划案、功能说明、数值表、美术需求、程序接口……这些文档散落在各种Word、Excel、在线协作文档里版本混乱、格式不一、查找困难更别提随着项目迭代文档与最终实现脱节最终沦为“考古文献”。GameDocGenSkill 试图用一套自动化的技能Skill来解决这个问题。它不是另一个文档模板也不是一个简单的在线编辑器。从名字和其技术栈来看它更像是一个基于现代开发工作流很可能集成在类似 VSCode 这样的 IDE 中或是作为一个独立的 CLI 工具的文档生成器。它能够根据代码注释、配置文件、甚至是游戏运行时数据自动提取信息并生成结构化的设计文档。这听起来有点像为游戏开发量身定做的“Javadoc”或“Swagger”但其复杂度和定制性远高于后者因为它需要理解游戏特有的概念如游戏对象、组件系统、关卡设计、任务流程、数值平衡等。这个项目适合谁首先当然是中小型游戏开发团队特别是那些采用敏捷开发但苦于文档跟不上节奏的团队。其次是独立开发者或技术策划一个人身兼数职更需要工具来保证设计思路的清晰和可追溯。最后对于任何希望提升项目工程化水平、让“设计-实现-文档”形成闭环的开发者都值得深入研究。它解决的不仅是“写文档”的效率问题更是“维护文档一致性”和“促进团队协作”的工程问题。2. 项目核心思路与技术选型拆解2.1 从“手动维护”到“代码即文档”的范式转变传统游戏文档的创作模式是“设计-实现-补文档”。策划先写出设计案程序美术据此开发最后如果有时间再回头更新文档。这种模式最大的问题是文档天生滞后且与代码是两套独立系统极易产生偏差。GameDocGenSkill 倡导的是“代码即文档”Code as Documentation或“文档即代码”Documentation as Code的理念。其核心思路是将文档视为一种可以由源代码或配置自动生成的“制品”Artifact。这意味着文档源与代码源绑定文档的“原材料”直接存在于代码注释、结构化配置文件如 JSON、YAML、甚至是专门的文档标记文件如 Markdown中并与代码一同进行版本管理如 Git。自动化生成与同步通过一个构建流程例如作为 CI/CD 流水线的一部分工具自动解析这些原材料提取关键信息并按照预定义的模板和规则生成最终的可读文档如 HTML、PDF、Word。单一事实来源关于某个游戏功能的最新、最准确的描述只存在于代码/配置这一处。生成的文档永远是当前代码状态的反映避免了多版本冲突。这种转变带来的好处是革命性的文档永远最新与代码变更同步减少了大量重复、易错的手动更新工作文档本身也成为了可测试、可评审的对象。2.2 关键技术组件与选型考量要实现上述思路GameDocGenSkill 需要整合多项技术。虽然项目具体实现未公开细节但我们可以根据其目标推断出核心组件1. 解析器Parser这是项目的大脑负责理解源代码。它需要支持多种语言C# / Unity这是游戏开发的主流。需要解析类、方法、字段上的 XML 文档注释以及[SerializeField],[Tooltip]等 Unity 特性Attributes从中提取对象描述、属性说明、甚至编辑器中的提示文本。C / Unreal Engine需要解析头文件中的注释可能还需要理解 Unreal 的 UPROPERTY、UFUNCTION 宏。Python / Lua常用于游戏脚本和工具链。解析其函数和模块的文档字符串Docstrings。配置文件JSON, YAML, XML解析游戏配置如角色属性表、物品数据库、对话树等将这些数据直接转化为文档中的表格或图表。选型上可能会使用现成的语法分析库如 ANTLR 用于定义自定义语法或 Roslyn 用于 C#也可能是为每种语言编写特定的正则表达式和 AST抽象语法树遍历逻辑。关键在于准确提取带有语义的元数据而不仅仅是文本。2. 模板引擎Template Engine这是项目的画笔负责将解析出的结构化数据渲染成最终文档。常用的有Jinja2 (Python)语法灵活生态丰富非常适合生成 HTML、Markdown。Handlebars / Mustache (JavaScript)逻辑轻量易于集成到 Node.js 环境中。Razor / T4 (.NET)如果项目主体是 .NET这些是自然的选择。模板决定了文档的最终样式和结构。一个游戏设计文档模板可能包括项目概述、模块架构图、核心类说明表、数值配置表、流程图等章节。模板引擎需要能方便地迭代数据、条件判断和包含子模板。3. 数据模型与中间表示Intermediate Representation, IR这是项目的通用语言。解析器从不同语言源提取的信息需要先转换成一个统一的、工具内部的数据模型例如用 JSON Schema 定义的一套对象包含GameClass,Property,Method,DataTable等类型。这个 IR 是连接解析器和模板引擎的桥梁使得增加对新语言的支持时只需编写新的解析器将其转换为标准 IR而无需修改模板和生成逻辑。这是保证项目扩展性的关键设计。4. 输出格式与集成Markdown最轻量、最通用的选择易于版本控制可直接在 GitHub/GitLab 上阅读也可用 Pandoc 等工具进一步转换为 PDF、Word。HTML可以生成更美观、带有交互性如可折叠章节、搜索的网站适合作为内部知识库。集成到 IDE作为 VSCode 扩展或 JetBrains Rider/IntelliJ 插件提供代码侧边栏的实时文档预览实现“所见即所得”的开发体验。集成到 CI/CD在 Git 提交或合并请求时自动生成文档并发布到内部 Wiki 或静态网站托管服务如 GitHub Pages, GitLab Pages。注意技术选型的核心权衡在于“通用性”与“深度”。一个试图支持所有游戏引擎和语言的全能工具其解析深度可能不如专为 Unity 或 Unreal 定制的工具。GameDocGenSkill 可能需要做出取舍或者采用插件化架构核心提供 IR 和框架针对不同引擎开发独立的解析器插件。3. 核心功能模块与实操设计3.1 代码注释规范与信息提取策略工具再强大也需要规范的输入。GameDocGenSkill 要发挥作用首先需要团队遵循一套约定的注释规范。这不仅仅是写“// 这是一个攻击力”而是要结构化地描述。以 Unity C# 为例一个理想的、可被工具解析的类注释可能是这样的/// summary /// 代表游戏中的玩家角色。负责处理移动、输入、状态机以及与其他游戏实体的交互。 /// /summary /// remarks /// 这个类与 PlayerAnimationController 和 PlayerStats 组件紧密耦合。 /// 核心逻辑在 Update() 和 FixedUpdate() 中处理。 /// /remarks public class PlayerController : MonoBehaviour { /// summary /// 玩家的移动速度单位米/秒。 /// /summary /// value默认值为 5.0f。受 speedModifier 影响。/value [Tooltip(角色基础移动速度)] [SerializeField] private float moveSpeed 5.0f; /// summary /// 让玩家向指定方向移动。 /// /summary /// param namedirection归一化的移动方向向量。/param /// param namedeltaTime时间增量通常来自 Time.deltaTime。/param /// example /// code /// // 在 Update 中调用 /// Move(transform.forward, Time.deltaTime); /// /code /// /example public void Move(Vector3 direction, float deltaTime) { // ... 实现代码 } }解析器需要做的是提取summary中的类/方法/属性描述。提取remarks中的补充说明。提取param和value标签中的参数和属性值说明。提取example中的使用示例这能极大提升文档的实用性。关键一步识别[Tooltip]和[SerializeField]等特性。[Tooltip]的内容通常是给设计师看的、最直白的描述可以优先作为属性的“简短说明”填入文档。[SerializeField]则标记了这个属性会在 Unity 编辑器中暴露意味着它是可配置的在文档中应高亮显示。对于配置文件例如一个 JSON 格式的技能表[ { id: skill_fireball, name: 火球术, description: 发射一枚火球对目标造成火焰伤害。, damage: 50, manaCost: 20, cooldown: 3.0, targetType: Enemy, unlockLevel: 5 } ]解析器应能识别这个 JSON 数组并将每个技能对象转化为文档中的一个表格行表头就是id,name,description等键名。更进一步如果有一个关联的 JSON Schema 文件工具可以利用它来获取每个字段的数据类型和更详细的描述生成质量更高的文档。3.2 文档模板设计与章节组织生成的文档长什么样完全由模板决定。一个完整的游戏设计文档模板应该覆盖从宏观到微观的各个层面。以下是一个可能的 Markdown 模板结构模板引擎会用真实数据填充{{ }}中的变量# {{gameName}} - 设计文档 (版本: {{version}}) 自动生成于: {{generateTime}} | 基于提交: {{commitHash}} ## 1. 项目概述 * **游戏类型**: {{genre}} * **核心玩法**: {{coreLoop}} * **目标平台**: {{platforms}} ## 2. 核心系统 {% for system in coreSystems %} ### 2.{{ loop.index }} {{ system.name }} **负责人**: {{ system.owner }} **概述**: {{ system.description }} #### 关键类 | 类名 | 职责简述 | 重要属性/方法 | | :--- | :--- | :--- | {% for cls in system.classes %} | {{ cls.fullName }} | {{ cls.summary }} | {{ cls.keyMembers }} | {% endfor %} #### 配置数据表 {% if system.dataTables %} {% for table in system.dataTables %} - **{{ table.name }}** ({{ table.filePath }}): {{ table.description }} {{ table.preview | truncate(200) }} {% endfor %} {% else %} *无* {% endif %} {% endfor %} ## 3. 游戏内容 ### 3.1 角色/单位 {% for entity in entities %} #### {{ entity.name }} * **生命值**: {{ entity.health }} * **攻击力**: {{ entity.attack }} * **技能列表**: {% for skill in entity.skills %} - **{{ skill.name }}**: {{ skill.description }} (冷却: {{ skill.cooldown }}秒) {% endfor %} {% endfor %} ### 3.2 物品/装备 ... (类似结构) ## 4. 用户界面 ... (描述UI流程可能链接到UI预制件或示意图) ## 附录完整类索引 {% for cls in allClasses %} - [{{ cls.fullName }}](#anchor-{{ cls.id }}): {{ cls.summary }} {% endfor %}这个模板展示了如何将不同的数据源项目信息、代码解析结果、配置文件组织成一个连贯的文档。{% %}是模板的控制逻辑循环、条件{{ }}是数据插值。3.3 构建流程与自动化集成单次生成文档很简单但价值在于自动化。我们需要将其嵌入开发工作流。以下是一个基于 GitHub Actions 的 CI 配置示例# .github/workflows/generate-docs.yml name: Generate Game Documentation on: push: branches: [ main, develop ] # 在主分支和开发分支推送时触发 pull_request: branches: [ main ] # 针对主分支的PR时也触发方便评审 jobs: generate-docs: runs-on: ubuntu-latest steps: - name: Checkout Code uses: actions/checkoutv3 with: fetch-depth: 0 # 获取全部历史用于生成版本信息 - name: Setup Python uses: actions/setup-pythonv4 with: python-version: 3.10 - name: Install GameDocGenSkill run: | pip install game-doc-gen-skill # 假设工具已发布到PyPI - name: Generate Documentation run: | gdgs generate \ --source ./Assets/Scripts \ --config ./game-doc-config.yaml \ --output ./generated-docs - name: Deploy to GitHub Pages if: github.ref refs/heads/main # 仅当推送到main分支时部署 uses: peaceiris/actions-gh-pagesv3 with: github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: ./generated-docs destination_dir: ./docs # 发布到仓库的 docs 目录这个工作流实现了在代码变更时自动触发。安装文档生成工具。执行生成命令指定源代码目录、配置文件、输出目录。只有当变更合并到主分支main后才将生成的 HTML 文档部署到 GitHub Pages使其成为一个随时可在线访问的、最新的设计文档网站。对于内部团队也可以将输出部署到内部的 Confluence通过其 API、Notion 或自建的 Wiki 系统。4. 配置详解与高级定制4.1 核心配置文件解析GameDocGenSkill 的强大和灵活性很大程度上依赖于其配置文件。一个典型的配置文件如game-doc-config.yaml可能包含以下部分# game-doc-config.yaml project: name: 我的奇幻冒险游戏 version: 1.0.0-alpha repository: https://github.com/yourteam/your-game input: sources: - path: ./Assets/Scripts language: csharp-unity # 指定使用Unity C#解析器 include: [**/*.cs] # 包含所有.cs文件 exclude: [**/Tests/**, **/Editor/**] # 排除测试和编辑器脚本目录 - path: ./Config/Data language: json-schema # 使用JSON Schema增强解析 schema: ./Schemas/item.schema.json # 指向Schema文件 - path: ./DesignDocs language: markdown # 直接包含手写的Markdown概述文档 parser: csharp-unity: extractTooltips: true # 是否提取[Tooltip]特性内容 includePrivateFields: false # 是否包含私有字段通常不包含 docTagMapping: # 自定义XML文档标签映射 “returns”: “返回值” “exception”: “异常” template: format: “html” # 输出格式html, markdown, pdf theme: “dark” # 主题风格 outputDir: “./docs” sections: # 定义文档章节及其数据来源 - id: “overview” template: “templates/overview.md.j2” data: “project” # 使用project配置数据 - id: “core-systems” template: “templates/system.md.j2” data: “parsed.classes” # 使用解析出的类数据并过滤出核心系统 filter: “category ‘core’” - id: “data-tables” template: “templates/datatable.md.j2” data: “parsed.jsonData” # 使用解析出的JSON数据 output: staticSite: true # 是否生成静态网站导航 searchIndex: true # 是否为静态网站生成搜索索引 pdf: enable: false # 暂时不生成PDF通过这个配置文件你可以精细控制扫描范围精确指定哪些代码和文件需要被分析避免无关文件干扰。解析规则针对不同语言设定解析细节比如是否提取私有成员。文档结构自由定义文档由哪些章节构成每个章节使用哪个模板、填充什么数据。输出定制决定最终产物的形式和功能。4.2 自定义模板与数据过滤默认模板可能不满足所有团队的需求。GameDocGenSkill 应该允许用户完全自定义模板。例如你可能想为“技能系统”单独创建一个更详细的模板{# templates/skill_system_detail.md.j2 #} # 技能系统详细设计 ## 技能效果类型 {% set effectTypes classes | selectattr(“baseClass”) | selectattr(“‘SkillEffect’ in baseClass”) | list %} {% for effect in effectTypes %} ### {{ effect.name }} **描述**: {{ effect.summary }} **适用目标**: {{ effect.metadata.target or “N/A” }} **代码示例**: csharp {{ effect.examples[0] if effect.examples else “// 暂无示例” }}{% endfor %}所有技能配置预览{% for skill in jsonData.skills %}{{ skill.name }} (ID: {{ skill.id }})属性值说明伤害{{ skill.damage }}{{ skill.damageFormula or “固定值” }}法力消耗{{ skill.manaCost }}-冷却时间{{ skill.cooldown }}秒-描述{{ skill.description }}-{% endfor %}在这个模板中我们使用了 Jinja2 的过滤器selectattr来从所有解析出的类中筛选出基类包含 SkillEffect 的类即所有技能效果类型。然后我们又遍历了从 JSON 配置中解析出的所有技能数据。通过自定义模板你可以将代码中的类结构与配置表中的数据关联起来生成一份既有架构说明又有具体数值的完整设计文档。 数据过滤是另一个强大功能。在配置文件的 sections 里你可以通过 filter 字段使用表达式来筛选数据。例如filter: “‘Network’ in fullName” 可以只生成与网络相关的类文档filter: “value 100” 可以在展示数值表时只列出大于100的项。这让你能轻松生成针对特定子系统或平衡性检查的专项报告。 ## 5. 实战部署与团队协作指南 ### 5.1 在现有项目中引入 GameDocGenSkill 将 GameDocGenSkill 引入一个正在开发中的游戏项目需要循序渐进的步骤而不是“一刀切” **第一阶段试点与规范制定1-2周** 1. **选择试点模块**挑选一个边界清晰、代码相对规范的核心模块比如“背包系统”或“任务系统”。 2. **补充注释**按照工具要求的格式如规范的 XML 文档注释为该模块的所有公共类、方法、重要属性添加或完善注释。重点描述“做什么”和“为什么”而不是“怎么做”代码本身说明了怎么做。 3. **整理配置**确保该模块相关的 JSON/YAML 配置文件键名清晰、有规律。 4. **首次生成**针对这个试点模块运行生成命令检查输出文档的质量。调整注释和配置直到生成的文档清晰可用。 **第二阶段团队培训与逐步推广1个月** 1. **制定团队规范**将试点阶段总结出的注释规范、配置文件格式要求写成团队的《文档编写指南》。 2. **进行培训**向团队尤其是程序员和策划演示工具的价值和使用方法。强调“写好注释自动生成文档”改变大家对写文档的抵触心理。 3. **纳入工作流**要求在新功能开发或旧功能重构时必须按照规范更新注释。可以将此作为代码审查Code Review的一项必查内容。 4. **分模块推广**一个模块一个模块地推广确保每个模块在接入工具后其文档质量得到提升。 **第三阶段全面集成与自动化长期** 1. **CI/CD 集成**如前面所述将文档生成任务加入 CI 流水线。 2. **设立文档负责人**指定专人通常是技术负责人或主程负责维护文档模板和生成配置处理工具使用中的问题。 3. **建立反馈循环**鼓励团队使用生成的文档并收集反馈持续改进注释规范和模板设计。 ### 5.2 与现有工具链的融合 GameDocGenSkill 不应是一个孤岛它需要与团队已有的工具链协同工作 * **与任务管理工具Jira, Trello, Asana**可以在生成的文档中嵌入指向相关任务或用户故事的链接。反过来也可以在任务卡片中附上自动生成的、最新的相关设计文档链接。 * **与版本控制系统Git**这是天然融合的。文档随代码版本化。利用 Git 的 Blame 功能甚至可以追溯每一行文档描述是随着哪次代码提交而改变的。 * **与通信工具Slack, Discord**可以在 CI 成功生成并部署新文档后向指定的团队频道发送通知附上文档链接和变更摘要。 * **与 Unity/Unreal Editor**终极形态是开发编辑器插件。在 Unity Inspector 中不仅能看到 [Tooltip]还能看到一个“查看文档”的按钮点击后直接跳转到该组件在线文档的对应章节。 **实操心得**引入此类工具最大的阻力往往不是技术而是习惯和文化。务必从小处着手用试点模块的成功案例向团队证明其价值。让工具为开发者服务而不是增加负担。例如生成的文档如果能帮助新成员快速上手或者帮助策划清晰地了解程序接口那么团队接纳它的意愿就会强得多。切忌一开始就制定过于严苛的规范那会适得其反。 ## 6. 常见问题、局限性与进阶优化 ### 6.1 典型问题排查速查表 在实际使用中你可能会遇到以下问题 | 问题现象 | 可能原因 | 排查步骤与解决方案 | | :--- | :--- | :--- | | 生成的文档为空或缺少大量内容 | 1. 源代码路径配置错误。br2. 解析器未能识别代码语言或注释格式。br3. 过滤器条件过于严格过滤掉了所有内容。 | 1. 检查配置文件中的 input.sources.path 是否为有效相对路径。br2. 运行工具时增加 --verbose 或 --debug 标志查看解析器日志确认它扫描了哪些文件、解析出了哪些元素。br3. 暂时移除或放宽 filter 条件看是否有内容输出。 | | 文档中的描述是过时的 | 1. 代码注释未随代码更新。br2. 生成后未重新部署如果是静态网站。br3. CI/CD 流程未正确触发或失败。 | 1. 这是“代码即文档”模式的核心挑战。需要通过代码审查强制要求更新注释。可以将“注释与代码逻辑一致”作为一条硬性规定。br2. 检查 CI/CD 流水线日志确认生成和部署步骤是否成功执行。br3. 考虑在本地开发时设置 Git 预提交钩子pre-commit hook在提交前运行文档生成并检查是否有因注释缺失导致的警告。 | | 生成的 HTML/PDF 格式错乱 | 1. 模板语法错误。br2. 模板中引用了不存在的数据变量。br3. CSS 样式文件丢失或路径错误。 | 1. 使用模板引擎的语法检查工具如果有或仔细核对模板文件。br2. 在调试模式下运行查看模板渲染时传入的完整数据对象结构确保变量名正确。br3. 检查输出目录中是否包含了所有静态资源CSS, JS, 图片。 | | 解析特定语法如新的 C# 特性失败 | 工具使用的解析器库版本过旧不支持新语法。 | 1. 查看项目 Issue 或文档确认是否已有相关报告。br2. 考虑升级解析器库如 Roslyn 版本。br3. 如果工具是开源的可以尝试贡献代码来增加支持。 | | 性能问题生成速度很慢 | 1. 源代码目录过大扫描文件太多。br2. 解析过程复杂如深度分析继承关系。br3. 模板渲染计算量大。 | 1. 优化 input.sources.include/exclude 模式排除第三方库、生成代码等无关目录。br2. 考虑增量生成只分析自上次生成以来有变化的文件。这需要工具本身支持或自己实现缓存机制。br3. 简化过于复杂的模板逻辑。 | ### 6.2 当前方案的局限性 认识到工具的局限性才能更好地使用它 * **无法替代高层设计文档**工具擅长生成描述“是什么”和“怎么做”的 API 式、数据字典式文档。但对于“为什么这么设计”的决策过程、宏观的游戏体验规划、美术风格定义、叙事大纲等仍然需要策划人员撰写高层设计文档。 * **对注释质量依赖极高**Garbage in, garbage out。如果代码注释本身写得含糊、错误或不完整生成的文档质量也会很差。工具只能做信息的搬运工和整理者无法创造信息。 * **难以处理非结构化知识**团队成员之间的邮件讨论、会议记录、白板草图等隐性知识目前还无法被自动捕获和文档化。 * **学习与配置成本**团队需要学习新的注释规范和工具使用初期会有一定的适应成本。 ### 6.3 进阶优化方向 对于有能力的团队可以在 GameDocGenSkill 的基础上进行深度定制 * **生成交互式图表**不仅生成文字和表格还可以解析代码中的依赖关系自动生成并嵌入 UML 类图、序列图使用 Graphviz、Mermaid 等。例如自动绘制所有技能类与效果类的继承关系图。 * **与运行时调试结合**生成一个“调试面板”文档其中包含游戏中重要实体的当前状态查询接口需工具生成少量辅助代码让测试人员或策划能在游戏运行时实时查看和修改某些参数在开发版本中并将修改记录关联回设计文档。 * **多语言文档生成**如果游戏需要国际化可以在注释中使用特定标签如 summary lang”en”让工具根据配置生成不同语言版本的设计文档。 * **生成策划案草稿**更进一步可以编写一个“逆向”模板根据现有的、规范的代码和配置反向生成一份面向策划的、更易读的功能需求描述草稿供策划在此基础上润色和补充这能极大提升策划与程序之间的沟通效率。 工具的价值在于将开发者从重复、机械的文档维护工作中解放出来并强制推行一种更严谨、更可追溯的开发习惯。GameDocGenSkill 所代表的思路是游戏开发工程化成熟度的一个体现。它可能不会适合所有团队的所有阶段但对于那些深受文档问题困扰、渴望提升协作效率和项目质量的团队来说投入时间探索和引入这样一套实践其长期回报将是非常可观的。最关键的是迈出第一步选一个小模块把注释写好然后看看机器能为你生成什么。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2590059.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…