揭秘Lua中有限状态机实现技巧:如何打造流畅游戏AI行为逻辑

第一章:Lua游戏AI开发

Lua 作为一种轻量级脚本语言,因其高效的执行性能和出色的嵌入能力,被广泛应用于游戏开发中,尤其是在 AI 行为逻辑的实现上表现出色。其简洁的语法结构使得开发者能够快速构建灵活的 AI 决策系统。

为何选择 Lua 实现游戏 AI

  • Lua 易于嵌入 C/C++ 游戏引擎,如 Unity(通过插件)或 CryEngine
  • 动态类型系统便于快速迭代 AI 状态机与行为树逻辑
  • 内存占用低,适合运行在资源受限的游戏客户端

基础 AI 行为示例:敌人巡逻与追击

以下代码展示了一个简单的 AI 控制逻辑,包含巡逻和玩家发现后的追击行为:
-- 定义 AI 状态
local state = "patrol"
local player_in_range = false

-- 每帧更新函数
function update_ai(player_distance, speed)
    if player_distance < 10 then
        player_in_range = true
    else
        player_in_range = false
    end

    if player_in_range then
        print("追击玩家")
        move_towards_player(speed * 2)
        state = "chase"
    else
        print("继续巡逻")
        move_to_next_waypoint(speed)
        state = "patrol"
    end
end

function move_towards_player(speed)
    -- 实现朝向玩家移动的逻辑
end

function move_to_next_waypoint(speed)
    -- 移动到下一个路径点
end

AI 状态管理建议

状态类型触发条件推荐处理方式
巡逻无目标感知使用路径点循环移动
警戒听到声音或短暂目视暂停并转向声源方向
追击锁定玩家位置启用追逐算法(如 A* 寻路)
graph TD A[开始] --> B{发现玩家?} B -- 是 --> C[切换至追击状态] B -- 否 --> D[继续巡逻] C --> E[更新玩家位置] D --> F[移动到下一路径点]

第二章:有限状态机核心原理与Lua实现基础

2.1 状态机基本概念与游戏AI中的应用价值

状态机(Finite State Machine, FSM)是一种抽象模型,用于描述对象在不同状态之间的转换逻辑。在游戏AI中,FSM被广泛应用于控制NPC的行为决策,如巡逻、追击、攻击和逃跑等。
核心组成要素
  • 状态(State):代表角色当前的行为模式,例如“巡逻”或“警戒”。
  • 转移条件(Transition):触发状态切换的逻辑判断,如玩家进入视野范围。
  • 动作(Action):状态激活时执行的具体行为。
代码示例:简单AI状态机

public enum AIState { Patrol, Chase, Attack }
public class NPCController {
    private AIState currentState;

    public void Update() {
        switch (currentState) {
            case AIState.Patrol:
                if (PlayerInSight()) currentState = AIState.Chase;
                break;
            case AIState.Chase:
                if (InRange()) currentState = AIState.Attack;
                break;
        }
    }
}
该C#片段展示了一个基于枚举的状态切换机制。通过Update()方法每帧检测环境条件,决定是否转移状态。结构清晰,易于扩展基础行为逻辑。

2.2 使用Lua表结构构建状态机框架

在Lua中,利用表(table)和函数闭包可以轻量级实现状态机。通过将状态与转移规则定义为表结构,可提升逻辑的可维护性。
状态机核心设计
状态机由当前状态、状态表和事件触发器组成。每个状态可绑定进入、执行和退出行为。
local fsm = {
  state = "idle",
  states = {
    idle = { on_event = function() return "running" end },
    running = { on_event = function() return "paused" end },
    paused = { on_event = function() return "running" end }
  },
  trigger = function(self)
    local next = self.states[self.state].on_event()
    print("Transitioning from " .. self.state .. " to " .. next)
    self.state = next
  end
}
上述代码中,fsm.states 定义了各状态及转移逻辑,trigger 方法驱动状态变更,实现清晰的流程控制。
优势分析
  • 结构清晰:状态与行为集中管理
  • 扩展性强:新增状态仅需修改表定义
  • 运行高效:无额外依赖,适合嵌入式环境

