【GitHub开源项目】OpenClaw深度解析——开源多模态大模型系统的架构设计与核心实现

【GitHub开源项目】OpenClaw深度解析——开源多模态大模型系统的架构设计与核心实现

摘要

在2026年初的AI技术浪潮中,一款名为OpenClaw的开源AI智能体框架以惊人的速度席卷全球开发者社区。OpenClaw的核心突破在于将大语言模型的"智能大脑"与本地执行环境的"行动手脚"无缝结合,实现了从"被动对话"到"主动执行"的范式转变。本文将从技术架构、核心实现、应用场景三个维度深度解析OpenClaw系统,重点剖析其创新的"网关-节点-渠道"三层解耦架构、Skill-as-Code扩展机制、混合内存系统设计以及MCP协议集成。文章将详细展示OpenClaw如何通过本地优先的设计理念、基于车道的串行化执行保障任务可靠性,以及其面临的企业级安全挑战。通过完整的代码示例和架构图解,为开发者提供从原理到实践的全面指导。

目录

一、OpenClaw项目概述与技术定位

1.1 项目背景与爆发式增长

OpenClaw(曾用名ClawdBot、Moltbot)是2026年初AI领域最具颠覆性的开源项目之一,由奥地利开发者Peter Steinberger创建。项目经历了两次更名后,最终在2026年1月30日定名为OpenClaw。其GitHub仓库在短短三个月内获得了超过25.4万星标,拥有4.88万分支,全球活跃用户突破30万+,成为GitHub历史上增长最快的开源AI项目。

OpenClaw的爆发式增长背后反映了开发者对"能真正干活的AI"的迫切需求。在ChatGPT、Claude等对话AI已普及的背景下,传统AI工具仍停留在"只说不做"的阶段——能给出代码建议却不能自动部署,能分析问题却不能实际操作。OpenClaw正是瞄准了这一痛点,通过赋予AI本地执行权限,实现了"思考-行动-完成"的完整闭环。

核心数据指标

  • GitHub星标:254,000+
  • 贡献者:877人
  • 技能插件:3,000+
  • 支持平台:50+即时通讯工具
  • 日均下载量:15,000+

1.2 核心定位:从聊天AI到执行AI

OpenClaw与传统聊天AI的本质区别体现在四个维度:

  1. 执行范式差异
    • 传统AI:被动问答,输出文本建议
    • OpenClaw:主动执行,操作真实系统
  2. 部署模式差异
    • 传统AI:云端服务,数据上传第三方
    • OpenClaw:本地优先,数据完全自主
  3. 交互方式差异
    • 传统AI:单一聊天界面
    • OpenClaw:多渠道统一接入
  4. 能力边界差异
    • 传统AI:知识问答、文本生成
    • OpenClaw:系统操作、自动化流程

OpenClaw的设计理念可以概括为"大模型大脑+本地执行手脚",将大语言模型的认知能力与本地系统的操作权限结合,形成了独特的"数字员工"能力栈。这种设计让AI不再仅仅是辅助工具,而是能够独立完成任务的生产力单位。

1.3 技术演进路线:Clawdbot → Moltbot → OpenClaw

OpenClaw的技术演进体现了开源项目在市场适应与技术合规间的平衡:

阶段名称时间技术特点更名原因
第一阶段ClawdBot2025年11月基于Claude API的本地执行代理名称与Anthropic Claude商标冲突
第二阶段Moltbot2026年1月增加多模型支持,优化架构社区投票选择更具辨识度的名称
第三阶段OpenClaw2026年1月30日正式开源,建立完整生态确定最终品牌,强调开源属性

技术演进的关键里程碑:

  • v2025.11.0:初始版本发布,支持基础Shell命令执行
  • v2026.1.0:引入Gateway架构,实现多通道隔离
  • v2026.1.27:集成MCP协议,支持标准化工具调用
  • v2026.2.15:推出心跳机制,实现主动感知能力
  • v2026.3.0:完善安全模块,增强沙箱隔离

