跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
  • 世界
  • 用户
  • 群组
皮肤
  • 浅色
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • 深色
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(Flatly)
  • 不使用皮肤
折叠
品牌标识

一键科技

  1. 主页
  2. 键鼠助手5.0
  3. 键鼠助手 5.20 新增内置函数 GetUpTime():给宏脚本一个毫秒时钟(用法与示例)

键鼠助手 5.20 新增内置函数 GetUpTime():给宏脚本一个毫秒时钟(用法与示例)

已定时 已固定 已锁定 已移动 键鼠助手5.0
键鼠助手使用说明Lua脚本
1 帖子 1 发布者 14 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • A
    A
    admin
    编写于 最后由 编辑
    #1

    这篇说明 5.20 版本新增的内置函数 GetUpTime():宏脚本里第一个「读时间」的接口。
    它没有参数,返回设备开机以来经过的毫秒数,用来计量耗时、给动作做绝对时间对齐。

    相关: 键鼠助手 5.0 资源汇总:主程序 / 文档 / 配套工具下载

    一句话用法

    local t = GetUpTime()   -- 单位毫秒,整型;返回值一般只用来算差值
    

    接口说明

    函数 参数 返回值 说明
    GetUpTime() 无 整型 设备开机以来经过的毫秒数

    几点需要说清楚:

    • 不是「当前时间」:它是「开机以来的时长」,设备上电时从 0 开始,不表示几点几分,也不是时间戳。它的用途是算差值。
    • 单位是毫秒,返回值是整型:脚本里 math.type(GetUpTime()) 得到 integer,可以直接参与加减乘除与比较。
    • 分辨率 1 毫秒:设备内部按更细的步长计数,换算成毫秒时向下取整,所以相邻两次调用可能返回同一个值。
    • 不会溢出:毫秒计数是 64 位整数,连续开机到溢出需要以「亿年」计,正常使用无需关心。
    • 大小写不敏感:GetUpTime() 与 getuptime() 是同一个函数,和 IsKeyDown / iskeydown 的规则一致。
    • 它是「读时钟」,不是「等待」:调用本身几乎不耗时、不会阻塞宏;要等一段时间请用 Delay(毫秒)。

    在电脑上先调好再上机:两种环境的时间原点不同

    同一个 GetUpTime(),在两个地方跑,时间原点不一样:

    运行环境 时间原点 典型用途
    编辑器 →「脚本校验」 本次校验开始的时刻 在电脑上先确认脚本的节奏与耗时
    设备(真机) 设备本次上电的时刻 真实的宏执行计时

    所以不要跨环境比较绝对数值(电脑上的 1200 和真机上的 1200 不是一个起点),只比较同一个环境内的差值。

    用法一:测量一段宏的耗时

    取两次时间戳相减,就能知道中间这段动作真实花了多久 —— 排查「宏为什么比预期慢」时很有用。

    local t0 = GetUpTime()
    
    KeyTap("a")
    Delay(300)
    KeyTap("b")
    
    Log("这一段耗时 %d ms", GetUpTime() - t0)
    

    Log 的首个参数带 %d 时按 printf 格式化,数字会原样打印出来,便于对照。

    用法二:用绝对时间对齐,避免 Delay 累积误差

    连续多次 Delay(500) 时,每一步自身的执行耗时会让整体越走越慢,误差逐次累加。
    改用「目标时刻」判断,就能把每轮的落点重新拉回时间轴上:

    -- 执行 4 轮,每轮之间间隔 500ms,落点分别对齐到 500 / 1000 / 1500 / 2000ms
    local t0 = GetUpTime()
    for i = 1, 4 do
        KeyTap("f")
        local target = i * 500
        while GetUpTime() - t0 < target do
            Delay(10)   -- 小步让出,别用空转等待
        end
    end
    

    要点:等待循环里一定要有 Delay(小值),不要把 while 写成不带 Delay 的紧凑空转。

    用法三:把宏做成固定的节拍

    需要「每 1 秒做一件事、共 5 次」这类节奏时,用时间戳做判断比用 Delay 堆叠更稳:

    local last = GetUpTime()
    local count = 0
    while count < 5 do
        local now = GetUpTime()
        if now - last >= 1000 then
            last = last + 1000      -- 以理论落点累加,不丢节拍
            KeyTap("space")
            count = count + 1
        end
        Delay(10)
    end
    

    last = last + 1000(而不是 last = now)能让误差不累积:即使某轮判定晚了一点,下一轮的落点仍然回到原来的时间轴上。

    版本要求与兼容性

    组合 结果
    5.20 软件 + 配套固件 正常使用
    5.20 之前的软件 编译不通过:GetUpTime 会被当成未定义的函数
    5.20 软件 + 更早的固件 宏在设备上执行到该函数时会失败中断(不会静默返回 0)

    所以升级软件时,请把固件一并升到配套版本。软件与固件的版本对应关系,参考资源汇总帖里的说明。

    还是有问题?

    在本帖下回复,写清楚:软件版本(关于页的 Software version)+ 固件版本 + 你脚本里调用 GetUpTime() 的那几行 + 现象。

    1 条回复 最后回复
    0

    你好!看起来您对这段对话很感兴趣,但您还没有一个账号。

    厌倦了每次访问都刷到同样的帖子?您注册账号后,您下次访问时都将自动回到上次浏览的位置,并可选择接收新回复的通知(通过电子邮件或推送通知)。您还可以收藏帖子、为帖子点赞,以此向其他社区成员表达您的感谢。

    有了你的建议,这篇帖子会更精彩哦 💗

    注册 登录
    回复
    • 在新帖中回复
    登录后回复
    • 从旧到新
    • 从新到旧
    • 最多赞同


    粤ICP备2023136510号-1
    • 登录

    • 没有帐号? 注册

    • 登录或注册以进行搜索。
    Powered by NodeBB Contributors
    • 第一个帖子
      最后一个帖子
    0
    • 版块
    • 最新
    • 标签
    • 热门
    • 世界
    • 用户
    • 群组