2.3 状态切换机制的设计与事件驱动模型

在复杂系统中,状态切换机制是保障行为一致性的核心。通过事件驱动模型,系统可在不同状态间安全过渡,避免竞态与不一致。
事件触发状态变迁
每个状态变更由特定事件触发,如用户操作或外部信号。系统监听事件流,匹配对应处理器完成状态迁移。
// 定义状态切换事件
type Event struct {
    Type string // 事件类型:START, STOP等
    Data map[string]interface{}
}

// 状态机处理事件
func (sm *StateMachine) Handle(event Event) {
    nextState := sm.Transitions[sm.CurrentState][event.Type]
    if nextState != nil {
        sm.CurrentState = nextState
    }
}
上述代码展示了基于事件的状态转移逻辑。Transitions 是二维映射,键为当前状态和事件类型,值为目标状态。Handle 方法确保仅在合法路径下更新状态。
状态迁移规则表
使用表格明确各状态在事件作用下的合法转移路径:
当前状态事件目标状态
IdleStartRunning
RunningPausePaused
PausedResumeRunning

2.4 实现轻量级状态管理器的代码实践

在前端应用中,轻量级状态管理器能有效解耦组件间的依赖。我们采用观察者模式构建一个极简的状态管理核心。
核心类设计
class Store {
  constructor(state) {
    this.state = state;
    this.listeners = [];
  }

  setState(newState) {
    this.state = { ...this.state, ...newState };
    this.listeners.forEach(fn => fn());
  }

  subscribe(fn) {
    this.listeners.push(fn);
    return () => {
      this.listeners = this.listeners.filter(f => f !== fn);
    };
  }
}
该实现通过 setState 触发状态更新,并通知所有订阅者;subscribe 支持动态添加和移除监听函数。
使用场景示例
  • 跨组件共享用户登录状态
  • 全局主题切换控制
  • 表单数据同步管理

2.5 性能考量与状态机优化策略

在高并发系统中,状态机的性能直接影响整体响应效率。频繁的状态切换和冗余判断会带来显著开销,因此需从数据结构与执行路径两方面进行优化。
减少状态转换开销
采用查表法替代条件分支可显著提升状态跳转效率。通过预定义状态转移表,将判断逻辑转化为常量时间的哈希查找。

var transitionTable = map[State]map[Event]State{
    Idle:   {Start: Running},
    Running: {Pause: Paused, Stop: Stopped},
    Paused: {Resume: Running},
}
上述代码构建了一个二维映射表,状态迁移复杂度由 O(n) 降至 O(1),适用于固定状态拓扑。
惰性评估与批量处理
  • 延迟触发非关键状态更新,减少中间态开销
  • 合并连续事件,避免高频震荡
  • 使用位掩码压缩状态字段,降低内存占用

第三章:游戏AI行为逻辑设计实战

3.1 定义典型AI行为状态(如巡逻、追击、攻击)

在游戏AI设计中,行为状态的明确定义是实现智能决策的基础。常见的状态包括巡逻、追击和攻击,每种状态对应特定的行为逻辑与转换条件。
状态分类与特征
  • 巡逻:AI在指定区域内周期性移动,维持警戒状态
  • 追击:检测到玩家进入视野范围后,向目标位置移动
  • 攻击:进入攻击距离后执行伤害输出动作
状态机实现示例

enum AIState { Patrol, Chase, Attack }
AIState currentState = AIState.Patrol;

void Update() {
    switch (currentState) {
        case AIState.Patrol:
            if (PlayerInSight()) currentState = AIState.Chase;
            break;
        case AIState.Chase:
            if (InAttackRange()) currentState = AIState.Attack;
            break;
    }
}
上述代码使用枚举定义三种状态,并通过条件判断实现状态转移。PlayerInSight() 和 InAttackRange() 为感知检测函数,控制状态跃迁的时机与路径。