二、三层解耦架构深度解析

2.1 总体架构设计理念

OpenClaw采用了创新的"网关-节点-渠道"三层架构设计,实现了智能推理、任务编排与交互渠道的完全解耦。这种分层设计是OpenClaw工程优雅性的核心体现,也是其能够稳定运行复杂自动化任务的基础。

架构分层示意图

┌─────────────────────────────────────────────────────────────┐ │ Layer 3: LLM大模型层 │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ Claude │ │ GPT-4o │ │ DeepSeek │ │ 本地模型 │ │ │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ └─────────────────────────────────────────────────────────────┘ │ ┌─────────────────────────────────────────────────────────────┐ │ Layer 2: Gateway网关层 │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │会话管理器│ │消息路由器│ │记忆系统 │ │技能执行器│ │ │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ └─────────────────────────────────────────────────────────────┘ │ ┌─────────────────────────────────────────────────────────────┐ │ Layer 1: Channels渠道层 │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ WhatsApp │ │ Telegram │ │ Discord │ │ Slack │ │ │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ └─────────────────────────────────────────────────────────────┘ 

各层核心职责

  1. 渠道层(Layer 1):消息接入与标准化
    • 适配50+即时通讯平台
    • 统一消息格式转换
    • 多平台会话同步
  2. 网关层(Layer 2):流量控制与任务调度
    • 会话隔离与路由
    • 工具调用协调
    • 记忆系统管理
  3. 大模型层(Layer 3):智能推理与规划
    • 自然语言理解
    • 任务拆解与规划
    • 执行策略生成

这种分层设计的核心优势在于关注点分离接口标准化。每一层只负责特定功能,层与层之间通过标准接口交互,降低了系统复杂度,提升了可维护性和可扩展性。

2.2 Layer 1:渠道层(Channels)——全平台接入能力

渠道层是用户与OpenClaw交互的入口,负责将不同平台的异构消息格式转换为系统内部统一的事件结构。OpenClaw通过模块化的适配器设计,实现了"一次接入,多平台通用"的架构理念。

支持的平台类型

  1. 个人通讯工具
    • WhatsApp(通过Baileys协议)
    • Telegram(Bot API/grammY框架)
    • Signal(libsignal-service-java)
    • iMessage(BlueBubbles/MacOS原生)
  2. 企业协作平台
    • Slack(Bolt框架)
    • Microsoft Teams(Bot Framework)
    • Discord(Discord.js)
    • Google Chat(Google Workspace API)
  3. 开放协议平台
    • Matrix(matrix-js-sdk)
    • IRC(irc.js)
    • Nostr(nostr-tools)

渠道适配器核心实现

每个渠道适配器遵循相同的接口规范,以Telegram适配器为例:

// 适配器基础接口interfaceIChannelAdapter{ name:string; platform:string;// 启动连接connect():Promise<void>;// 接收消息onMessage(callback:(message: InternalMessage)=>void):void;// 发送消息sendMessage(message: InternalMessage):Promise<void>;// 断开连接disconnect():Promise<void>;}// Telegram适配器实现classTelegramAdapterimplementsIChannelAdapter{ name ='telegram'; platform ='Telegram';private bot: Telegraf;private sessionStore: Map<string, SessionState>;constructor(token:string){this.bot =newTelegraf(token);this.sessionStore =newMap();// 消息处理中间件this.bot.on('message',async(ctx)=>{const internalMsg =this.transformToInternal(ctx.message);// 触发消息回调if(this.messageCallback){awaitthis.messageCallback(internalMsg);}});}// 消息格式转换privatetransformToInternal(tgMessage:any): InternalMessage {return{ id: tgMessage.message_id.toString(), content: tgMessage.text || tgMessage.caption ||'', sender: tgMessage.from?.id.toString(), timestamp:newDate(tgMessage.date *1000), platform:'telegram', chatId: tgMessage.chat.id.toString(), raw: tgMessage };}asyncconnect():Promise<void>{awaitthis.bot.launch();console.log('Telegram bot connected');}asyncsendMessage(message: InternalMessage):Promise<void>{awaitthis.bot.telegram.sendMessage( message.chatId, message.content,{ parse_mode:'Markdown'});}asyncdisconnect():Promise<void>{awaitthis.bot.stop();}}

