我即将开始在我的OpenGL ES 2.0游戏中为游戏逻辑奠定基础,而且我非常担心只有在完成渲染时才处理事件(主要是输入事件)。我不希望发生以下情况:
我仍然没有找到一个明确的答案:是或否。因为如果这样的代码:
if(event.getAction() == MotionEvent.ACTION_DOWN){
mGLSurfaceView.queueEvent(new Runnable(){
@Override
public void run(){
triangleRenderer.handleTouchPress(normalizedX, normalizedY);
}
});
}
不足以保证绘图和处理触摸事件总是顺序的,从不交错,然后我想我必须实现一些东西来存储然后处理“事件”。
答案 0 :(得分:0)
我做了一些测试,现在我很确定事件永远不会中断Renderer的绘制调用,而是在这些绘制调用之间传递。
我在onDrawFrame中使用了一个2000 x 1ms = 2s的总睡眠循环,同时记录事件到达GLSurfaceView的那一刻以及Renderer的事件处理程序被触发的那一刻。
它确实看起来很安全 - 虽然有点滑稽:我在SurfaceView中的日志代码,在queueEvent之前放置,总是被称为双倍:首先是触摸时,然后是在触发Renderer的事件处理程序之前。
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);
}
});
}