Java 排队事件能否中断onDrawFrame调用?
我即将开始在我的OpenGL ES 2.0游戏中为游戏逻辑奠定基础,我非常关心只有在完成渲染后才处理事件(主要是输入事件)。我不希望发生以下情况:Java 排队事件能否中断onDrawFrame调用?,java,android,rendering,opengl-es-2.0,Java,Android,Rendering,Opengl Es 2.0,我即将开始在我的OpenGL ES 2.0游戏中为游戏逻辑奠定基础,我非常关心只有在完成渲染后才处理事件(主要是输入事件)。我不希望发生以下情况: 画画开始了,有些东西画出来了 事件会中断图形并导致逻辑更新 继续绘制,逻辑不一致 我仍然没有找到一个明确的答案:是或否。因为如果这种代码: if(event.getAction() == MotionEvent.ACTION_DOWN){ mGLSurfaceView.queueEvent(new Ru
if(event.getAction() == MotionEvent.ACTION_DOWN){
mGLSurfaceView.queueEvent(new Runnable(){
@Override
public void run(){
triangleRenderer.handleTouchPress(normalizedX, normalizedY);
}
});
}
不足以保证绘制和处理触摸事件始终是连续的,从不交错,那么我想我必须实现一些东西来存储和处理“事件”。我做了一些测试,现在我非常确定事件不会中断渲染器的绘制调用,并且在这些绘制调用之间传递 我在onDrawFrame中使用了一个2000 x 1ms=2s的总睡眠循环,同时记录了事件到达GLSurfaceView的时刻和渲染器的事件处理程序被触发的时刻 它看起来确实是线程安全的——虽然有点滑稽:我在SurfaceView中的日志代码放在queueEvent之前,总是被双重调用:首先是在触摸的时候,然后是在触发渲染器的事件处理程序之前
if (event.getAction() == MotionEvent.ACTION_DOWN)
{
long tmp = System.nanoTime() / 1000000;
Log.w("EVENT", "SurfaceView " + tmp); // executed doubly! funny stuff.
queueEvent(new Runnable()
{
@Override
public void run()
{
gameRenderer.handleTouchPress(normalizedX, normalizedY);
}
});
}
我检查了当您直接调用渲染器的方法(没有queueEvent)时会发生什么,这是不好的。显然,它是来自另一个线程的方法调用,并且是纯异步的。一点也不在乎画画。