渠道层关键技术

  1. 消息标准化
    • 所有外部消息统一转换为InternalMessage格式
    • 保留原始消息引用,支持平台特定功能
  2. 会话管理
    • 每个聊天会话独立标识
    • 跨平台会话映射(如在Telegram开始,在WhatsApp继续)
  3. 异步处理
    • 非阻塞消息接收与发送
    • 支持流式响应,实时反馈执行进度

渠道层的设计体现了OpenClaw"本地优先但连接广泛"的哲学。虽然系统核心运行在本地,但通过标准化的适配器接口,能够无缝接入各类外部平台,为用户提供熟悉的交互环境。

2.3 Layer 2:网关层(Gateway)——神经中枢与控制平面

网关层是OpenClaw架构的核心,承担着消息路由、会话管理、工具调用协调等关键职责。网关以守护进程形式运行,默认监听127.0.0.1:18789端口,基于WebSocket协议提供实时通信能力。

网关核心组件架构

┌─────────────────────────────────────────────────────────────┐ │ Gateway 网关层 │ ├─────────────────┬─────────────────┬─────────────────────────┤ │ 通道适配器管理器 │ 会话路由器 │ 执行调度器 │ ├─────────────────┼─────────────────┼─────────────────────────┤ │ • 平台适配器注册 │ • 会话创建/路由 │ • 工具调用协调 │ │ • 消息格式统一 │ • 上下文隔离 │ • 执行环境管理 │ │ • 连接状态监控 │ • 资源分配 │ • 结果收集/转发 │ └─────────────────┴─────────────────┴─────────────────────────┘ │ ┌─────────────────────────────────────────────────────────────┐ │ 混合内存系统 │ ├─────────────┬─────────────┬─────────────┬───────────────────┤ │ JSONL日志 │ MEMORY.md │ 向量索引 │ 文件缓存 │ ├─────────────┼─────────────┼─────────────┼───────────────────┤ │ • 全量记录 │ • 核心知识 │ • 语义检索 │ • 二进制数据 │ │ • 执行跟踪 │ • 规则库 │ • 长期记忆 │ • 临时存储 │ └─────────────┴─────────────┴─────────────┴───────────────────┘ 

核心组件功能详解

  1. 通道适配器管理器
    • 负责所有渠道适配器的注册与生命周期管理
    • 监控连接状态,自动重连异常断开的渠道
    • 实现消息的并行接收与序列化处理
  2. 会话路由器
    • 为每个任务创建独立的会话上下文
    • 实现多用户、多任务的并发隔离
    • 支持会话的持久化与状态恢复
  3. 执行调度器
    • 协调工具调用与执行环境
    • 管理子代理的创建与销毁
    • 实现任务的串行化执行保障

网关启动流程源码分析

// Gateway启动入口:src/gateway/server.impl.tsexportasyncfunctionstartGatewayServer(options: GatewayOptions):Promise<GatewayServer>{// 1. 初始化核心组件const channelManager =newChannelManager();const sessionRouter =newSessionRouter();const executionScheduler =newExecutionScheduler();const memorySystem =newHybridMemorySystem();// 2. 配置渠道适配器const adapters =awaitloadChannelAdapters(options.channels);await channelManager.registerAdapters(adapters);// 3. 启动WebSocket服务器const wss =newWebSocketServer({ port: options.port ||18789});// 4. 设置消息处理管道 wss.on('connection',async(ws: WebSocket, request: Request)=>{// 消息接收管道 ws.on('message',async(message:string)=>{// 消息解码与验证const decoded =decodeMessage(message);if(!validateMessage(decoded)){return ws.send(JSON.stringify({ error:'Invalid message format'}));}// 会话路由const session =await sessionRouter.route(decoded);// 上下文构建const context =await memorySystem.retrieve(session);// 执行调度const result =await executionScheduler.schedule( session, decoded, context );// 结果返回 ws.send(JSON.stringify(result));});});// 5. 启动守护进程if(options.daemon){awaitstartAsDaemon();}console.log(`Gateway started on port ${options.port ||18789}`);return{ wss, channelManager, sessionRouter, executionScheduler, memorySystem };}