3.2 基于条件触发的状态转移规则实现

在复杂系统中,状态机的转移往往依赖于特定运行时条件。通过定义清晰的条件表达式,可实现精准的状态跃迁控制。
条件评估机制
每个状态转移边绑定一个布尔表达式,仅当表达式为真时转移生效。该机制提升了系统的响应性与灵活性。
// 定义状态转移规则
type TransitionRule struct {
    FromState string
    ToState   string
    Condition func(context map[string]interface{}) bool
}

// 示例:仅当用户权限足够时允许状态变更
rule := TransitionRule{
    FromState: "pending",
    ToState: "approved",
    Condition: func(ctx map[string]interface{}) bool {
        if role, ok := ctx["role"].(string); ok {
            return role == "admin"
        }
        return false
    },
}
上述代码中,Condition 函数接收上下文参数并返回布尔值,决定是否满足转移条件。通过将逻辑封装在闭包中,实现了高度可定制的判断策略。
规则注册与匹配流程
系统启动时预加载所有规则,并在状态变更请求到达时进行匹配验证。
  • 遍历所有从当前状态出发的转移规则
  • 逐个执行条件函数
  • 首个满足条件的规则触发状态转移

3.3 将状态机集成到游戏角色更新循环中

在游戏主循环中,角色行为的切换必须精准且高效。将状态机与更新循环结合,能有效管理角色在不同行为间的转换。
状态更新钩子
每个帧周期调用状态机的更新方法,确保当前状态逻辑被正确执行:

void Character::Update(float deltaTime) {
    stateMachine.Update(deltaTime); // 触发当前状态的OnUpdate
}
该代码在每帧调用状态机的 Update 方法,由状态机委派给当前状态对象的 OnUpdate 函数,实现如行走、跳跃等行为的持续逻辑处理。
状态转换检查
状态机应在更新前评估是否需要转移:
  • 检查输入事件(如按键)
  • 验证条件(如生命值归零)
  • 触发状态切换(如从“奔跑”转入“攻击”)
这种机制确保角色响应及时,行为流畅自然。

第四章:高级技巧与扩展应用

4.1 分层状态机(HFSM)在复杂AI中的运用

分层状态机(HFSM)通过将状态组织为层次结构,有效管理复杂AI的行为逻辑。相较于传统有限状态机,HFSM支持状态嵌套,允许子状态继承和重写父状态行为,显著提升可维护性与扩展性。
状态继承与复用机制
在HFSM中,高层状态可定义通用行为,低层状态进行特化。例如,角色处于“战斗”父状态时,其子状态“进攻”“防御”可复用公共感知逻辑。

type State interface {
    Enter()
    Execute(*AIContext)
    Exit()
}

type CompositeState struct {
    currentState State
    parent       State
}
上述代码定义了复合状态结构,CompositeState 包含当前激活的子状态与父状态引用,实现行为委托与上下文共享。
层级切换的性能优势
  • 减少状态冗余:共用逻辑集中在上层状态
  • 提高响应速度:事件可被多层状态同时捕获
  • 增强调试能力:状态路径清晰可追溯

4.2 结合行为树思想增强决策灵活性

在复杂系统中,传统的条件判断逻辑难以应对多变的运行时环境。引入行为树(Behavior Tree)的思想,可显著提升决策系统的模块化与可维护性。
行为树核心结构
行为树由节点构成,主要包括控制节点(如序列、选择)和执行节点(如动作、条件)。每个节点返回成功、失败或运行中状态,驱动树的遍历路径。
  • 序列节点:依次执行子节点,任一失败则中断
  • 选择节点:优先执行高优先级子节点,任一成功即通过
  • 装饰节点:修改单个子节点的行为,如重试或取反
代码实现示例
type Node interface {
    Evaluate() Status
}

type Sequence struct {
    Children []Node
}

