排队的事件是否会中断onDrawFrame调用?

时间:2013-10-16 19:07:10

标签: java android rendering opengl-es-2.0

我即将开始在我的OpenGL ES 2.0游戏中为游戏逻辑奠定基础,而且我非常担心只有在完成渲染时才处理事件(主要是输入事件)。我不希望发生以下情况:

  1. 绘图开始,绘制了一些东西
  2. 事件中断绘图并导致逻辑更新
  3. 继续绘制不一致的逻辑
  4. 我仍然没有找到一个明确的答案:是或否。因为如果这样的代码:

        if(event.getAction() == MotionEvent.ACTION_DOWN){
                        mGLSurfaceView.queueEvent(new Runnable(){
                            @Override
                            public void run(){
                                triangleRenderer.handleTouchPress(normalizedX, normalizedY);
                            }
                        });
                    }
    

    不足以保证绘图和处理触摸事件总是顺序的,从不交错,然后我想我必须实现一些东西来存储然后处理“事件”。

1 个答案:

答案 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);
                        }
                    });
                }