网关关键技术突破

  1. 上下文窗口防护:为了解决长周期任务中上下文溢出导致的任务失败问题,OpenClaw引入了Context Window Guard机制。该机制通过智能的Token管理策略,优先保留核心系统指令和任务要求,对非核心历史内容进行摘要压缩,实现了可控的降级而非直接截断。上下文管理算法可以表示为:RetainedContext = arg ⁡ max ⁡ C ⊆ FullContext [ α ⋅ Importance ( C ) + β ⋅ Recency ( C ) ] \text{RetainedContext} = \underset{C \subseteq \text{FullContext}}{\arg\max} \left[ \alpha \cdot \text{Importance}(C) + \beta \cdot \text{Recency}(C) \right] RetainedContext=C⊆FullContextargmax​[α⋅Importance(C)+β⋅Recency(C)]约束条件:
    TokenCount ( C ) ≤ W max \text{TokenCount}(C) \leq W_{\text{max}} TokenCount(C)≤Wmax​其中:
    • W max W_{\text{max}} Wmax​ 是模型的最大上下文窗口大小
    • Importance ( C ) \text{Importance}(C) Importance(C) 衡量上下文片段 C C C的重要性
    • Recency ( C ) \text{Recency}(C) Recency(C) 衡量上下文片段 C C C的时效性
    • α , β \alpha, \beta α,β 是权重参数
    • JSONL日志层:存储原始全量历史记录,支持完整审计追溯
    • 结构化知识层:存储核心规则和用户偏好,作为系统提示词输入
    • 向量检索层:实现语义搜索和长期记忆精准激活

混合内存系统:OpenClaw的混合内存系统采用三级存储架构:内存系统的检索过程可以形式化为:

