You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LibGDX如何获取精度约1ms的精确触摸时间?有哪些可行实现方案?

LibGDX 1ms精度触摸时间获取方案

自带接口局限性说明

  • LibGDX的输入事件采用帧同步批量处理机制,InputProcessor的所有回调都会集中在每帧渲染周期的固定节点触发,因此回调附带的时间戳最小精度等于单帧时长,60fps下就是16.7ms,无法满足高精度需求。
  • Gdx.input.getCurrentEventTime()返回的是事件进入LibGDX处理队列时的时间戳,不是硬件触发的原始时间,同样存在帧级延迟误差,达不到1ms精度要求。

安卓层面低成本实现方案

该方案不需要修改LibGDX源码,也不会破坏原有输入逻辑,仅需要修改安卓端启动类即可实现:

实现步骤

  1. 重写安卓启动类的onTouchEvent方法,获取系统原始触摸事件
    安卓系统分发的MotionEvent自带的getEventTime()方法直接返回输入子系统记录的硬件触摸触发时间,精度可达纳秒级,换算为毫秒后误差小于1ms,完全满足需求。
  2. 跨线程传递原始时间戳
    因为安卓触摸事件运行在UI线程,LibGDX渲染逻辑运行在独立GL线程,需要用线程安全的方式存储时间戳,供核心层逻辑读取。
  3. 保留原有LibGDX输入处理
    记录完时间戳后直接调用父类的onTouchEvent实现,原有InputProcessor的所有回调都会正常触发,不会影响原有逻辑。

代码示例

安卓启动类实现

import android.os.Bundle;
import android.view.MotionEvent;
import com.badlogic.gdx.backends.android.AndroidApplication;
import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration;

public class AndroidLauncher extends AndroidApplication {
    // 线程安全存储最新触摸事件原始时间戳,单位为毫秒
    public static volatile long lastTouchRawTimeMs;

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // 记录硬件触发的原始时间
        lastTouchRawTimeMs = event.getEventTime();
        // 交给LibGDX原有逻辑处理输入,不影响现有功能
        return super.onTouchEvent(event);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
        initialize(new YourMainGameClass(), config);
    }
}

核心逻辑调用

import com.badlogic.gdx.Game;
import com.badlogic.gdx.InputProcessor;
import com.badlogic.gdx.Gdx;

public class YourMainGameClass extends Game implements InputProcessor {
    @Override
    public void create() {
        // 注册输入处理器
        Gdx.input.setInputProcessor(this);
    }

    @Override
    public boolean touchDown(int screenX, int screenY, int pointer, int button) {
        // 直接读取安卓层记录的高精度时间戳即可
        long accurateTouchTime = AndroidLauncher.lastTouchRawTimeMs;
        // 你的业务逻辑,比如计算反应时间等
        return true;
    }

    // 其他InputProcessor方法保持原有实现即可
}

扩展说明

  • 如果需要区分触摸事件类型(按下、抬起、滑动)或者处理多点触摸,可以在安卓层根据event.getAction()、event.getPointerId()分类存储不同事件的时间戳,或者维护一个线程安全的事件队列,核心层按顺序读取即可。
  • 该方案仅修改安卓端代码,核心逻辑和其他平台(iOS、桌面端)的代码完全不需要调整,不会破坏跨平台兼容性。

内容的提问来源于stack exchange,提问作者Jaggie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 07:24:03