func (s *Sequence) Evaluate() Status {
    for _, child := range s.Children {
        if child.Evaluate() != Success {
            return Failure // 只要一个失败,整体失败
        }
    }
    return Success
}
上述 Go 示例实现了一个简单的序列节点。其逻辑按顺序评估子节点,任意子节点返回非成功状态时立即终止并返回失败,确保执行流程的可控性和清晰性。

4.3 状态机与数据驱动设计的结合方式

在复杂系统中,状态机负责管理行为流转,而数据驱动设计则关注状态变更所引发的数据响应。两者的融合可显著提升系统的可维护性与响应能力。
事件触发的状态迁移
当外部输入触发事件时,状态机根据当前状态和输入决定下一状态,同时发布数据变更通知:
const stateMachine = {
  state: 'idle',
  transitions: {
    idle: { start: 'loading' },
    loading: { success: 'success', fail: 'error' }
  },
  dispatch(event) {
    const next = this.transitions[this.state][event];
    if (next) {
      this.state = next;
      // 数据驱动:状态变更后触发数据更新
      this.updateView();
    }
  },
  updateView() {
    console.log(`View updated for state: ${this.state}`);
  }
};
上述代码中,dispatch 方法处理事件并迁移状态,随后调用 updateView 实现视图或数据层的同步更新,体现了控制流与数据流的协同。
数据变更反向影响状态
数据变化也可作为状态迁移的输入。例如通过观察数据模型变化来触发状态转移,形成闭环反馈机制。

4.4 调试工具与可视化状态监控方法

在分布式系统调试中,高效的工具链与实时状态可视化至关重要。传统日志排查方式难以应对跨节点复杂调用链,因此引入专业调试工具成为必要选择。
常用调试工具集成
Go语言生态中,delve 是主流的调试器,支持远程断点调试和变量检查:
// 启动调试服务
dlv exec ./app --headless --listen=:2345 --api-version=2
该命令启动应用并暴露调试接口,开发人员可通过 IDE 远程连接,实现断点控制与运行时状态分析。
状态可视化监控方案
Prometheus 与 Grafana 组合提供强大的指标采集与展示能力。通过在应用中暴露 metrics 接口:
http.Handle("/metrics", promhttp.Handler())
Prometheus 定期抓取节点状态数据,Grafana 可配置仪表盘实时展示 CPU、内存、请求延迟等关键指标。
  • 分布式追踪:Jaeger 支持调用链路追踪
  • 日志聚合:ELK 架构统一收集结构化日志
  • 告警机制:基于阈值触发 Alertmanager 通知

第五章:总结与展望

微服务架构的演进趋势
现代企业级应用正加速向云原生转型,微服务架构已成为主流。例如,某金融平台通过引入 Kubernetes 和 Istio 实现服务网格化,将交易系统的响应延迟降低了 40%。其核心在于将单体应用拆分为独立部署的服务模块,并通过 API 网关统一管理流量。
  • 服务发现与负载均衡自动化
  • 配置中心集中化管理(如使用 Consul)
  • 链路追踪集成(Jaeger 或 Zipkin)
可观测性的实践落地
在生产环境中,仅依赖日志已无法满足故障排查需求。某电商平台采用 ELK + Prometheus + Grafana 组合方案,实现了全栈监控。以下为 Prometheus 抓取指标的典型配置片段:

scrape_configs:
  - job_name: 'go-micro-service'
    static_configs:
      - targets: ['192.168.1.10:8080']
    metrics_path: '/metrics'
    scheme: http
