LibGDX如何获取精度约1ms的精确触摸时间?有哪些可行实现方案?
LibGDX 1ms精度触摸时间获取方案
自带接口局限性说明
- LibGDX的输入事件采用帧同步批量处理机制,
InputProcessor的所有回调都会集中在每帧渲染周期的固定节点触发,因此回调附带的时间戳最小精度等于单帧时长,60fps下就是16.7ms,无法满足高精度需求。 Gdx.input.getCurrentEventTime()返回的是事件进入LibGDX处理队列时的时间戳,不是硬件触发的原始时间,同样存在帧级延迟误差,达不到1ms精度要求。
安卓层面低成本实现方案
该方案不需要修改LibGDX源码,也不会破坏原有输入逻辑,仅需要修改安卓端启动类即可实现:
实现步骤
- 重写安卓启动类的
onTouchEvent方法,获取系统原始触摸事件
安卓系统分发的MotionEvent自带的getEventTime()方法直接返回输入子系统记录的硬件触摸触发时间,精度可达纳秒级,换算为毫秒后误差小于1ms,完全满足需求。 - 跨线程传递原始时间戳
因为安卓触摸事件运行在UI线程,LibGDX渲染逻辑运行在独立GL线程,需要用线程安全的方式存储时间戳,供核心层逻辑读取。 - 保留原有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
相关产品推荐
相关产品推荐