classHybridMemorySystem{asyncretrieve(session: Session):Promise<Context>{// 1. 基础会话状态const baseContext =awaitthis.sessionStore.get(session.id);// 2. 相关长期记忆const relatedMemories =awaitthis.vectorStore.search( session.currentTask,{ limit:5});// 3. 系统核心规则const systemRules =awaitthis.loadSystemRules();// 4. 上下文压缩与整合returnthis.compressAndCombine( baseContext, relatedMemories, systemRules );}}

基于车道的串行化执行:OpenClaw采用独特的Lane Queue设计,为每个会话分配独立的执行车道。同一车道内的任务严格按顺序串行执行,从根源上消除了并发场景下的竞态条件和共享状态bug。这种设计虽然牺牲了一点并发性能,但极大提升了任务执行的可靠性和可复现性。

// 车道队列实现核心逻辑classLaneQueue{private lanes: Map<string, AsyncQueue>;// 为每个会话创建独立队列createLane(sessionId:string):void{const queue =newAsyncQueue();this.lanes.set(sessionId, queue);}// 任务入队(保证同一会话内串行执行)asyncenqueue(sessionId:string, task: Task):Promise<TaskResult>{const queue =this.lanes.get(sessionId);if(!queue){thrownewError(`No lane found for session ${sessionId}`);}// 排队等待执行return queue.enqueue(async()=>{returnawaitexecuteTask(task);});}}

网关安全设计

  1. 网络隔离
    • 默认绑定127.0.0.1,仅限本地访问
    • 支持TLS 1.3加密传输
    • 可配置防火墙规则限制出站连接
  2. 权限管控
    • 最小权限原则,默认禁止高风险操作
    • 显式授权机制,用户需主动批准敏感操作
    • 环境变量注入API密钥,避免明文存储
  3. 沙箱隔离
    • 默认Docker容器执行环境
    • 限制文件系统访问范围
    • 进程级网络隔离

网关层的设计体现了OpenClaw在工程可靠性方面的深度思考。通过严格的分层隔离、串行化执行保证、智能上下文管理,OpenClaw为AI代理的稳定运行提供了坚实的技术基础。

2.4 Layer 3:大模型层(LLM)——智能大脑与推理引擎

大模型层是OpenClaw的智能核心,负责自然语言理解、任务规划、决策生成等高级认知功能。OpenClaw采用模型无关的设计理念,支持多种主流大模型的集成与切换。

支持的模型类型

  1. 云端模型
    • OpenAI系列:GPT-4o、GPT-5-mini
    • Anthropic Claude系列:Claude 3.5 Sonnet、Claude 3 Opus
    • Google Gemini系列:Gemini 2.0 Pro、Gemini Flash
    • 国产模型:通义千问、智谱GLM、月之暗面Kimi
  2. 本地模型
    • Ollama支持的模型:Llama 3、Mistral、Qwen
    • vLLM优化的推理框架
    • Transformers库直接加载的模型

模型解析器设计与实现

模型解析器(Model Resolver)是大模型层的核心组件,负责根据任务特性选择最合适的模型,并管理模型调用过程。

// 模型解析器核心实现classModelResolver{private models: Map<string, LLMProvider>;private routingStrategies: RoutingStrategy[];constructor(){this.models =newMap();this.routingStrategies =[newCostOptimizedRouting(),newPerformanceOptimizedRouting(),newHybridRouting()];}// 模型注册registerModel(name:string, provider: LLMProvider):void{this.models.set(name, provider);console.log(`Model registered: ${name}`);}// 智能路由选择asyncresolve(request: ModelRequest):Promise<ModelResponse>{// 1. 任务特性分析const taskProfile =this.analyzeTask(request);// 2. 模型能力匹配const candidates =this.matchModels(taskProfile);// 3. 动态分级推理if(taskProfile.complexity <= ComplexityThreshold.LOW){// 低成本模型处理简单任务returnawaitthis.useLowCostModel(candidates, request);}else{// 高能力模型处理复杂任务returnawaitthis.useHighCapabilityModel(candidates, request);}}// 任务特性分析算法privateanalyzeTask(request: ModelRequest): TaskProfile {return{ complexity:this.estimateComplexity(request), domain:this.identifyDomain(request), urgency:this.evaluateUrgency(request), costSensitivity:this.calculateCostSensitivity(request)};}// 模型匹配算法privatematchModels(profile: TaskProfile): LLMProvider[]{returnArray.from(this.models.values()).filter(model =>{// 能力匹配度计算const capabilityScore =this.calculateCapabilityMatch(model, profile);const costScore =this.calculateCostMatch(model, profile);return capabilityScore >= ModelThreshold.CAPABILITY&& costScore <= ModelThreshold.COST;}).sort((a, b)=>{// 综合评分排序const scoreA =this.comprehensiveScore(a, profile);const scoreB =this.comprehensiveScore(b, profile);return scoreB - scoreA;});}}

模型路由策略的数学形式化

OpenClaw的模型路由可以看作一个优化问题,目标是在满足任务需求的前提下最小化总成本:

min ⁡ m ∈ M [ C m ( t ) + λ ⋅ D m ( t ) ] \min_{m \in \mathcal{M}} \left[ C_m(t) + \lambda \cdot D_m(t) \right] m∈Mmin​[Cm​(t)+λ⋅Dm​(t)]

约束条件:
Capability m ≥ Requirement ( t ) Latency m ≤ Deadline ( t ) Availability m ≥ Availability min \begin{align} & \text{Capability}_m \geq \text{Requirement}(t) \\ & \text{Latency}_m \leq \text{Deadline}(t) \\ & \text{Availability}_m \geq \text{Availability}_{\text{min}} \end{align} ​Capabilitym​≥Requirement(t)Latencym​≤Deadline(t)Availabilitym​≥Availabilitymin​​​

其中:

  • M \mathcal{M} M 是可用的模型集合
  • t t t 是当前任务
  • C m ( t ) C_m(t) Cm​(t) 是模型 m m m处理任务 t t t的成本
  • D m ( t ) D_m(t) Dm​(t) 是模型 m m m处理任务 t t t的延迟
  • λ \lambda λ 是延迟的成本权重系数
  • Capability m \text{Capability}_m Capabilitym​ 是模型 m m m的能力水平
  • Requirement ( t ) \text{Requirement}(t) Requirement(t) 是任务 t t t的能力需求

多模型协同推理架构

对于复杂任务,OpenClaw支持多模型协同工作模式:

┌─────────────────────────────────────────────────────────────┐ │ 多模型协同推理引擎 │ ├─────────────────────────────────────────────────────────────┤ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ │ 任务分解器 │ → │ 模型分配器 │ → │ 结果整合器 │ │ │ └──────────────┘ └──────────────┘ └──────────────┘ │ ├─────────────────────────────────────────────────────────────┤ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ │ 文本理解模型 │ │ 代码生成模型 │ │ 逻辑推理模型 │ │ │ └──────────────┘ └──────────────┘ └──────────────┘ │ └─────────────────────────────────────────────────────────────┘ 

协同工作流程:

  1. 任务分解:将复杂任务拆解为多个子任务
  2. 模型分配:为每个子任务选择最合适的模型
  3. 并行推理:各模型独立处理分配的子任务
  4. 结果整合:整合各子任务结果,生成最终响应

本地模型优化技术

OpenClaw对本地模型部署进行了深度优化:

  1. 量化压缩
    • 支持INT4/INT8量化,降低内存占用
    • 动态精度调整,平衡性能与精度
  2. 推理加速
    • 集成vLLM PagedAttention优化
    • 支持FlashAttention-2高效注意力计算
    • 多GPU并行推理支持
  3. 缓存优化
    • KV-Cache智能管理,减少重复计算
    • 增量生成优化,提升流式响应速度

模型层关键技术指标

指标描述典型值
推理延迟从输入到首次令牌输出的时间50-500ms
吞吐量每秒处理的Token数100-1000 tokens/s
成本效率每百万Token的成本$0.10-$10.0
上下文长度支持的上下文窗口大小128K-1M tokens
模型切换时间不同模型间切换的时间开销<100ms

大模型层的设计体现了OpenClaw在AI能力集成方面的灵活性。通过标准化的模型接口、智能的路由策略、高效的本地部署优化,OpenClaw能够在不同场景下选择最合适的智能引擎,为用户提供稳定可靠的AI服务。

Read more

Flutter 组件 spry 适配鸿蒙 HarmonyOS 实战:轻量化 Web 框架,构建高性能端侧微服务与 Middleware 治理架构

Flutter 组件 spry 适配鸿蒙 HarmonyOS 实战:轻量化 Web 框架,构建高性能端侧微服务与 Middleware 治理架构

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 spry 适配鸿蒙 HarmonyOS 实战:轻量化 Web 框架,构建高性能端侧微服务与 Middleware 治理架构 前言 在鸿蒙(OpenHarmony)生态迈向全场景分布式协同、涉及设备端侧 API 暴露、轻量化资源服务镜像及严苛的跨端 RPC 通信背景下,如何实现一套既能保持极低内存足迹(Footprint)、又能提供类似后端(Node.js/Koa)般丝滑开发体验且具备全异步处理能力的“端侧 Web 基座”,已成为决定应用分布式自治能力与全栈同构效率的关键。在鸿蒙设备这类强调 AOT 极致效能与背景任务严格限制的环境下,如果应用依然采用重量级的 HTTP 服务端,由于由于进程级的上下文切换开销,极易由于由于“算力溢出”导致鸿蒙应用在作为服务端响应时发生明显的电量损耗。 我们需要一种能够解耦路由逻辑、支持

By Ne0inhk

10、Vue3中Vuex从入门到实战:手写迷你Vuex,掌握前端状态管理核心

Vue3中Vuex从入门到实战:手写迷你Vuex,掌握前端状态管理核心 在Vue3项目开发中,组件化让代码复用和维护更高效,但跨组件、跨页面的数据共享却成了高频痛点——用户登录信息、全局权限、公共计数器等数据,如果靠组件传参层层传递,代码会变得混乱不堪。这时候,Vuex就成了前端状态管理的“大管家”,帮我们集中式管理共享数据。本文将从前端数据管理的痛点出发,带你吃透Vuex的核心用法,甚至手写一个迷你Vuex理解其底层原理。 一、前端数据管理:为什么需要Vuex? 现代Web应用由组件、数据、路由三大核心构成,组件内部的私有数据用ref/reactive管理即可,但共享数据的管理却需要更规范的方式。 我们先试想一个简单场景:用全局变量存储共享数据。 window._store ={}// 全局存储数据 这种方式看似简单,但存在致命问题:window._store不是响应式的,修改数据后Vue组件无法自动更新视图。如果我们用Vue的响应式API包裹全局数据,并提供统一的修改方法,这就是Vuex的雏形——本质是“响应式的全局数据 + 规范化的修改规则”。 二、Vuex是什

By Ne0inhk
【递归,搜索与回溯算法 & 记忆化搜索】深入理解记忆化搜索算法:记忆化搜索算法小专题

【递归,搜索与回溯算法 & 记忆化搜索】深入理解记忆化搜索算法:记忆化搜索算法小专题

前言:实现记忆化搜索的一般步骤      (1) 实现记忆化搜索代码步骤         (2) 如何将暴搜代码转换成记忆化搜索代码?         (3)如何添加一个备忘录?         斐波那契数     题目解析         算法原理         解法一:递归        时间复杂度高是因为递归展开树有很多次重复计算,我们可以优化这些重复的计算;我们可以创建一个备忘录,当计算其中一个分支时,把计算出的 d(i) 放入一个"备忘录"中 ( i = 1 ....... n ),当递归其他分支时,我们通过备忘录存储好的计算结果,减少递归树额外重复的展开;     解法二:记忆化搜索    当我们在递归的时候,发现递归过程会重复进行完全相同的问题,我们就把这些完全相同的问题存储到额外创建的"备忘录"中,再后续递归出现相同问题,直接从备忘录中拿计算好的结果即可,避免不必要的重复递归;  所以记忆化搜索,就是一个带备忘录的递归;记忆化搜索,其实也是剪枝的一种方式,在本题使用记忆化搜索,就能把指数级别的时间复杂度降到常数

By Ne0inhk
【踩坑记录】使用 Layui 框架时解决 Unity WebGL 渲染在 Tab 切换时黑屏问题

【踩坑记录】使用 Layui 框架时解决 Unity WebGL 渲染在 Tab 切换时黑屏问题

【踩坑记录】使用 Layui 框架时解决 Unity WebGL 渲染在 Tab 切换时黑屏问题 在开发 Web 应用时,尤其是集成了 Unity WebGL 内容的页面,遇到一个问题:当 Unity WebGL 渲染内容嵌入到一个 Tab 中时,切换 Tab 后画面会变黑,直到用户点击黑屏区域,才会恢复显示。 这个问题通常是因为 Unity 渲染在 Tab 切换时被暂停或未能获得焦点所致。 在本文中,我们将介绍如何在使用 Layui 框架时,通过监听 Tab 切换事件并强制 Unity WebGL 渲染恢复,来解决这一问题。 1. 问题描述 当 Unity WebGL 内容嵌入到页面中的多个

By Ne0inhk