未来技术融合方向
技术领域当前挑战解决方案趋势
边缘计算低延迟数据处理轻量级服务运行时(如 K3s)
AI 工程化模型服务部署复杂集成 KServe 实现推理服务标准化
[客户端] → (API 网关) → [认证服务] ↘ [订单服务] → [数据库] ↘ [推荐引擎] → [Redis 缓存]
Lua 实现状态机 --[[ 状态机 602809934@qq.com Sample: local MaxFPSTimer = 0.016 local STATE_IDLE = 0 local STATE_WALK = 1 local STATE_RUN = 2 local STATE_IN_COMBAT = 3 local STATE_DYING = 20 ... ... 阅读详情

相关推荐

lua面向对象与基于lua的状态机实现

之前一篇文章只是简单的介绍lua的面向对象, 对这方面的理解还很浅,最近在游戏中实现了一个状态机, 这里简单介绍; 思路介绍 状态有很多,需要有扩展性, 所以这里的状态有独立的类结构, 同时状态机作为一个功能要让每个角色对象身上都拥有自己的状态机, 因此也是一个类; 状态机里包含以唯一名字标记对应的状态, 由于状态对于一个游戏角色的行为来说, 可以看作是底层实现, 所以一些公共状态可以

bbhe_work的博客 2568

【游戏业务逻辑】Lua 状态机与行为树

状态机将会按照"state1" -> “state2” -> “state3” -> "state1"的顺序无限循环,因为每个状态的处理函数最后都调用了end_running来过渡到下一个状态,并且没有明确的终止条件。如上,随机了两个初始行为树节点的id,代表两个行为树链条,只需要在行为树路径表里配置好两个行为树链条即可。

Leoh的博客 1295

Lua虚拟机分析之一

1  核心的数据结构 2

梦里听蝉 4519

lua实现的状态机

状态机就是管理在不同状态下的操作实现,这里我简单的提一下,大家看代码就懂了。最近学完了lua打算做点游戏,所有先用lua弄清楚一些常用的状态控制。 ------创建状态机制类型三种状态学习,编码,休息 local state = {study="study",code="code",relax="relax"} bobo={nowstate=state.study} ---默认的是学习状态

code change the world 7699

Lua有限状态机

目前主要面向Unity3d的lua

lua-states-mixin:为 Lua 对象添加状态机功能

lua-states-mixin 为 Lua 对象添加状态机功能 该模块可以为您的任何对象添加状态机功能。 它既可以用作 mixin 类,也可以通过“猴子修补”您的对象来使用。 它旨在与,并且也已作为 mixin 集成到中。 特征 状态方法 getState()、setState()、gotoState() getPreviousState(), gotoPreviousState() pushStateStack(), popStateStack() 重置状态(),设置调试() 例子 混合类 此模块可用作混合项目包含ObjectBase子类,该子类展示了如何将此模块用作具有多重继承的混合。 简而言之: -- import the events mixin module (adjust path for your project) local StatesMixModule

Lua源码分析 - 基础篇 - 全局状态机的实现(02)

从main函数看整个状态机的初始化 Lua的main函数方法中,lua_State *L = luaL_newstate(); ,主要用于创建全局状态机。 luaL_newstate主要用来为每一个LUA线程创建独立的函数栈和线程栈,以及线程执行过程中需要用到的内存管理、字符串管理、gc等信息。 lstate.c文件中,对全局状态机的初始化、销毁进行了实现。 int main (int ...

自娱自乐的代码人 1万+

产业园区如何高效对接企业技术需求与高校科研成果?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

lua状态机

昨天在深圳和同事聚了聚 聊了聊前公司也是百感交集 也许确实是位置不一样所以看东西的角度和在乎的东西不一样吧 也许有一天自己也能站在这个高度会有不一样的体会   废话不多说 其实状态机用C#比较好写 lua主要是实现继承太蛋疼了 不过很多游戏都要求热更 总有要求全部用lua实现的例子 我也是去github上参考了下源码 确实对已经有工作经验的人来说 直接去看源码是成长最快的方式  以前是太执...

qq_34863873的博客 2294

YOLOv5 改进点总览:轻量化、高精度的背后有哪些魔改?

YOLOv5是由Ultralytics团队开发的高效目标检测模型,其核心改进包括:主干网络采用CSPDarknet53提升梯度传播效率;特征融合使用PANet增强小目标识别;输出结构采用解耦头设计优化定位和分类任务。此外,YOLOv5通过CIoU损失函数、Mosaic数据增强和SimOTA标签分配机制进一步提升性能。模型支持多种推理格式(ONNX/TensorRT等),并具备自动锚框匹配和多尺度训练功能,使其在轻量化(yolov5s仅7MB)与高性能(最高51.2% mAP)间取得平衡,但缺乏正式论文支撑是

guoguozgw的博客 1805

C语言面试,8道一定会遇到的----关于指针的笔试题详解

C语言面试,8道一定会遇到的----关于指针的笔试题详解

m0_55322924的博客 463

《艾尔登法环》低技术 AI 揭秘:下推自动机如何实现高效战斗决策?

FromSoftware 在魂系列游戏中以多样且具挑战性的 NPC 战斗闻名,但其 AI 决策机制或许是“低技术”的。大部分代码用 Havok Script 编写,便于了解背后原理。需注意,以下内容非原创研究,是阅读他人提取、反编译和逆向工程的代码所得。

IT界那些事儿 36

GIS分析-利用K-Means方法进行地震分析

通过“聚类”可以获得有关我们所拥有的数据的各种线索,这是数据挖掘技术之一。分析创建的组有助于决策过程。在这项研究中,我们将使用数据挖掘工具之一的K-Means方法研究安纳托利亚东部地区近100年发生的地震的空间分布,并试图获得有用的信息,以供未来的研究使用。我从局地震目录页面获得了研究所需的地震数据,并从获得了区域边界数据。

gis收藏家的博客 1570

Lua FSM有限状态机的实现

转自https://www.cnblogs.com/SeaSwallow/p/7118676.html 最近做项目,因为要将游戏的代码基本全部改成lua的,对c#层面的东西基本只要unity的生命周期就可以了。刚开始接触lua,心痒痒,决定上网买了《Lua游戏AI开发指南》看看,决定实现一个fsm以便于在项目中使用。在这里贴出代码,其实代码都是直接抄这本书的。建议直接买书看,对于不想买书又想实现...

嘿嘿 2491

金融科技创新中人工智能的应用:8篇优质论文精选(含2023)

随着科技的飞速发展,金融领域正经历着前所未有的变革。在这个过程中,人工智能技术发挥着越来越重要的作用。为了深入探讨金融人工智能的研究和应用,享享特地整理了几篇金融人工智能方面的论文,大家可以看一下金融人工智能方向最新的研究成果!面向金融领域的大型语言模型本文介绍了BloombergGPT,一个基于广泛金融数据训练的500亿参数模型。基于彭博(Bloomberg)广泛数据来源,建立了一个基于彭博数据的3630亿令牌数据集,并结合了额外3450亿通用数据令牌。

2401_82426425的博客 3212

8台 × 8卡 910B NPU之顶尖大模型选型分析

本文对比了2026年主流大语言模型在昇腾910B NPU集群上的部署方案。重点评估了GLM5、MiniMax M2.5、Kimi K2.5、DeepSeek V3.2和Qwen 3.5旗舰版等候选模型,从部署需求(显存占用)、能力表现(基准测试、多模态支持)和NPU生态适配度三个维度进行分析。结果显示DeepSeek V3.2综合表现最优:支持BF16/W8A8/INT4量化,在4TB显存环境下可实现2000+ TPS,首token延迟<100ms,且具备官方NPU支持。备选方案Qwen 3.5旗舰版

FeelTouch Labs 756

LUA实现状态机

 如果完全以FP的方式使用LUA,那么似乎不必要使用状态机,相比于FP状态机就不是很优美的东东了:)。不过既然图灵他老人家创造了图灵机,LUA作为一门编程语言,自然也是图灵完备的那么出于对伟大先驱的尊敬,用状态机来解决问题自然也是义不容辞的了。      我们在用C/C++来实现状态机的时候,免不了要用某种代码生成的技术来产生状态迁移表(当然完全的SWITCH CASE也是可以的),用LU

caslwzgks的专栏 3977

国科大学习资料--机器学习方法与应用(叶齐祥)-期末考试题整理

国科大学习资料–机器学习方法与应用-期末考试题整理 ============================================================================================================================================================================================ =======================================

无名何许人的博客 2852

lua实现的有限状态机

在做的一个项目,由于人物的状态较多,切换比较麻烦不便管理,所以打算引入状态机,方便管理。下面是fsm的简易版本,还有些待完善的地方。        local inspect = require "inspect" local FSMState = {} function FSMState:new(super) local obj = super or {} obj.super = s

AdamWu's Blog 4910

WCK Operation (WCK 操作)

LPDDR6 SDRAM采用双时钟系统(WCK和CK),其中WCK频率是CK的两倍。为确保数据正确传输,需通过WCK2CK同步操作使两种时钟对齐。LPDDR6支持两种同步模式:Auto-sync off模式和WCK Always on模式,可通过MR22寄存器选择。同步操作由特定命令(Read/Write/MRR等)触发,需在满足特定时序参数(如tWCKENL、tWCKPRE等)后完成。同步前必须完成WCK2CK训练,且不同操作(读取/写入/CAS)有各自的时序要求。该机制确保数据在正确时钟相位下传输,是L

李家小院 650

uniapp - 实现扫码功能自定义扫描二维码/条码界面+手电筒轻触照亮+扫码屏幕添加手动输入框,手机扫描二维码并跳转过程,调用手机原生摄像头进行扫码且自动识别执行事件(uniApp安卓苹果App端)

uniapp,app端,安卓app,苹果ios,uniapp扫码识别,二维码展示和扫码,uniapp如何实现扫码功能,uni-app实现扫码功能,二维码和一维码/条码扫描,UniApp实现扫描二维码,uniapp开发原生app页面的扫码功能,自定义扫码界面,uniapp怎么调用扫一扫功能,app自定义扫码界面,uniapp 自定义扫一扫页面,扫码手电筒功能,自定义扫描框,扫码报错怎么办,扫码黑屏,扫一扫摄像头黑屏,uniapp扫码原生插件,最新扫码组件,连续扫码,uniapp APP扫码,扫码后如何处理跳转

✅ 精选推荐文章 1万+

lua数据结构原理,lua基础知识学习二

1.什么是lua数据结构原理 2.为什么要有lua数据结构原理 3.如何使用lua数据结构原理,使用lua数据结构原理的不同方案比较 4.lua数据结构源码实现 5.lua数据结构关键点,重要节点,疑难杂症场景 引用 如何深入理解Lua数据结构和内存占用? - 知乎 ...

u013617851的博客 4218

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【Lua进阶系列】全局状态机global_State

【Lua进阶系列】全局状态机global_State 大家好,我是Lampard~~ 欢迎来到Lua进阶系列的博客 前文再续,书接上一回。今天和大家讲解一下lua中的全局状态机global_State。 (一)什么是全局状态机global_State global_State 里面有对主线程的引用,有注册表管理所有全局数据,有全局字符串表,有内存管理函数,有GC 需要的把所有对象串联起来的相...

Lampard的博客 2742

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

带撤销的无限状态机-lua篇

核心就一个FSM(状态机),一个FSMState(状态)。 每个状态可以有一个父状态和无限个子状态。 具体实现可以参考下面代码 将附件的后缀该为.zip后,解压可获得到源码 require(“FSM”) require(“FSMState”) local fsm = FSM:New(“fsmName”) local idleState = FSMState:New(“idle”) local mo...

strivero的博客 1318

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

cocos2d-x lua 实现状态机

cocos2d-x lua 实现状态机version: cocos2d-x 3.60.状态机状态机主要分为2大类:第一类,若输出只和状态有关而与输入无关,则称为Moore状态机;第二类,输出不仅和状态有关而且和输入有关系,则称为Mealy状态机。

__一叶__的博客 1546
上一篇: 【Kotlin应用性能优化全攻略】:揭秘高效编码背后的5大核心技术
下一篇: 量子机器学习陷阱警示(90%初学者都会犯的3个致命错误)
普通网友
博客等级 码龄3年 606粉丝 2892原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值